[llvm-branch-commits] [llvm-branch] r80552 - in /llvm/branches/release_26: lib/CodeGen/VirtRegRewriter.cpp test/CodeGen/X86/2009-08-23-SubRegReuseUndo.ll
Tanya Lattner
tonic at nondot.org
Sun Aug 30 23:29:32 PDT 2009
Author: tbrethou
Date: Mon Aug 31 01:29:32 2009
New Revision: 80552
URL: http://llvm.org/viewvc/llvm-project?rev=80552&view=rev
Log:
Merge from mainline.
When undoing a reuse in ReuseInfo::GetRegForReload, check if it was only a
sub-register being used. The MachineOperand::getSubReg() method is only valid
for virtual registers, so we have to recover the sub-register index manually.
Added:
llvm/branches/release_26/test/CodeGen/X86/2009-08-23-SubRegReuseUndo.ll
- copied unchanged from r79855, llvm/trunk/test/CodeGen/X86/2009-08-23-SubRegReuseUndo.ll
Modified:
llvm/branches/release_26/lib/CodeGen/VirtRegRewriter.cpp
Modified: llvm/branches/release_26/lib/CodeGen/VirtRegRewriter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/release_26/lib/CodeGen/VirtRegRewriter.cpp?rev=80552&r1=80551&r2=80552&view=diff
==============================================================================
--- llvm/branches/release_26/lib/CodeGen/VirtRegRewriter.cpp (original)
+++ llvm/branches/release_26/lib/CodeGen/VirtRegRewriter.cpp Mon Aug 31 01:29:32 2009
@@ -803,6 +803,21 @@
ReusedOp NewOp = Op;
Reuses.erase(Reuses.begin()+ro);
+ // MI may be using only a sub-register of PhysRegUsed.
+ unsigned RealPhysRegUsed = MI->getOperand(NewOp.Operand).getReg();
+ unsigned SubIdx = 0;
+ assert(TargetRegisterInfo::isPhysicalRegister(RealPhysRegUsed) &&
+ "A reuse cannot be a virtual register");
+ if (PRRU != RealPhysRegUsed) {
+ // What was the sub-register index?
+ unsigned SubReg;
+ for (SubIdx = 1; (SubReg = TRI->getSubReg(PRRU, SubIdx)); SubIdx++)
+ if (SubReg == RealPhysRegUsed)
+ break;
+ assert(SubReg == RealPhysRegUsed &&
+ "Operand physreg is not a sub-register of PhysRegUsed");
+ }
+
// Ok, we're going to try to reload the assigned physreg into the
// slot that we were supposed to in the first place. However, that
// register could hold a reuse. Check to see if it conflicts or
@@ -835,7 +850,6 @@
Spills.ClobberPhysReg(NewPhysReg);
Spills.ClobberPhysReg(NewOp.PhysRegReused);
- unsigned SubIdx = MI->getOperand(NewOp.Operand).getSubReg();
unsigned RReg = SubIdx ? TRI->getSubReg(NewPhysReg, SubIdx) : NewPhysReg;
MI->getOperand(NewOp.Operand).setReg(RReg);
MI->getOperand(NewOp.Operand).setSubReg(0);
More information about the llvm-branch-commits
mailing list