diff options
Diffstat (limited to 'lib/Target/Hexagon/HexagonOptAddrMode.cpp')
| -rw-r--r-- | lib/Target/Hexagon/HexagonOptAddrMode.cpp | 37 | 
1 files changed, 21 insertions, 16 deletions
diff --git a/lib/Target/Hexagon/HexagonOptAddrMode.cpp b/lib/Target/Hexagon/HexagonOptAddrMode.cpp index 29c044b3b7295..c3a5bd5d57bfe 100644 --- a/lib/Target/Hexagon/HexagonOptAddrMode.cpp +++ b/lib/Target/Hexagon/HexagonOptAddrMode.cpp @@ -502,7 +502,8 @@ bool HexagonOptAddrMode::changeLoad(MachineInstr *OldMI, MachineOperand ImmOp,        MIB.add(ImmOp);        OpStart = 4;        Changed = true; -    } else if (HII->getAddrMode(*OldMI) == HexagonII::BaseImmOffset) { +    } else if (HII->getAddrMode(*OldMI) == HexagonII::BaseImmOffset && +               OldMI->getOperand(2).isImm()) {        short NewOpCode = HII->changeAddrMode_io_abs(*OldMI);        assert(NewOpCode >= 0 && "Invalid New opcode\n");        MIB = BuildMI(*BB, InsertPt, OldMI->getDebugLoc(), HII->get(NewOpCode)) @@ -518,17 +519,19 @@ bool HexagonOptAddrMode::changeLoad(MachineInstr *OldMI, MachineOperand ImmOp,      LLVM_DEBUG(dbgs() << "[Changing]: " << *OldMI << "\n");      LLVM_DEBUG(dbgs() << "[TO]: " << *MIB << "\n"); -  } else if (ImmOpNum == 2 && OldMI->getOperand(3).getImm() == 0) { -    short NewOpCode = HII->changeAddrMode_rr_io(*OldMI); -    assert(NewOpCode >= 0 && "Invalid New opcode\n"); -    MIB = BuildMI(*BB, InsertPt, OldMI->getDebugLoc(), HII->get(NewOpCode)); -    MIB.add(OldMI->getOperand(0)); -    MIB.add(OldMI->getOperand(1)); -    MIB.add(ImmOp); -    OpStart = 4; -    Changed = true; -    LLVM_DEBUG(dbgs() << "[Changing]: " << *OldMI << "\n"); -    LLVM_DEBUG(dbgs() << "[TO]: " << *MIB << "\n"); +  } else if (ImmOpNum == 2) { +    if (OldMI->getOperand(3).isImm() && OldMI->getOperand(3).getImm() == 0) { +      short NewOpCode = HII->changeAddrMode_rr_io(*OldMI); +      assert(NewOpCode >= 0 && "Invalid New opcode\n"); +      MIB = BuildMI(*BB, InsertPt, OldMI->getDebugLoc(), HII->get(NewOpCode)); +      MIB.add(OldMI->getOperand(0)); +      MIB.add(OldMI->getOperand(1)); +      MIB.add(ImmOp); +      OpStart = 4; +      Changed = true; +      LLVM_DEBUG(dbgs() << "[Changing]: " << *OldMI << "\n"); +      LLVM_DEBUG(dbgs() << "[TO]: " << *MIB << "\n"); +    }    }    if (Changed) @@ -758,11 +761,13 @@ bool HexagonOptAddrMode::processBlock(NodeAddr<BlockNode *> BA) {        // This could happen, for example, when DefR = R4, but the used        // register is D2. +      // Change UseMI if replacement is possible. If any replacement failed, +      // or wasn't attempted, make sure to keep the TFR. +      bool Xformed = false;        if (UseMOnum >= 0 && InstrEvalResult[UseMI]) -        // Change UseMI if replacement is possible. -        Changed |= xformUseMI(MI, UseMI, UseN, UseMOnum); -      else -        KeepTfr = true; +        Xformed = xformUseMI(MI, UseMI, UseN, UseMOnum); +      Changed |=  Xformed; +      KeepTfr |= !Xformed;      }      if (!KeepTfr)        Deleted.insert(MI);  | 
