[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Jim Laskey
jlaskey at apple.com
Thu Feb 22 07:38:22 PST 2007
Changes in directory llvm/lib/CodeGen/SelectionDAG:
SelectionDAGISel.cpp updated: 1.370 -> 1.371
---
Log message:
Handle lowering invoke to call correctly.
---
Diffs of the changes: (+97 -95)
SelectionDAGISel.cpp | 192 +++++++++++++++++++++++++--------------------------
1 files changed, 97 insertions(+), 95 deletions(-)
Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.370 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.371
--- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.370 Wed Feb 21 16:53:45 2007
+++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Thu Feb 22 09:38:06 2007
@@ -484,7 +484,8 @@
unsigned Opc);
bool isExportableFromCurrentBlock(Value *V, const BasicBlock *FromBB);
void ExportFromCurrentBlock(Value *V);
-
+ void LowerCallTo(CallInst &I, SDOperand Callee, unsigned OpIdx);
+
// Terminator instructions.
void visitRet(ReturnInst &I);
void visitBr(BranchInst &I);
@@ -1117,17 +1118,7 @@
DAG.setRoot(DAG.getNode(ISD::LABEL, MVT::Other, getRoot(),
DAG.getConstant(BeginLabel, MVT::i32)));
- // Insert a normal call instruction.
- std::vector<Value*> Args;
- for (InvokeInst::op_iterator OI = I.op_begin() + 3, E = I.op_end();
- OI != E; ++OI) {
- Args.push_back(*OI);
- }
- CallInst *NewCall = new CallInst(I.getCalledValue(), &Args[0], Args.size(),
- I.getName(), &I);
- NewCall->setCallingConv(I.getCallingConv());
- I.replaceAllUsesWith(NewCall);
- visitCall(*NewCall);
+ LowerCallTo((CallInst&)I, getValue(I.getOperand(0)), 3);
// Insert a label before the invoke call to mark the try range.
// This can be used to detect deletion of the invoke via the
@@ -2086,84 +2077,87 @@
case Intrinsic::eh_exception: {
MachineModuleInfo *MMI = DAG.getMachineModuleInfo();
- // Add a label to mark the beginning of the landing pad. Deletion of the
- // landing pad can thus be detected via the MachineModuleInfo.
- unsigned LabelID = MMI->addLandingPad(CurMBB);
- DAG.setRoot(DAG.getNode(ISD::LABEL, MVT::Other, DAG.getEntryNode(),
- DAG.getConstant(LabelID, MVT::i32)));
-
- // Mark exception register as live in.
- const MRegisterInfo *MRI = DAG.getTarget().getRegisterInfo();
- unsigned Reg = MRI->getEHExceptionRegister();
- if (Reg) CurMBB->addLiveIn(Reg);
-
- // Insert the EXCEPTIONADDR instruction.
- SDVTList VTs = DAG.getVTList(TLI.getPointerTy(), MVT::Other);
- SDOperand Ops[1];
- Ops[0] = DAG.getRoot();
- SDOperand Op = DAG.getNode(ISD::EXCEPTIONADDR, VTs, Ops, 1);
- setValue(&I, Op);
- DAG.setRoot(Op.getValue(1));
-
+ if (MMI) {
+ // Add a label to mark the beginning of the landing pad. Deletion of the
+ // landing pad can thus be detected via the MachineModuleInfo.
+ unsigned LabelID = MMI->addLandingPad(CurMBB);
+ DAG.setRoot(DAG.getNode(ISD::LABEL, MVT::Other, DAG.getEntryNode(),
+ DAG.getConstant(LabelID, MVT::i32)));
+
+ // Mark exception register as live in.
+ unsigned Reg = TLI.getExceptionAddressRegister();
+ if (Reg) CurMBB->addLiveIn(Reg);
+
+ // Insert the EXCEPTIONADDR instruction.
+ SDVTList VTs = DAG.getVTList(TLI.getPointerTy(), MVT::Other);
+ SDOperand Ops[1];
+ Ops[0] = DAG.getRoot();
+ SDOperand Op = DAG.getNode(ISD::EXCEPTIONADDR, VTs, Ops, 1);
+ setValue(&I, Op);
+ DAG.setRoot(Op.getValue(1));
+ }
return 0;
}
case Intrinsic::eh_handlers: {
MachineModuleInfo *MMI = DAG.getMachineModuleInfo();
- // Inform the MachineModuleInfo of the personality for this landing pad.
- if (ConstantExpr *CE = dyn_cast<ConstantExpr>(I.getOperand(2))) {
- if (CE->getOpcode() == Instruction::BitCast) {
- MMI->addPersonality(CurMBB,
- cast<Function>(CE->getOperand(0)));
- }
- }
-
- // Gather all the type infos for this landing pad and pass them along to
- // MachineModuleInfo.
- std::vector<GlobalVariable *> TyInfo;
- for (unsigned i = 3, N = I.getNumOperands(); i < N; ++i) {
- if (ConstantExpr *CE = dyn_cast<ConstantExpr>(I.getOperand(i))) {
+ if (MMI) {
+ // Inform the MachineModuleInfo of the personality for this landing pad.
+ if (ConstantExpr *CE = dyn_cast<ConstantExpr>(I.getOperand(2))) {
if (CE->getOpcode() == Instruction::BitCast) {
- TyInfo.push_back(cast<GlobalVariable>(CE->getOperand(0)));
- continue;
+ MMI->addPersonality(CurMBB,
+ cast<Function>(CE->getOperand(0)));
}
}
- TyInfo.push_back(NULL);
+ // Gather all the type infos for this landing pad and pass them along to
+ // MachineModuleInfo.
+ std::vector<GlobalVariable *> TyInfo;
+ for (unsigned i = 3, N = I.getNumOperands(); i < N; ++i) {
+ if (ConstantExpr *CE = dyn_cast<ConstantExpr>(I.getOperand(i))) {
+ if (CE->getOpcode() == Instruction::BitCast) {
+ TyInfo.push_back(cast<GlobalVariable>(CE->getOperand(0)));
+ continue;
+ }
+ }
+
+ TyInfo.push_back(NULL);
+ }
+ MMI->addCatchTypeInfo(CurMBB, TyInfo);
+
+ // Mark exception selector register as live in.
+ unsigned Reg = TLI.getExceptionSelectorRegister();
+ if (Reg) CurMBB->addLiveIn(Reg);
+
+ // Insert the EHSELECTION instruction.
+ SDVTList VTs = DAG.getVTList(TLI.getPointerTy(), MVT::Other);
+ SDOperand Ops[2];
+ Ops[0] = getValue(I.getOperand(1));
+ Ops[1] = getRoot();
+ SDOperand Op = DAG.getNode(ISD::EHSELECTION, VTs, Ops, 2);
+ setValue(&I, Op);
+ DAG.setRoot(Op.getValue(1));
}
- MMI->addCatchTypeInfo(CurMBB, TyInfo);
-
- // Mark exception selector register as live in.
- const MRegisterInfo *MRI = DAG.getTarget().getRegisterInfo();
- unsigned Reg = MRI->getEHHandlerRegister();
- if (Reg) CurMBB->addLiveIn(Reg);
-
- // Insert the EHSELECTION instruction.
- SDVTList VTs = DAG.getVTList(TLI.getPointerTy(), MVT::Other);
- SDOperand Ops[2];
- Ops[0] = getValue(I.getOperand(1));
- Ops[1] = getRoot();
- SDOperand Op = DAG.getNode(ISD::EHSELECTION, VTs, Ops, 2);
- setValue(&I, Op);
- DAG.setRoot(Op.getValue(1));
return 0;
}
case Intrinsic::eh_typeid_for: {
- GlobalVariable *GV = NULL;
-
- // Find the type id for the given typeinfo.
MachineModuleInfo *MMI = DAG.getMachineModuleInfo();
- if (ConstantExpr *CE = dyn_cast<ConstantExpr>(I.getOperand(1))) {
- if (CE->getOpcode() == Instruction::BitCast) {
- GV = cast<GlobalVariable>(CE->getOperand(0));
+
+ if (MMI) {
+ // Find the type id for the given typeinfo.
+ GlobalVariable *GV = NULL;
+ if (ConstantExpr *CE = dyn_cast<ConstantExpr>(I.getOperand(1))) {
+ if (CE->getOpcode() == Instruction::BitCast) {
+ GV = cast<GlobalVariable>(CE->getOperand(0));
+ }
}
+
+ unsigned TypeID = MMI->getTypeIDFor(GV);
+ setValue(&I, DAG.getConstant(TypeID, MVT::i32));
}
-
- unsigned TypeID = MMI->getTypeIDFor(GV);
- setValue(&I, DAG.getConstant(TypeID, MVT::i32));
return 0;
}
@@ -2246,6 +2240,35 @@
}
+void SelectionDAGLowering::LowerCallTo(CallInst &I,
+ SDOperand Callee, unsigned OpIdx) {
+ const PointerType *PT = cast<PointerType>(I.getCalledValue()->getType());
+ const FunctionType *FTy = cast<FunctionType>(PT->getElementType());
+
+ TargetLowering::ArgListTy Args;
+ TargetLowering::ArgListEntry Entry;
+ Args.reserve(I.getNumOperands());
+ for (unsigned i = OpIdx, e = I.getNumOperands(); i != e; ++i) {
+ Value *Arg = I.getOperand(i);
+ SDOperand ArgNode = getValue(Arg);
+ Entry.Node = ArgNode; Entry.Ty = Arg->getType();
+ Entry.isSigned = FTy->paramHasAttr(i, FunctionType::SExtAttribute);
+ Entry.isInReg = FTy->paramHasAttr(i, FunctionType::InRegAttribute);
+ Entry.isSRet = FTy->paramHasAttr(i, FunctionType::StructRetAttribute);
+ Args.push_back(Entry);
+ }
+
+ std::pair<SDOperand,SDOperand> Result =
+ TLI.LowerCallTo(getRoot(), I.getType(),
+ FTy->paramHasAttr(0,FunctionType::SExtAttribute),
+ FTy->isVarArg(), I.getCallingConv(), I.isTailCall(),
+ Callee, Args, DAG);
+ if (I.getType() != Type::VoidTy)
+ setValue(&I, Result.first);
+ DAG.setRoot(Result.second);
+}
+
+
void SelectionDAGLowering::visitCall(CallInst &I) {
const char *RenameFn = 0;
if (Function *F = I.getCalledFunction()) {
@@ -2298,37 +2321,16 @@
return;
}
- const PointerType *PT = cast<PointerType>(I.getCalledValue()->getType());
- const FunctionType *FTy = cast<FunctionType>(PT->getElementType());
-
SDOperand Callee;
if (!RenameFn)
Callee = getValue(I.getOperand(0));
else
Callee = DAG.getExternalSymbol(RenameFn, TLI.getPointerTy());
- TargetLowering::ArgListTy Args;
- TargetLowering::ArgListEntry Entry;
- Args.reserve(I.getNumOperands());
- for (unsigned i = 1, e = I.getNumOperands(); i != e; ++i) {
- Value *Arg = I.getOperand(i);
- SDOperand ArgNode = getValue(Arg);
- Entry.Node = ArgNode; Entry.Ty = Arg->getType();
- Entry.isSigned = FTy->paramHasAttr(i, FunctionType::SExtAttribute);
- Entry.isInReg = FTy->paramHasAttr(i, FunctionType::InRegAttribute);
- Entry.isSRet = FTy->paramHasAttr(i, FunctionType::StructRetAttribute);
- Args.push_back(Entry);
- }
-
- std::pair<SDOperand,SDOperand> Result =
- TLI.LowerCallTo(getRoot(), I.getType(),
- FTy->paramHasAttr(0,FunctionType::SExtAttribute),
- FTy->isVarArg(), I.getCallingConv(), I.isTailCall(),
- Callee, Args, DAG);
- if (I.getType() != Type::VoidTy)
- setValue(&I, Result.first);
- DAG.setRoot(Result.second);
+
+ LowerCallTo(I, Callee, 1);
}
+
SDOperand RegsForValue::getCopyFromRegs(SelectionDAG &DAG,
SDOperand &Chain, SDOperand &Flag)const{
SDOperand Val = DAG.getCopyFromReg(Chain, Regs[0], RegVT, Flag);
More information about the llvm-commits
mailing list