diff options
-rw-r--r-- | llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCInstrInfo.cpp | 22 | ||||
-rw-r--r-- | llvm/test/MC/Hexagon/tprel_noextend.s | 8 |
2 files changed, 22 insertions, 8 deletions
diff --git a/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCInstrInfo.cpp b/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCInstrInfo.cpp index 220db3a9a82..bfd4e5f54f8 100644 --- a/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCInstrInfo.cpp +++ b/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCInstrInfo.cpp @@ -21,6 +21,7 @@ #include "llvm/MC/MCExpr.h" #include "llvm/MC/MCInstrInfo.h" #include "llvm/MC/MCSubtargetInfo.h" +#include "llvm/MC/MCValue.h" namespace llvm { void HexagonMCInstrInfo::addConstant(MCInst &MI, uint64_t Value, @@ -426,19 +427,24 @@ bool HexagonMCInstrInfo::isConstExtended(MCInstrInfo const &MCII, (MCI.getOpcode() != Hexagon::C4_addipc)) return false; - // We could be using an instruction with an extendable immediate and shoehorn - // a global address into it. If it is a global address it will be constant - // extended. We do this for COMBINE. - // We currently only handle isGlobal() because it is the only kind of - // object we are going to end up with here for now. - // In the future we probably should add isSymbol(), etc. assert(!MO.isImm()); if (isa<HexagonMCExpr>(MO.getExpr()) && HexagonMCInstrInfo::mustNotExtend(*MO.getExpr())) return false; int64_t Value; - if (!MO.getExpr()->evaluateAsAbsolute(Value)) - return true; + if (!MO.getExpr()->evaluateAsAbsolute(Value)) { + MCValue Value; + if (!MO.getExpr()->evaluateAsRelocatable(Value, nullptr, nullptr)) + return true; + switch(Value.getAccessVariant()) { + case MCSymbolRefExpr::VariantKind::VK_TPREL: + case MCSymbolRefExpr::VariantKind::VK_DTPREL: + // Don't lazy extend these expression variants + return false; + default: + return true; + } + } int MinValue = HexagonMCInstrInfo::getMinValue(MCII, MCI); int MaxValue = HexagonMCInstrInfo::getMaxValue(MCII, MCI); return (MinValue > Value || Value > MaxValue); diff --git a/llvm/test/MC/Hexagon/tprel_noextend.s b/llvm/test/MC/Hexagon/tprel_noextend.s new file mode 100644 index 00000000000..0bc17c6ce57 --- /dev/null +++ b/llvm/test/MC/Hexagon/tprel_noextend.s @@ -0,0 +1,8 @@ +# RUN: llvm-mc -arch=hexagon -filetype=obj %s | llvm-objdump -d - | FileCheck %s +# + +# CHECK-NOT: immext +r0 = #undefined@TPREL + +# CHECK-NOT: immext +r0 = #undefined@DTPREL |