mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-23 20:29:30 +00:00
Fix a case where an earlyclobber operand of an asm
is reused as an input. PR 4118. Testcase is too big, as usual with bugs in this area, but there's one in the PR. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@106816 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
a0ae87fd5d
commit
969b9fe379
@ -2033,6 +2033,21 @@ 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 (MI.getOpcode()==TargetOpcode::INLINEASM) {
|
||||
for (unsigned k=0; k<i; ++k) {
|
||||
MachineOperand &MOk = MI.getOperand(k);
|
||||
if (!MOk.isReg() || MOk.getReg()==0)
|
||||
continue;
|
||||
unsigned VirtRegk = MOk.getReg();
|
||||
if (VirtRegk == PhysReg && MOk.isEarlyClobber()) {
|
||||
CanReuse = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (CanReuse) {
|
||||
// If this stack slot value is already available, reuse it!
|
||||
@ -2103,6 +2118,8 @@ LocalRewriter::RewriteMBB(LiveIntervals *LIs,
|
||||
// To avoid this problem, and to avoid doing a load right after a store,
|
||||
// we emit a copy from PhysReg into the designated register for this
|
||||
// operand.
|
||||
//
|
||||
// This case also applies to an earlyclobber'd PhysReg.
|
||||
unsigned DesignatedReg = VRM->getPhys(VirtReg);
|
||||
assert(DesignatedReg && "Must map virtreg to physreg!");
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user