diff --git a/llvm/lib/Target/Hexagon/HexagonBranchRelaxation.cpp b/llvm/lib/Target/Hexagon/HexagonBranchRelaxation.cpp index 84af4b14b9f7..3e6420c671f9 100644 --- a/llvm/lib/Target/Hexagon/HexagonBranchRelaxation.cpp +++ b/llvm/lib/Target/Hexagon/HexagonBranchRelaxation.cpp @@ -114,8 +114,12 @@ void HexagonBranchRelaxation::computeOffset(MachineFunction &MF, InstOffset = (InstOffset + ByteAlign) & ~(ByteAlign); } OffsetMap[&B] = InstOffset; - for (auto &MI : B.instrs()) + for (auto &MI : B.instrs()) { InstOffset += HII->getSize(MI); + // Assume that all extendable branches will be extended. + if (MI.isBranch() && HII->isExtendable(MI)) + InstOffset += HEXAGON_INSTR_SIZE; + } } } @@ -145,6 +149,9 @@ bool HexagonBranchRelaxation::isJumpOutOfRange(MachineInstr &MI, if (FirstTerm == B.instr_end()) return false; + if (HII->isExtended(MI)) + return false; + unsigned InstOffset = BlockToInstOffset[&B]; unsigned Distance = 0;