[llvm-commits] [llvm] r106816 - /llvm/trunk/lib/CodeGen/VirtRegRewriter.cpp
Dale Johannesen
dalej at apple.com
Thu Jun 24 17:49:43 PDT 2010
Author: johannes
Date: Thu Jun 24 19:49:43 2010
New Revision: 106816
URL: http://llvm.org/viewvc/llvm-project?rev=106816&view=rev
Log:
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.
Modified:
llvm/trunk/lib/CodeGen/VirtRegRewriter.cpp
Modified: llvm/trunk/lib/CodeGen/VirtRegRewriter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/VirtRegRewriter.cpp?rev=106816&r1=106815&r2=106816&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/VirtRegRewriter.cpp (original)
+++ llvm/trunk/lib/CodeGen/VirtRegRewriter.cpp Thu Jun 24 19:49:43 2010
@@ -2033,6 +2033,21 @@
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 @@
// 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!");
More information about the llvm-commits
mailing list