[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp

Duncan Sands baldrick at free.fr
Fri May 4 10:12:53 PDT 2007



Changes in directory llvm/lib/CodeGen/SelectionDAG:

SelectionDAGISel.cpp updated: 1.446 -> 1.447
---
Log message:

A bitcast of a global variable may have been constant folded to a GEP -
handle this case too.


---
Diffs of the changes:  (+30 -26)

 SelectionDAGISel.cpp |   56 +++++++++++++++++++++++++++------------------------
 1 files changed, 30 insertions(+), 26 deletions(-)


Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.446 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.447
--- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.446	Wed May  2 20:11:53 2007
+++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp	Fri May  4 12:12:26 2007
@@ -2457,6 +2457,24 @@
   }
 }
 
+/// ExtractGlobalVariable - If C is a global variable, or a bitcast of one
+/// (possibly constant folded), return it.  Otherwise return NULL.
+static GlobalVariable *ExtractGlobalVariable (Constant *C) {
+  if (GlobalVariable *GV = dyn_cast<GlobalVariable>(C))
+    return GV;
+  else if (ConstantExpr *CE = dyn_cast<ConstantExpr>(C)) {
+    if (CE->getOpcode() == Instruction::BitCast)
+      return dyn_cast<GlobalVariable>(CE->getOperand(0));
+    else if (CE->getOpcode() == Instruction::GetElementPtr) {
+      for (unsigned i = 1, e = CE->getNumOperands(); i != e; ++i)
+        if (!CE->getOperand(i)->isNullValue())
+          return NULL;
+      return dyn_cast<GlobalVariable>(CE->getOperand(0));
+    }
+  }
+  return NULL;
+}
+
 /// visitIntrinsicCall - Lower the call to the specified intrinsic function.  If
 /// we want to emit this as a call to a named external function, return the name
 /// otherwise lower it and return null.
@@ -2610,20 +2628,12 @@
       // MachineModuleInfo.
       std::vector<GlobalVariable *> TyInfo;
       for (unsigned i = 3, N = I.getNumOperands(); i < N; ++i) {
-        Constant *C = cast<Constant>(I.getOperand(i));
-        if (GlobalVariable *GV = dyn_cast<GlobalVariable>(C)) {
-          TyInfo.push_back(GV);
-        } else if (ConstantExpr *CE = dyn_cast<ConstantExpr>(C)) {
-          assert(CE->getOpcode() == Instruction::BitCast &&
-                 isa<GlobalVariable>(CE->getOperand(0))
-                 && "TypeInfo must be a global variable or NULL");
-          TyInfo.push_back(cast<GlobalVariable>(CE->getOperand(0)));
-        } else {
-          ConstantInt *CI = dyn_cast<ConstantInt>(C);
-          assert(CI && CI->isNullValue() &&
-                 "TypeInfo must be a global variable or NULL");
-          TyInfo.push_back(NULL);
-        }
+	Constant *C = cast<Constant>(I.getOperand(i));
+        GlobalVariable *GV = ExtractGlobalVariable(C);
+        assert (GV || (isa<ConstantInt>(C) &&
+                       cast<ConstantInt>(C)->isNullValue()) &&
+                "TypeInfo must be a global variable or NULL");
+        TyInfo.push_back(GV);
       }
       MMI->addCatchTypeInfo(CurMBB, TyInfo);
       
@@ -2651,18 +2661,12 @@
     
     if (MMI) {
       // Find the type id for the given typeinfo.
-      GlobalVariable *GV = NULL;
-      ConstantExpr *CE = dyn_cast<ConstantExpr>(I.getOperand(1));
-      if (CE && CE->getOpcode() == Instruction::BitCast &&
-          isa<GlobalVariable>(CE->getOperand(0))) {
-        GV = cast<GlobalVariable>(CE->getOperand(0));
-      } else {
-        ConstantInt *CI = dyn_cast<ConstantInt>(I.getOperand(1));
-        assert(CI && CI->getZExtValue() == 0 &&
-          "TypeInfo must be a global variable typeinfo or NULL");
-        GV = NULL;
-      }
-      
+      Constant *C = cast<Constant>(I.getOperand(1));
+      GlobalVariable *GV = ExtractGlobalVariable(C);
+      assert (GV || (isa<ConstantInt>(C) &&
+                     cast<ConstantInt>(C)->isNullValue()) &&
+              "TypeInfo must be a global variable or NULL");
+
       unsigned TypeID = MMI->getTypeIDFor(GV);
       setValue(&I, DAG.getConstant(TypeID, MVT::i32));
     } else {






More information about the llvm-commits mailing list