summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2006-01-14 22:41:46 +0000
committerChris Lattner <sabre@nondot.org>2006-01-14 22:41:46 +0000
commit02011c9a4f50a9f9b0a3df7a531e09606e6c3f2c (patch)
treea92f3392d626264153f1730862249004b30da9b8 /llvm/lib/CodeGen
parentc17b41c3ba5d0105e1637be7d1da9d4d04f57231 (diff)
downloadbcm5719-llvm-02011c9a4f50a9f9b0a3df7a531e09606e6c3f2c.tar.gz
bcm5719-llvm-02011c9a4f50a9f9b0a3df7a531e09606e6c3f2c.zip
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)
llvm-svn: 25325
Diffstat (limited to 'llvm/lib/CodeGen')
-rw-r--r--llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp20
1 files changed, 17 insertions, 3 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
index 9dae31d6d77..57a9b1d7765 100644
--- a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
+++ b/llvm/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) {
OpenPOWER on IntegriCloud