OSDN Git Service

[Hexagon] As a size optimization, not lazy extending TPREL or DTPREL variants since...
authorColin LeMahieu <colinl@codeaurora.org>
Mon, 29 Feb 2016 21:21:56 +0000 (21:21 +0000)
committerColin LeMahieu <colinl@codeaurora.org>
Mon, 29 Feb 2016 21:21:56 +0000 (21:21 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@262258 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/Hexagon/MCTargetDesc/HexagonMCInstrInfo.cpp
test/MC/Hexagon/tprel_noextend.s [new file with mode: 0644]

index 220db3a..bfd4e5f 100644 (file)
@@ -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/test/MC/Hexagon/tprel_noextend.s b/test/MC/Hexagon/tprel_noextend.s
new file mode 100644 (file)
index 0000000..0bc17c6
--- /dev/null
@@ -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