diff options
Diffstat (limited to 'llvm/lib/Target/Hexagon')
| -rw-r--r-- | llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCInstrInfo.cpp | 22 |
1 files changed, 14 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); |

