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:
Dale Johannesen 2010-06-25 00:49:43 +00:00
parent a0ae87fd5d
commit 969b9fe379

View File

@ -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!");