From 8038dad7dbdf456adbdc2151045acfd9efb86736 Mon Sep 17 00:00:00 2001 From: Krzysztof Parzyszek Date: Fri, 23 Mar 2018 20:41:44 +0000 Subject: [PATCH] [Hexagon] Correct update of instruction offet in HW loop fixup llvm-svn: 328366 --- llvm/lib/Target/Hexagon/HexagonFixupHwLoops.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/llvm/lib/Target/Hexagon/HexagonFixupHwLoops.cpp b/llvm/lib/Target/Hexagon/HexagonFixupHwLoops.cpp index a842b67..a6b9bcb 100644 --- a/llvm/lib/Target/Hexagon/HexagonFixupHwLoops.cpp +++ b/llvm/lib/Target/Hexagon/HexagonFixupHwLoops.cpp @@ -20,6 +20,7 @@ #include "llvm/CodeGen/MachineInstrBuilder.h" #include "llvm/CodeGen/Passes.h" #include "llvm/CodeGen/TargetInstrInfo.h" +#include "llvm/Support/MathExtras.h" #include "llvm/PassSupport.h" using namespace llvm; @@ -137,7 +138,7 @@ bool HexagonFixupHwLoops::fixupLoopInstrs(MachineFunction &MF) { MachineBasicBlock::iterator MII = MBB.begin(); MachineBasicBlock::iterator MIE = MBB.end(); while (MII != MIE) { - InstOffset += HII->getSize(*MII); + unsigned InstSize = HII->getSize(*MII); if (MII->isMetaInstruction()) { ++MII; continue; @@ -145,8 +146,10 @@ bool HexagonFixupHwLoops::fixupLoopInstrs(MachineFunction &MF) { if (isHardwareLoop(*MII)) { assert(MII->getOperand(0).isMBB() && "Expect a basic block as loop operand"); - int diff = InstOffset - BlockToInstOffset[MII->getOperand(0).getMBB()]; - if ((unsigned)abs(diff) > MaxLoopRange) { + MachineBasicBlock *TargetBB = MII->getOperand(0).getMBB(); + unsigned Diff = AbsoluteDifference(InstOffset, + BlockToInstOffset[TargetBB]); + if (Diff > MaxLoopRange) { useExtLoopInstr(MF, MII); MII = MBB.erase(MII); Changed = true; @@ -156,6 +159,7 @@ bool HexagonFixupHwLoops::fixupLoopInstrs(MachineFunction &MF) { } else { ++MII; } + InstOffset += InstSize; } } -- 2.7.4