[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