diff options
author | Chris Lattner <sabre@nondot.org> | 2009-09-17 23:54:54 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-09-17 23:54:54 +0000 |
commit | 1bd81314e73bbed774e458f846dccb0617fa8722 (patch) | |
tree | c1dce9554005f942493ccb7ed77a5f2a9b34cbeb /llvm/lib | |
parent | bf2fd768f9bd3c5c4e91b1b9bf0f4e77114ac6c9 (diff) | |
download | bcm5719-llvm-1bd81314e73bbed774e458f846dccb0617fa8722.tar.gz bcm5719-llvm-1bd81314e73bbed774e458f846dccb0617fa8722.zip |
tolerate llvm.eh.selector.i64 on 32-bit systems and llvm.eh.selector.i32 on
64-bit systems.
llvm-svn: 82180
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp | 45 |
1 files changed, 24 insertions, 21 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp index c946bdad5d3..ff41458bea4 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp @@ -4000,32 +4000,35 @@ SelectionDAGLowering::visitIntrinsicCall(CallInst &I, unsigned Intrinsic) { case Intrinsic::eh_selector_i32: case Intrinsic::eh_selector_i64: { MachineModuleInfo *MMI = DAG.getMachineModuleInfo(); - EVT VT = (Intrinsic == Intrinsic::eh_selector_i32 ? MVT::i32 : MVT::i64); - if (MMI) { - if (CurMBB->isLandingPad()) - AddCatchInfo(I, MMI, CurMBB); - else { + if (CurMBB->isLandingPad()) + AddCatchInfo(I, MMI, CurMBB); + else { #ifndef NDEBUG - FuncInfo.CatchInfoLost.insert(&I); + FuncInfo.CatchInfoLost.insert(&I); #endif - // FIXME: Mark exception selector register as live in. Hack for PR1508. - unsigned Reg = TLI.getExceptionSelectorRegister(); - if (Reg) CurMBB->addLiveIn(Reg); - } - - // Insert the EHSELECTION instruction. - SDVTList VTs = DAG.getVTList(VT, MVT::Other); - SDValue Ops[2]; - Ops[0] = getValue(I.getOperand(1)); - Ops[1] = getRoot(); - SDValue Op = DAG.getNode(ISD::EHSELECTION, dl, VTs, Ops, 2); - setValue(&I, Op); - DAG.setRoot(Op.getValue(1)); - } else { - setValue(&I, DAG.getConstant(0, VT)); + // FIXME: Mark exception selector register as live in. Hack for PR1508. + unsigned Reg = TLI.getExceptionSelectorRegister(); + if (Reg) CurMBB->addLiveIn(Reg); } + // Insert the EHSELECTION instruction. + SDVTList VTs = DAG.getVTList(TLI.getPointerTy(), MVT::Other); + SDValue Ops[2]; + Ops[0] = getValue(I.getOperand(1)); + Ops[1] = getRoot(); + SDValue Op = DAG.getNode(ISD::EHSELECTION, dl, VTs, Ops, 2); + + DAG.setRoot(Op.getValue(1)); + + MVT::SimpleValueType VT = + (Intrinsic == Intrinsic::eh_selector_i32 ? MVT::i32 : MVT::i64); + if (Op.getValueType().getSimpleVT() < VT) + Op = DAG.getNode(ISD::ZERO_EXTEND, dl, VT, Op); + else if (Op.getValueType().getSimpleVT() < VT) + Op = DAG.getNode(ISD::TRUNCATE, dl, VT, Op); + + setValue(&I, Op); return 0; } |