[llvm-commits] CVS: llvm/lib/CodeGen/VirtRegMap.cpp

Chris Lattner lattner at cs.uiuc.edu
Thu Oct 14 20:19:42 PDT 2004



Changes in directory llvm/lib/CodeGen:

VirtRegMap.cpp updated: 1.31 -> 1.32
---
Log message:

This patch fixes the nasty bug that caused 175.vpr to fail for X86 last night.

The problem occurred when trying to reload this instruction:

MOV32mr %reg2326, 8, %reg2297, 4, %reg2295

The value of reg2326 was available in EBX, so it was reused from there, instead 
of reloading it into EDX.

The value of reg2297 was available in EDX, so it was reused from there, instead
of reloading it into EDI.

The value of reg2295 was not available, so we tried reloading it into EBX, its
assigned register.  However, we checked and saw that we already reloaded
something into EBX, so we chose what reg2326 was assigned to (EDX) and reloaded 
into that register instead.

Unfortunately EDX had already been used by reg2297, so reloading into EDX 
clobbered the value used by the reg2326 operand, breaking the program.

The fix for this is to check that the newly picked register is ok.  In this 
case we now find that EDX is already used and try using EDI, which succeeds.



---
Diffs of the changes:  (+2 -1)

Index: llvm/lib/CodeGen/VirtRegMap.cpp
diff -u llvm/lib/CodeGen/VirtRegMap.cpp:1.31 llvm/lib/CodeGen/VirtRegMap.cpp:1.32
--- llvm/lib/CodeGen/VirtRegMap.cpp:1.31	Thu Oct 14 22:16:29 2004
+++ llvm/lib/CodeGen/VirtRegMap.cpp	Thu Oct 14 22:19:31 2004
@@ -352,6 +352,7 @@
               // Otherwise, reload it and remember that we have it.
               PhysReg = VRM.getPhys(VirtReg);
 
+            RecheckRegister:
               // Note that, if we reused a register for a previous operand, the
               // register we want to reload into might not actually be
               // available.  If this occurs, use the register indicated by the
@@ -361,7 +362,7 @@
                   if (ReusedOperands[ro].PhysRegReused == PhysReg) {
                     // Yup, use the reload register that we didn't use before.
                     PhysReg = ReusedOperands[ro].AssignedPhysReg;
-                    break;
+                    goto RecheckRegister;
                   } else {
                     ReusedOp &Op = ReusedOperands[ro];
                     unsigned PRRU = Op.PhysRegReused;






More information about the llvm-commits mailing list