mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-08 21:32:39 +00:00
Fix a bug in RegsForValue::getCopyToRegs() that causes cyclical scheduling units. If it's creating multiple CopyToReg nodes that are "flagged" together, it should not create a TokenFactor for it's chain outputs:
c1, f1 = CopyToReg c2, f2 = CopyToReg c3 = TokenFactor c1, c2 ... = user c3, ..., f2 Now that the two CopyToReg's and the user are "flagged" together. They effectively forms a single scheduling unit. The TokenFactor is now both an operand and a successor of the Flagged nodes. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@50376 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
1fcfc3b6b2
commit
33bf38ad88
@ -3455,8 +3455,18 @@ void RegsForValue::getCopyToRegs(SDOperand Val, SelectionDAG &DAG,
|
||||
Chains[i] = Part.getValue(0);
|
||||
}
|
||||
|
||||
if (NumRegs == 1)
|
||||
Chain = Chains[0];
|
||||
if (NumRegs == 1 || Flag)
|
||||
// If NumRegs > 1 && Flag is used then the use of the last CopyToReg is
|
||||
// flagged to it. That is the CopyToReg nodes and the user are considered
|
||||
// a single scheduling unit. If we create a TokenFactor and return it as
|
||||
// chain, then the TokenFactor is both a predecessor (operand) of the
|
||||
// user as well as a successor (the TF operands are flagged to the user).
|
||||
// c1, f1 = CopyToReg
|
||||
// c2, f2 = CopyToReg
|
||||
// c3 = TokenFactor c1, c2
|
||||
// ...
|
||||
// = op c3, ..., f2
|
||||
Chain = Chains[NumRegs-1];
|
||||
else
|
||||
Chain = DAG.getNode(ISD::TokenFactor, MVT::Other, &Chains[0], NumRegs);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user