mirror of
https://github.com/RPCSX/llvm.git
synced 2025-01-03 18:29:08 +00:00
A REG_SEQUENCE instruction may use the same register twice.
If we are emitting COPY instructions for the REG_SEQUENCE, make sure the kill flag goes on the last COPY. Otherwise we may be using a killed register. <rdar://problem/8287792> git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@110589 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
9de1ac267e
commit
e4b9c4f187
@ -1446,7 +1446,17 @@ bool TwoAddressInstructionPass::EliminateRegSequences() {
|
|||||||
//
|
//
|
||||||
// If the REG_SEQUENCE doesn't kill its source, keeping live variables
|
// If the REG_SEQUENCE doesn't kill its source, keeping live variables
|
||||||
// correctly up to date becomes very difficult. Insert a copy.
|
// correctly up to date becomes very difficult. Insert a copy.
|
||||||
//
|
|
||||||
|
// Defer any kill flag to the last operand using SrcReg. Otherwise, we
|
||||||
|
// might insert a COPY that uses SrcReg after is was killed.
|
||||||
|
if (isKill)
|
||||||
|
for (unsigned j = i + 2; j < e; j += 2)
|
||||||
|
if (MI->getOperand(j).getReg() == SrcReg) {
|
||||||
|
MI->getOperand(j).setIsKill();
|
||||||
|
isKill = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
MachineBasicBlock::iterator InsertLoc = MI;
|
MachineBasicBlock::iterator InsertLoc = MI;
|
||||||
MachineInstr *CopyMI = BuildMI(*MI->getParent(), InsertLoc,
|
MachineInstr *CopyMI = BuildMI(*MI->getParent(), InsertLoc,
|
||||||
MI->getDebugLoc(), TII->get(TargetOpcode::COPY))
|
MI->getDebugLoc(), TII->get(TargetOpcode::COPY))
|
||||||
|
Loading…
Reference in New Issue
Block a user