diff options
author | Chris Lattner <sabre@nondot.org> | 2005-05-12 04:49:08 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2005-05-12 04:49:08 +0000 |
commit | a5bf1030bf7fac35b9a9f1e367acbd9cd5bd12e6 (patch) | |
tree | 7172c47b317f4a4fed57f6ebd328a7f68b30efa6 /llvm/lib | |
parent | f80969f29bfd48f23638bc0ac35fcb4dd4fcb3bb (diff) | |
download | bcm5719-llvm-a5bf1030bf7fac35b9a9f1e367acbd9cd5bd12e6.tar.gz bcm5719-llvm-a5bf1030bf7fac35b9a9f1e367acbd9cd5bd12e6.zip |
Fix a problem where early legalization can cause token chain problems.
llvm-svn: 21885
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp index 8c26c5821be..fa50d4a7897 100644 --- a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp @@ -130,6 +130,8 @@ private: void ExpandByParts(unsigned NodeOp, SDOperand LHS, SDOperand RHS, SDOperand &Lo, SDOperand &Hi); + void SpliceCallInto(const SDOperand &CallResult, SDNode *OutChain); + SDOperand getIntPtrConstant(uint64_t Val) { return DAG.getConstant(Val, TLI.getPointerTy()); } @@ -1271,7 +1273,6 @@ SDOperand SelectionDAGLegalize::LegalizeOp(SDOperand Op) { Node->getOpcode() == ISD::UINT_TO_FP) { Result = ExpandIntToFP(Node->getOpcode() == ISD::SINT_TO_FP, Node->getValueType(0), Node->getOperand(0)); - Result = LegalizeOp(Result); break; } else if (Node->getOpcode() == ISD::TRUNCATE) { // In the expand case, we must be dealing with a truncate, because @@ -1530,8 +1531,6 @@ SDOperand SelectionDAGLegalize::PromoteOp(SDOperand Op) { case Expand: Result = ExpandIntToFP(Node->getOpcode() == ISD::SINT_TO_FP, NVT, Node->getOperand(0)); - Result = LegalizeOp(Result); - // Round if we cannot tolerate excess precision. if (NoExcessFPPrecision) Result = DAG.getNode(ISD::FP_ROUND_INREG, NVT, Result, VT); @@ -2047,8 +2046,8 @@ static SDOperand FindInputOutputChains(SDNode *OpNode, SDNode *&OutChain, } /// SpliceCallInto - Given the result chain of a libcall (CallResult), and a -static void SpliceCallInto(const SDOperand &CallResult, SDNode *OutChain, - SelectionDAG &DAG) { +void SelectionDAGLegalize::SpliceCallInto(const SDOperand &CallResult, + SDNode *OutChain) { // Nothing to splice it into? if (OutChain == 0) return; @@ -2087,7 +2086,9 @@ SDOperand SelectionDAGLegalize::ExpandLibCall(const char *Name, SDNode *Node, const Type *RetTy = MVT::getTypeForValueType(Node->getValueType(0)); std::pair<SDOperand,SDOperand> CallInfo = TLI.LowerCallTo(InChain, RetTy, false, Callee, Args, DAG); - SpliceCallInto(CallInfo.second, OutChain, DAG); + SpliceCallInto(CallInfo.second, OutChain); + + NeedsAnotherIteration = true; switch (getTypeAction(CallInfo.first.getValueType())) { default: assert(0 && "Unknown thing"); @@ -2176,7 +2177,7 @@ ExpandIntToFP(bool isSigned, MVT::ValueType DestTy, SDOperand Source) { std::pair<SDOperand,SDOperand> CallResult = TLI.LowerCallTo(InChain, RetTy, false, Callee, Args, DAG); - SpliceCallInto(CallResult.second, OutChain, DAG); + SpliceCallInto(CallResult.second, OutChain); return CallResult.first; } |