From: Chris Lattner Date: Sat, 14 Jan 2006 22:41:46 +0000 (+0000) Subject: Token chain results are not always the first or last result. Consider copyfromreg... X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=c0ab5226cc92b8d33104374a21896b8331f3fee1;p=oota-llvm.git Token chain results are not always the first or last result. Consider copyfromreg nodes, where they are the middle result (the flag result is last) git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@25325 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp index 9dae31d6d77..57a9b1d7765 100644 --- a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp +++ b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp @@ -3016,6 +3016,7 @@ SDOperand SelectionDAGLegalize::PromoteOp(SDOperand Op) { Tmp2 = LegalizeOp(Node->getOperand(1)); Result = DAG.getNode(ISD::SRL, NVT, Tmp1, Tmp2); break; + case ISD::LOAD: Tmp1 = LegalizeOp(Node->getOperand(0)); // Legalize the chain. Tmp2 = LegalizeOp(Node->getOperand(1)); // Legalize the pointer. @@ -3374,11 +3375,24 @@ static SDNode *FindCallSeqEnd(SDNode *Node) { if (Node->use_empty()) return 0; // No CallSeqEnd + // The chain is usually at the end. SDOperand TheChain(Node, Node->getNumValues()-1); - if (TheChain.getValueType() != MVT::Other) + if (TheChain.getValueType() != MVT::Other) { + // Sometimes it's at the beginning. TheChain = SDOperand(Node, 0); - if (TheChain.getValueType() != MVT::Other) - return 0; + if (TheChain.getValueType() != MVT::Other) { + // Otherwise, hunt for it. + for (unsigned i = 1, e = Node->getNumValues(); i != e; ++i) + if (Node->getValueType(i) == MVT::Other) { + TheChain = SDOperand(Node, i); + break; + } + + // Otherwise, we walked into a node without a chain. + if (TheChain.getValueType() != MVT::Other) + return 0; + } + } for (SDNode::use_iterator UI = Node->use_begin(), E = Node->use_end(); UI != E; ++UI) {