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 { _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits