mirror of
https://github.com/RPCS3/llvm.git
synced 2025-04-02 13:21:43 +00:00
Change CALLSEQ_BEGIN and CALLSEQ_END to take TargetConstant's as
parameters instead of raw Constants. This prevents the constants from being selected by the isel pass, fixing PR2735. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@57385 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
119c30b955
commit
e563bbc312
@ -1678,8 +1678,7 @@ SDValue SelectionDAGLegalize::LegalizeOp(SDValue Op) {
|
||||
|
||||
// Chain the dynamic stack allocation so that it doesn't modify the stack
|
||||
// pointer when other instructions are using the stack.
|
||||
Chain = DAG.getCALLSEQ_START(Chain,
|
||||
DAG.getConstant(0, TLI.getPointerTy()));
|
||||
Chain = DAG.getCALLSEQ_START(Chain, DAG.getIntPtrConstant(0, true));
|
||||
|
||||
SDValue Size = Tmp2.getOperand(1);
|
||||
SDValue SP = DAG.getCopyFromReg(Chain, SPReg, VT);
|
||||
@ -1693,11 +1692,8 @@ SDValue SelectionDAGLegalize::LegalizeOp(SDValue Op) {
|
||||
Tmp1 = DAG.getNode(ISD::SUB, VT, SP, Size); // Value
|
||||
Chain = DAG.getCopyToReg(Chain, SPReg, Tmp1); // Output chain
|
||||
|
||||
Tmp2 =
|
||||
DAG.getCALLSEQ_END(Chain,
|
||||
DAG.getConstant(0, TLI.getPointerTy()),
|
||||
DAG.getConstant(0, TLI.getPointerTy()),
|
||||
SDValue());
|
||||
Tmp2 = DAG.getCALLSEQ_END(Chain, DAG.getIntPtrConstant(0, true),
|
||||
DAG.getIntPtrConstant(0, true), SDValue());
|
||||
|
||||
Tmp1 = LegalizeOp(Tmp1);
|
||||
Tmp2 = LegalizeOp(Tmp2);
|
||||
|
@ -430,8 +430,7 @@ SDValue ARMTargetLowering::LowerCALL(SDValue Op, SelectionDAG &DAG) {
|
||||
|
||||
// Adjust the stack pointer for the new arguments...
|
||||
// These operations are automatically eliminated by the prolog/epilog pass
|
||||
Chain = DAG.getCALLSEQ_START(Chain,
|
||||
DAG.getConstant(NumBytes, MVT::i32));
|
||||
Chain = DAG.getCALLSEQ_START(Chain, DAG.getIntPtrConstant(NumBytes, true));
|
||||
|
||||
SDValue StackPtr = DAG.getRegister(ARM::SP, MVT::i32);
|
||||
|
||||
@ -603,10 +602,8 @@ SDValue ARMTargetLowering::LowerCALL(SDValue Op, SelectionDAG &DAG) {
|
||||
&Ops[0], Ops.size());
|
||||
InFlag = Chain.getValue(1);
|
||||
|
||||
Chain = DAG.getCALLSEQ_END(Chain,
|
||||
DAG.getConstant(NumBytes, MVT::i32),
|
||||
DAG.getConstant(0, MVT::i32),
|
||||
InFlag);
|
||||
Chain = DAG.getCALLSEQ_END(Chain, DAG.getIntPtrConstant(NumBytes, true),
|
||||
DAG.getIntPtrConstant(0, true), InFlag);
|
||||
if (RetVT != MVT::Other)
|
||||
InFlag = Chain.getValue(1);
|
||||
|
||||
|
@ -452,12 +452,12 @@ let Defs = [SP], Uses = [SP] in {
|
||||
def ADJCALLSTACKUP :
|
||||
PseudoInst<(outs), (ins i32imm:$amt1, i32imm:$amt2, pred:$p),
|
||||
"@ ADJCALLSTACKUP $amt1",
|
||||
[(ARMcallseq_end imm:$amt1, imm:$amt2)]>;
|
||||
[(ARMcallseq_end timm:$amt1, timm:$amt2)]>;
|
||||
|
||||
def ADJCALLSTACKDOWN :
|
||||
PseudoInst<(outs), (ins i32imm:$amt, pred:$p),
|
||||
"@ ADJCALLSTACKDOWN $amt",
|
||||
[(ARMcallseq_start imm:$amt)]>;
|
||||
[(ARMcallseq_start timm:$amt)]>;
|
||||
}
|
||||
|
||||
def DWARF_LOC :
|
||||
|
@ -360,8 +360,7 @@ AlphaTargetLowering::LowerCallTo(SDValue Chain, const Type *RetTy,
|
||||
if (Args.size() > 6)
|
||||
NumBytes = (Args.size() - 6) * 8;
|
||||
|
||||
Chain = DAG.getCALLSEQ_START(Chain,
|
||||
DAG.getConstant(NumBytes, getPointerTy()));
|
||||
Chain = DAG.getCALLSEQ_START(Chain, DAG.getIntPtrConstant(NumBytes, true));
|
||||
std::vector<SDValue> args_to_use;
|
||||
for (unsigned i = 0, e = Args.size(); i != e; ++i)
|
||||
{
|
||||
@ -404,10 +403,8 @@ AlphaTargetLowering::LowerCallTo(SDValue Chain, const Type *RetTy,
|
||||
Ops.insert(Ops.end(), args_to_use.begin(), args_to_use.end());
|
||||
SDValue TheCall = DAG.getNode(AlphaISD::CALL, RetVals, &Ops[0], Ops.size());
|
||||
Chain = TheCall.getValue(RetTyVT != MVT::isVoid);
|
||||
Chain = DAG.getCALLSEQ_END(Chain,
|
||||
DAG.getConstant(NumBytes, getPointerTy()),
|
||||
DAG.getConstant(0, getPointerTy()),
|
||||
SDValue());
|
||||
Chain = DAG.getCALLSEQ_END(Chain, DAG.getIntPtrConstant(NumBytes, true),
|
||||
DAG.getIntPtrConstant(0, true), SDValue());
|
||||
SDValue RetVal = TheCall;
|
||||
|
||||
if (RetTyVT != ActualRetTyVT) {
|
||||
|
@ -151,10 +151,10 @@ def WTF : PseudoInstAlpha<(outs), (ins variable_ops), "#wtf", [], s_pseudo>;
|
||||
let hasCtrlDep = 1, Defs = [R30], Uses = [R30] in {
|
||||
def ADJUSTSTACKUP : PseudoInstAlpha<(outs), (ins s64imm:$amt),
|
||||
"; ADJUP $amt",
|
||||
[(callseq_start imm:$amt)], s_pseudo>;
|
||||
[(callseq_start timm:$amt)], s_pseudo>;
|
||||
def ADJUSTSTACKDOWN : PseudoInstAlpha<(outs), (ins s64imm:$amt1, s64imm:$amt2),
|
||||
"; ADJDOWN $amt1",
|
||||
[(callseq_end imm:$amt1, imm:$amt2)], s_pseudo>;
|
||||
[(callseq_end timm:$amt1, timm:$amt2)], s_pseudo>;
|
||||
}
|
||||
|
||||
def ALTENT : PseudoInstAlpha<(outs), (ins s64imm:$TARGET), "$$$TARGET..ng:\n", [], s_pseudo>;
|
||||
|
@ -1171,7 +1171,8 @@ LowerCALL(SDValue Op, SelectionDAG &DAG, const SPUSubtarget *ST) {
|
||||
|
||||
// Update number of stack bytes actually used, insert a call sequence start
|
||||
NumStackBytes = (ArgOffset - SPUFrameInfo::minStackSize());
|
||||
Chain = DAG.getCALLSEQ_START(Chain, DAG.getConstant(NumStackBytes, PtrVT));
|
||||
Chain = DAG.getCALLSEQ_START(Chain, DAG.getIntPtrConstant(NumStackBytes,
|
||||
true));
|
||||
|
||||
if (!MemOpChains.empty()) {
|
||||
// Adjust the stack pointer for the stack arguments.
|
||||
@ -1243,10 +1244,8 @@ LowerCALL(SDValue Op, SelectionDAG &DAG, const SPUSubtarget *ST) {
|
||||
&Ops[0], Ops.size());
|
||||
InFlag = Chain.getValue(1);
|
||||
|
||||
Chain = DAG.getCALLSEQ_END(Chain,
|
||||
DAG.getConstant(NumStackBytes, PtrVT),
|
||||
DAG.getConstant(0, PtrVT),
|
||||
InFlag);
|
||||
Chain = DAG.getCALLSEQ_END(Chain, DAG.getIntPtrConstant(NumStackBytes, true),
|
||||
DAG.getIntPtrConstant(0, true), InFlag);
|
||||
if (TheCall->getValueType(0) != MVT::Other)
|
||||
InFlag = Chain.getValue(1);
|
||||
|
||||
|
@ -24,10 +24,10 @@
|
||||
let hasCtrlDep = 1, Defs = [R1], Uses = [R1] in {
|
||||
def ADJCALLSTACKDOWN : Pseudo<(outs), (ins u16imm_i32:$amt),
|
||||
"${:comment} ADJCALLSTACKDOWN",
|
||||
[(callseq_start imm:$amt)]>;
|
||||
[(callseq_start timm:$amt)]>;
|
||||
def ADJCALLSTACKUP : Pseudo<(outs), (ins u16imm_i32:$amt),
|
||||
"${:comment} ADJCALLSTACKUP",
|
||||
[(callseq_end imm:$amt)]>;
|
||||
[(callseq_end timm:$amt)]>;
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
@ -333,7 +333,7 @@ IA64TargetLowering::LowerCallTo(SDValue Chain, const Type *RetTy,
|
||||
// "stack frame not 16-byte aligned!");
|
||||
NumBytes = (NumBytes+15) & ~15;
|
||||
|
||||
Chain = DAG.getCALLSEQ_START(Chain,DAG.getConstant(NumBytes, getPointerTy()));
|
||||
Chain = DAG.getCALLSEQ_START(Chain, DAG.getIntPtrConstant(NumBytes, true));
|
||||
|
||||
SDValue StackPtr;
|
||||
std::vector<SDValue> Stores;
|
||||
@ -543,10 +543,8 @@ IA64TargetLowering::LowerCallTo(SDValue Chain, const Type *RetTy,
|
||||
}
|
||||
}
|
||||
|
||||
Chain = DAG.getCALLSEQ_END(Chain,
|
||||
DAG.getConstant(NumBytes, getPointerTy()),
|
||||
DAG.getConstant(0, getPointerTy()),
|
||||
SDValue());
|
||||
Chain = DAG.getCALLSEQ_END(Chain, DAG.getIntPtrConstant(NumBytes, true),
|
||||
DAG.getIntPtrConstant(0, true), SDValue());
|
||||
return std::make_pair(RetVal, Chain);
|
||||
}
|
||||
|
||||
|
@ -608,8 +608,7 @@ LowerCALL(SDValue Op, SelectionDAG &DAG)
|
||||
|
||||
// Get a count of how many bytes are to be pushed on the stack.
|
||||
unsigned NumBytes = CCInfo.getNextStackOffset();
|
||||
Chain = DAG.getCALLSEQ_START(Chain,DAG.getConstant(NumBytes,
|
||||
getPointerTy()));
|
||||
Chain = DAG.getCALLSEQ_START(Chain, DAG.getIntPtrConstant(NumBytes, true));
|
||||
|
||||
// With EABI is it possible to have 16 args on registers.
|
||||
SmallVector<std::pair<unsigned, SDValue>, 16> RegsToPass;
|
||||
@ -715,10 +714,8 @@ LowerCALL(SDValue Op, SelectionDAG &DAG)
|
||||
InFlag = Chain.getValue(1);
|
||||
|
||||
// Create the CALLSEQ_END node.
|
||||
Chain = DAG.getCALLSEQ_END(Chain,
|
||||
DAG.getConstant(NumBytes, getPointerTy()),
|
||||
DAG.getConstant(0, getPointerTy()),
|
||||
InFlag);
|
||||
Chain = DAG.getCALLSEQ_END(Chain, DAG.getIntPtrConstant(NumBytes, true),
|
||||
DAG.getIntPtrConstant(0, true), InFlag);
|
||||
InFlag = Chain.getValue(1);
|
||||
|
||||
// Create a stack location to hold GP when PIC is used. This stack
|
||||
|
@ -393,10 +393,10 @@ class CondMov<bits<6> func, string instr_asm, PatLeaf MovCode>:
|
||||
let Defs = [SP], Uses = [SP] in {
|
||||
def ADJCALLSTACKDOWN : MipsPseudo<(outs), (ins uimm16:$amt),
|
||||
"!ADJCALLSTACKDOWN $amt",
|
||||
[(callseq_start imm:$amt)]>;
|
||||
[(callseq_start timm:$amt)]>;
|
||||
def ADJCALLSTACKUP : MipsPseudo<(outs), (ins uimm16:$amt1, uimm16:$amt2),
|
||||
"!ADJCALLSTACKUP $amt1",
|
||||
[(callseq_end imm:$amt1, imm:$amt2)]>;
|
||||
[(callseq_end timm:$amt1, timm:$amt2)]>;
|
||||
}
|
||||
|
||||
// Some assembly macros need to avoid pseudoinstructions and assembler
|
||||
|
@ -2142,8 +2142,7 @@ SDValue PPCTargetLowering::LowerCALL(SDValue Op, SelectionDAG &DAG,
|
||||
|
||||
// Adjust the stack pointer for the new arguments...
|
||||
// These operations are automatically eliminated by the prolog/epilog pass
|
||||
Chain = DAG.getCALLSEQ_START(Chain,
|
||||
DAG.getConstant(NumBytes, PtrVT));
|
||||
Chain = DAG.getCALLSEQ_START(Chain, DAG.getIntPtrConstant(NumBytes, true));
|
||||
SDValue CallSeqStart = Chain;
|
||||
|
||||
// Load the return address and frame pointer so it can be move somewhere else
|
||||
@ -2476,8 +2475,8 @@ SDValue PPCTargetLowering::LowerCALL(SDValue Op, SelectionDAG &DAG,
|
||||
SmallVector<SDValue, 8> CallSeqOps;
|
||||
SDVTList CallSeqNodeTys = DAG.getVTList(MVT::Other, MVT::Flag);
|
||||
CallSeqOps.push_back(Chain);
|
||||
CallSeqOps.push_back(DAG.getIntPtrConstant(NumBytes));
|
||||
CallSeqOps.push_back(DAG.getIntPtrConstant(0));
|
||||
CallSeqOps.push_back(DAG.getIntPtrConstant(NumBytes, true));
|
||||
CallSeqOps.push_back(DAG.getIntPtrConstant(0, true));
|
||||
if (InFlag.getNode())
|
||||
CallSeqOps.push_back(InFlag);
|
||||
Chain = DAG.getNode(ISD::CALLSEQ_END, CallSeqNodeTys, &CallSeqOps[0],
|
||||
@ -2564,9 +2563,8 @@ SDValue PPCTargetLowering::LowerCALL(SDValue Op, SelectionDAG &DAG,
|
||||
Chain = DAG.getNode(CallOpc, NodeTys, &Ops[0], Ops.size());
|
||||
InFlag = Chain.getValue(1);
|
||||
|
||||
Chain = DAG.getCALLSEQ_END(Chain,
|
||||
DAG.getConstant(NumBytes, PtrVT),
|
||||
DAG.getConstant(BytesCalleePops, PtrVT),
|
||||
Chain = DAG.getCALLSEQ_END(Chain, DAG.getIntPtrConstant(NumBytes, true),
|
||||
DAG.getIntPtrConstant(BytesCalleePops, true),
|
||||
InFlag);
|
||||
if (TheCall->getValueType(0) != MVT::Other)
|
||||
InFlag = Chain.getValue(1);
|
||||
|
@ -342,10 +342,10 @@ let hasCtrlDep = 1 in {
|
||||
let Defs = [R1], Uses = [R1] in {
|
||||
def ADJCALLSTACKDOWN : Pseudo<(outs), (ins u16imm:$amt),
|
||||
"${:comment} ADJCALLSTACKDOWN",
|
||||
[(callseq_start imm:$amt)]>;
|
||||
[(callseq_start timm:$amt)]>;
|
||||
def ADJCALLSTACKUP : Pseudo<(outs), (ins u16imm:$amt1, u16imm:$amt2),
|
||||
"${:comment} ADJCALLSTACKUP",
|
||||
[(callseq_end imm:$amt1, imm:$amt2)]>;
|
||||
[(callseq_end timm:$amt1, timm:$amt2)]>;
|
||||
}
|
||||
|
||||
def UPDATE_VRSAVE : Pseudo<(outs GPRC:$rD), (ins GPRC:$rS),
|
||||
|
@ -270,7 +270,7 @@ static SDValue LowerCALL(SDValue Op, SelectionDAG &DAG) {
|
||||
// Keep stack frames 8-byte aligned.
|
||||
ArgsSize = (ArgsSize+7) & ~7;
|
||||
|
||||
Chain = DAG.getCALLSEQ_START(Chain, DAG.getIntPtrConstant(ArgsSize));
|
||||
Chain = DAG.getCALLSEQ_START(Chain, DAG.getIntPtrConstant(ArgsSize, true));
|
||||
|
||||
SmallVector<std::pair<unsigned, SDValue>, 8> RegsToPass;
|
||||
SmallVector<SDValue, 8> MemOpChains;
|
||||
@ -421,9 +421,8 @@ static SDValue LowerCALL(SDValue Op, SelectionDAG &DAG) {
|
||||
Chain = DAG.getNode(SPISD::CALL, NodeTys, Ops, InFlag.getNode() ? 3 : 2);
|
||||
InFlag = Chain.getValue(1);
|
||||
|
||||
Chain = DAG.getCALLSEQ_END(Chain,
|
||||
DAG.getConstant(ArgsSize, MVT::i32),
|
||||
DAG.getConstant(0, MVT::i32), InFlag);
|
||||
Chain = DAG.getCALLSEQ_END(Chain, DAG.getIntPtrConstant(ArgsSize, true),
|
||||
DAG.getIntPtrConstant(0, true), InFlag);
|
||||
InFlag = Chain.getValue(1);
|
||||
|
||||
// Assign locations to each value returned by this call.
|
||||
|
@ -210,10 +210,10 @@ class Pseudo<dag outs, dag ins, string asmstr, list<dag> pattern>
|
||||
let Defs = [O6], Uses = [O6] in {
|
||||
def ADJCALLSTACKDOWN : Pseudo<(outs), (ins i32imm:$amt),
|
||||
"!ADJCALLSTACKDOWN $amt",
|
||||
[(callseq_start imm:$amt)]>;
|
||||
[(callseq_start timm:$amt)]>;
|
||||
def ADJCALLSTACKUP : Pseudo<(outs), (ins i32imm:$amt1, i32imm:$amt2),
|
||||
"!ADJCALLSTACKUP $amt1",
|
||||
[(callseq_end imm:$amt1, imm:$amt2)]>;
|
||||
[(callseq_end timm:$amt1, timm:$amt2)]>;
|
||||
}
|
||||
|
||||
// FpMOVD/FpNEGD/FpABSD - These are lowered to single-precision ops by the
|
||||
|
@ -240,6 +240,7 @@ def node;
|
||||
def srcvalue;
|
||||
|
||||
def imm : SDNode<"ISD::Constant" , SDTIntLeaf , [], "ConstantSDNode">;
|
||||
def timm : SDNode<"ISD::TargetConstant", SDTIntLeaf , [], "ConstantSDNode">;
|
||||
def fpimm : SDNode<"ISD::ConstantFP", SDTFPLeaf , [], "ConstantFPSDNode">;
|
||||
def vt : SDNode<"ISD::VALUETYPE" , SDTOther , [], "VTSDNode">;
|
||||
def bb : SDNode<"ISD::BasicBlock", SDTOther , [], "BasicBlockSDNode">;
|
||||
|
@ -1501,7 +1501,7 @@ SDValue X86TargetLowering::LowerCALL(SDValue Op, SelectionDAG &DAG) {
|
||||
MF.getInfo<X86MachineFunctionInfo>()->setTCReturnAddrDelta(FPDiff);
|
||||
}
|
||||
|
||||
Chain = DAG.getCALLSEQ_START(Chain, DAG.getIntPtrConstant(NumBytes));
|
||||
Chain = DAG.getCALLSEQ_START(Chain, DAG.getIntPtrConstant(NumBytes, true));
|
||||
|
||||
SDValue RetAddrFrIdx;
|
||||
// Load return adress for tail calls.
|
||||
@ -1717,8 +1717,8 @@ SDValue X86TargetLowering::LowerCALL(SDValue Op, SelectionDAG &DAG) {
|
||||
|
||||
if (IsTailCall) {
|
||||
Ops.push_back(Chain);
|
||||
Ops.push_back(DAG.getIntPtrConstant(NumBytes));
|
||||
Ops.push_back(DAG.getIntPtrConstant(0));
|
||||
Ops.push_back(DAG.getIntPtrConstant(NumBytes, true));
|
||||
Ops.push_back(DAG.getIntPtrConstant(0, true));
|
||||
if (InFlag.getNode())
|
||||
Ops.push_back(InFlag);
|
||||
Chain = DAG.getNode(ISD::CALLSEQ_END, NodeTys, &Ops[0], Ops.size());
|
||||
@ -1780,8 +1780,9 @@ SDValue X86TargetLowering::LowerCALL(SDValue Op, SelectionDAG &DAG) {
|
||||
|
||||
// Returns a flag for retval copy to use.
|
||||
Chain = DAG.getCALLSEQ_END(Chain,
|
||||
DAG.getIntPtrConstant(NumBytes),
|
||||
DAG.getIntPtrConstant(NumBytesForCalleeToPush),
|
||||
DAG.getIntPtrConstant(NumBytes, true),
|
||||
DAG.getIntPtrConstant(NumBytesForCalleeToPush,
|
||||
true),
|
||||
InFlag);
|
||||
InFlag = Chain.getValue(1);
|
||||
|
||||
@ -5115,7 +5116,7 @@ X86TargetLowering::LowerDYNAMIC_STACKALLOC(SDValue Op,
|
||||
MVT IntPtr = getPointerTy();
|
||||
MVT SPTy = Subtarget->is64Bit() ? MVT::i64 : MVT::i32;
|
||||
|
||||
Chain = DAG.getCALLSEQ_START(Chain, DAG.getIntPtrConstant(0));
|
||||
Chain = DAG.getCALLSEQ_START(Chain, DAG.getIntPtrConstant(0, true));
|
||||
|
||||
Chain = DAG.getCopyToReg(Chain, X86::EAX, Size, Flag);
|
||||
Flag = Chain.getValue(1);
|
||||
@ -5130,8 +5131,8 @@ X86TargetLowering::LowerDYNAMIC_STACKALLOC(SDValue Op,
|
||||
Flag = Chain.getValue(1);
|
||||
|
||||
Chain = DAG.getCALLSEQ_END(Chain,
|
||||
DAG.getIntPtrConstant(0),
|
||||
DAG.getIntPtrConstant(0),
|
||||
DAG.getIntPtrConstant(0, true),
|
||||
DAG.getIntPtrConstant(0, true),
|
||||
Flag);
|
||||
|
||||
Chain = DAG.getCopyFromReg(Chain, X86StackPtr, SPTy).getValue(1);
|
||||
|
@ -94,11 +94,11 @@ def extloadi64i32 : PatFrag<(ops node:$ptr), (i64 (extloadi32 node:$ptr))>;
|
||||
let Defs = [RSP, EFLAGS], Uses = [RSP] in {
|
||||
def ADJCALLSTACKDOWN64 : I<0, Pseudo, (outs), (ins i32imm:$amt),
|
||||
"#ADJCALLSTACKDOWN",
|
||||
[(X86callseq_start imm:$amt)]>,
|
||||
[(X86callseq_start timm:$amt)]>,
|
||||
Requires<[In64BitMode]>;
|
||||
def ADJCALLSTACKUP64 : I<0, Pseudo, (outs), (ins i32imm:$amt1, i32imm:$amt2),
|
||||
"#ADJCALLSTACKUP",
|
||||
[(X86callseq_end imm:$amt1, imm:$amt2)]>,
|
||||
[(X86callseq_end timm:$amt1, timm:$amt2)]>,
|
||||
Requires<[In64BitMode]>;
|
||||
}
|
||||
|
||||
|
@ -345,11 +345,11 @@ def and_su : PatFrag<(ops node:$lhs, node:$rhs), (and node:$lhs, node:$rhs), [{
|
||||
let Defs = [ESP, EFLAGS], Uses = [ESP] in {
|
||||
def ADJCALLSTACKDOWN32 : I<0, Pseudo, (outs), (ins i32imm:$amt),
|
||||
"#ADJCALLSTACKDOWN",
|
||||
[(X86callseq_start imm:$amt)]>,
|
||||
[(X86callseq_start timm:$amt)]>,
|
||||
Requires<[In32BitMode]>;
|
||||
def ADJCALLSTACKUP32 : I<0, Pseudo, (outs), (ins i32imm:$amt1, i32imm:$amt2),
|
||||
"#ADJCALLSTACKUP",
|
||||
[(X86callseq_end imm:$amt1, imm:$amt2)]>,
|
||||
[(X86callseq_end timm:$amt1, timm:$amt2)]>,
|
||||
Requires<[In32BitMode]>;
|
||||
}
|
||||
|
||||
|
21
test/CodeGen/X86/2008-10-11-CallCrash.ll
Normal file
21
test/CodeGen/X86/2008-10-11-CallCrash.ll
Normal file
@ -0,0 +1,21 @@
|
||||
; RUN: llvm-as < %s | llc
|
||||
; PR2735
|
||||
target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128"
|
||||
target triple = "i386-apple-darwin7"
|
||||
@g_385 = external global i32 ; <i32*> [#uses=1]
|
||||
|
||||
define i32 @func_45(i64 %p_46, i32 %p_48) nounwind {
|
||||
entry:
|
||||
%0 = tail call i32 (...)* @lshift_s_u(i64 %p_46, i64 0) nounwind ; <i32> [#uses=0]
|
||||
%1 = load i32* @g_385, align 4 ; <i32> [#uses=1]
|
||||
%2 = shl i32 %1, 1 ; <i32> [#uses=1]
|
||||
%3 = and i32 %2, 32 ; <i32> [#uses=1]
|
||||
%4 = tail call i32 (...)* @func_87(i32 undef, i32 %p_48, i32 1) nounwind ; <i32> [#uses=1]
|
||||
%5 = add i32 %3, %4 ; <i32> [#uses=1]
|
||||
%6 = tail call i32 (...)* @div_rhs(i32 %5) nounwind ; <i32> [#uses=0]
|
||||
ret i32 undef
|
||||
}
|
||||
|
||||
declare i32 @lshift_s_u(...)
|
||||
declare i32 @func_87(...)
|
||||
declare i32 @div_rhs(...)
|
Loading…
x
Reference in New Issue
Block a user