OSDN Git Service

Fix an infinite loop I caused by making sure to legalize the flag operand
authorChris Lattner <sabre@nondot.org>
Tue, 24 Jan 2006 05:48:21 +0000 (05:48 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 24 Jan 2006 05:48:21 +0000 (05:48 +0000)
of CALLSEQ_* nodes

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@25582 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
lib/CodeGen/SelectionDAG/SelectionDAG.cpp

index 77e721e..e5dd538 100644 (file)
@@ -823,6 +823,13 @@ SDOperand SelectionDAGLegalize::LegalizeOp(SDOperand Op) {
     Tmp2 = Node->getOperand(0);
     if (Tmp1 != Tmp2)
       Node->setAdjCallChain(Tmp1);
+    
+    // If this has a flag input, do legalize it.
+    if (Node->getOperand(Node->getNumOperands()-1).getValueType() == MVT::Flag){
+      Tmp1 = LegalizeOp(Node->getOperand(Node->getNumOperands()-1));
+      if (Tmp1 != Node->getOperand(Node->getNumOperands()-1))
+        Node->setAdjCallFlag(Tmp1);
+    }
       
     // Note that we do not create new CALLSEQ_DOWN/UP nodes here.  These
     // nodes are treated specially and are mutated in place.  This makes the dag
@@ -1365,7 +1372,8 @@ SDOperand SelectionDAGLegalize::LegalizeOp(SDOperand Op) {
                              Tmp2,
                              Node->getOperand(3));
       }
-      Node = Result.Val;
+      Result = LegalizeOp(Result);
+      break;
     }
 
     switch (getTypeAction(Node->getOperand(1).getValueType())) {
index c1ba5eb..ed96bd6 100644 (file)
@@ -1276,6 +1276,19 @@ void SDNode::setAdjCallChain(SDOperand N) {
   OperandList[0].Val->Uses.push_back(this);
 }
 
+// setAdjCallFlag - This method changes the flag input of an
+// CALLSEQ_START/END node to be the specified operand.
+void SDNode::setAdjCallFlag(SDOperand N) {
+  assert(N.getValueType() == MVT::Flag);
+  assert((getOpcode() == ISD::CALLSEQ_START ||
+          getOpcode() == ISD::CALLSEQ_END) && "Cannot adjust this node!");
+  
+  SDOperand &FlagOp = OperandList[getNumOperands()-1];
+  assert(FlagOp.getValueType() == MVT::Flag);
+  FlagOp.Val->removeUser(this);
+  FlagOp = N;
+  FlagOp.Val->Uses.push_back(this);
+}
 
 
 SDOperand SelectionDAG::getLoad(MVT::ValueType VT,