mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-28 03:25:23 +00:00
Fix an infinite loop I caused by making sure to legalize the flag operand
of CALLSEQ_* nodes git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@25582 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -823,6 +823,13 @@ SDOperand SelectionDAGLegalize::LegalizeOp(SDOperand Op) {
|
|||||||
Tmp2 = Node->getOperand(0);
|
Tmp2 = Node->getOperand(0);
|
||||||
if (Tmp1 != Tmp2)
|
if (Tmp1 != Tmp2)
|
||||||
Node->setAdjCallChain(Tmp1);
|
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
|
// 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
|
// nodes are treated specially and are mutated in place. This makes the dag
|
||||||
@@ -1365,7 +1372,8 @@ SDOperand SelectionDAGLegalize::LegalizeOp(SDOperand Op) {
|
|||||||
Tmp2,
|
Tmp2,
|
||||||
Node->getOperand(3));
|
Node->getOperand(3));
|
||||||
}
|
}
|
||||||
Node = Result.Val;
|
Result = LegalizeOp(Result);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (getTypeAction(Node->getOperand(1).getValueType())) {
|
switch (getTypeAction(Node->getOperand(1).getValueType())) {
|
||||||
|
@@ -1276,6 +1276,19 @@ void SDNode::setAdjCallChain(SDOperand N) {
|
|||||||
OperandList[0].Val->Uses.push_back(this);
|
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,
|
SDOperand SelectionDAG::getLoad(MVT::ValueType VT,
|
||||||
|
Reference in New Issue
Block a user