mirror of
https://github.com/RPCS3/llvm.git
synced 2025-01-08 13:00:50 +00:00
VirtRegRewriter checks for early clobbers before it reuses an available stack
slot. Teach it to also check for early clobbered aliases, and early clobber operands following the current operand. This fixes the miscompilation in PR8044 where EC registers eax and ecx were being used for inputs. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@112988 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
82de2e1a24
commit
1e3aeefc08
@ -2027,14 +2027,16 @@ LocalRewriter::RewriteMBB(LiveIntervals *LIs,
|
||||
CanReuse = !ReusedOperands.isClobbered(PhysReg) &&
|
||||
Spills.canClobberPhysReg(PhysReg);
|
||||
}
|
||||
// If this is an asm, and PhysReg is used elsewhere as an earlyclobber
|
||||
// operand, we can't also use it as an input. (Outputs always come
|
||||
// before inputs, so we can stop looking at i.)
|
||||
// If this is an asm, and a PhysReg alias is used elsewhere as an
|
||||
// earlyclobber operand, we can't also use it as an input.
|
||||
if (MI.isInlineAsm()) {
|
||||
for (unsigned k=0; k<i; ++k) {
|
||||
for (unsigned k = 0, e = MI.getNumOperands(); k != e; ++k) {
|
||||
MachineOperand &MOk = MI.getOperand(k);
|
||||
if (MOk.isReg() && MOk.getReg()==PhysReg && MOk.isEarlyClobber()) {
|
||||
if (MOk.isReg() && MOk.isEarlyClobber() &&
|
||||
TRI->regsOverlap(MOk.getReg(), PhysReg)) {
|
||||
CanReuse = false;
|
||||
DEBUG(dbgs() << "Not reusing physreg " << TRI->getName(PhysReg)
|
||||
<< " for vreg" << VirtReg << ": " << MOk << '\n');
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user