diff options
Diffstat (limited to 'contrib/llvm/lib/Target/Hexagon/HexagonHardwareLoops.cpp')
-rw-r--r-- | contrib/llvm/lib/Target/Hexagon/HexagonHardwareLoops.cpp | 26 |
1 files changed, 13 insertions, 13 deletions
diff --git a/contrib/llvm/lib/Target/Hexagon/HexagonHardwareLoops.cpp b/contrib/llvm/lib/Target/Hexagon/HexagonHardwareLoops.cpp index e477dcc..86a8089 100644 --- a/contrib/llvm/lib/Target/Hexagon/HexagonHardwareLoops.cpp +++ b/contrib/llvm/lib/Target/Hexagon/HexagonHardwareLoops.cpp @@ -100,6 +100,7 @@ namespace { MachineRegisterInfo *MRI; MachineDominatorTree *MDT; const HexagonInstrInfo *TII; + const HexagonRegisterInfo *TRI; #ifndef NDEBUG static int Counter; #endif @@ -381,7 +382,9 @@ bool HexagonHardwareLoops::runOnMachineFunction(MachineFunction &MF) { MLI = &getAnalysis<MachineLoopInfo>(); MRI = &MF.getRegInfo(); MDT = &getAnalysis<MachineDominatorTree>(); - TII = MF.getSubtarget<HexagonSubtarget>().getInstrInfo(); + const HexagonSubtarget &HST = MF.getSubtarget<HexagonSubtarget>(); + TII = HST.getInstrInfo(); + TRI = HST.getRegisterInfo(); for (auto &L : *MLI) if (!L->getParentLoop()) { @@ -960,24 +963,21 @@ CountValue *HexagonHardwareLoops::computeCount(MachineLoop *Loop, /// \brief Return true if the operation is invalid within hardware loop. bool HexagonHardwareLoops::isInvalidLoopOperation(const MachineInstr *MI, bool IsInnerHWLoop) const { - // Call is not allowed because the callee may use a hardware loop except for // the case when the call never returns. if (MI->getDesc().isCall()) return !TII->doesNotReturn(*MI); // Check if the instruction defines a hardware loop register. - for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) { - const MachineOperand &MO = MI->getOperand(i); - if (!MO.isReg() || !MO.isDef()) - continue; - unsigned R = MO.getReg(); - if (IsInnerHWLoop && (R == Hexagon::LC0 || R == Hexagon::SA0 || - R == Hexagon::LC1 || R == Hexagon::SA1)) - return true; - if (!IsInnerHWLoop && (R == Hexagon::LC1 || R == Hexagon::SA1)) + using namespace Hexagon; + static const unsigned Regs01[] = { LC0, SA0, LC1, SA1 }; + static const unsigned Regs1[] = { LC1, SA1 }; + auto CheckRegs = IsInnerHWLoop ? makeArrayRef(Regs01, array_lengthof(Regs01)) + : makeArrayRef(Regs1, array_lengthof(Regs1)); + for (unsigned R : CheckRegs) + if (MI->modifiesRegister(R, TRI)) return true; - } + return false; } @@ -1511,7 +1511,7 @@ bool HexagonHardwareLoops::checkForImmediate(const MachineOperand &MO, int64_t V1, V2; if (!checkForImmediate(S1, V1) || !checkForImmediate(S2, V2)) return false; - TV = V2 | (V1 << 32); + TV = V2 | (static_cast<uint64_t>(V1) << 32); break; } case TargetOpcode::REG_SEQUENCE: { |