Correctly propagate thread-local flag from aliasee to alias. This fixes PR2137
authorAnton Korobeynikov <asl@math.spbu.ru>
Tue, 11 Mar 2008 22:38:53 +0000 (22:38 +0000)
committerAnton Korobeynikov <asl@math.spbu.ru>
Tue, 11 Mar 2008 22:38:53 +0000 (22:38 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@48257 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/SelectionDAG/SelectionDAG.cpp
lib/Target/X86/X86ATTAsmPrinter.cpp

index 59fd79650a0f36131c0753351c52ea6187e02a6e..6e15318a16a977e4428fc754ac5d7e621440b203 100644 (file)
@@ -13,6 +13,7 @@
 
 #include "llvm/CodeGen/SelectionDAG.h"
 #include "llvm/Constants.h"
+#include "llvm/GlobalAlias.h"
 #include "llvm/GlobalVariable.h"
 #include "llvm/Intrinsics.h"
 #include "llvm/DerivedTypes.h"
@@ -814,12 +815,20 @@ SDOperand SelectionDAG::getConstantFP(double Val, MVT::ValueType VT,
 SDOperand SelectionDAG::getGlobalAddress(const GlobalValue *GV,
                                          MVT::ValueType VT, int Offset,
                                          bool isTargetGA) {
-  const GlobalVariable *GVar = dyn_cast<GlobalVariable>(GV);
   unsigned Opc;
+
+  const GlobalVariable *GVar = dyn_cast<GlobalVariable>(GV);
+  if (!GVar) {
+    // If GV is an alias - use aliasee for determing thread-localness
+    if (const GlobalAlias *GA = dyn_cast<GlobalAlias>(GV))
+      GVar = dyn_cast_or_null<GlobalVariable>(GA->resolveAliasedGlobal());
+  }
+
   if (GVar && GVar->isThreadLocal())
     Opc = isTargetGA ? ISD::TargetGlobalTLSAddress : ISD::GlobalTLSAddress;
   else
     Opc = isTargetGA ? ISD::TargetGlobalAddress : ISD::GlobalAddress;
+
   FoldingSetNodeID ID;
   AddNodeIDNode(ID, Opc, getVTList(VT), 0, 0);
   ID.AddPointer(GV);
index b9770fef1826938d8c40dd9c347cd238895037dd..4fef3827e3f8516241faab27c1c15cb56996e221 100644 (file)
@@ -279,8 +279,14 @@ void X86ATTAsmPrinter::printOperand(const MachineInstr *MI, unsigned OpNo,
     bool isMemOp  = Modifier && !strcmp(Modifier, "mem");
     bool needCloseParen = false;
 
-    GlobalValue *GV = MO.getGlobal();
-    GlobalVariable *GVar = dyn_cast<GlobalVariable>(GV);
+    const GlobalValue *GV = MO.getGlobal();
+    const GlobalVariable *GVar = dyn_cast<GlobalVariable>(GV);
+    if (!GVar) {
+      // If GV is an alias - use aliasee for determing thread-localness
+      if (const GlobalAlias *GA = dyn_cast<GlobalAlias>(GV))
+        GVar = dyn_cast_or_null<GlobalVariable>(GA->resolveAliasedGlobal());
+    }
+
     bool isThreadLocal = GVar && GVar->isThreadLocal();
 
     std::string Name = Mang->getValueName(GV);