[llvm-commits] [llvm] r79090 - in /llvm/trunk: lib/CodeGen/VirtRegRewriter.cpp test/CodeGen/Blackfin/2009-08-15-MissingDead.ll

Jakob Stoklund Olesen stoklund at 2pi.dk
Sat Aug 15 04:03:03 PDT 2009


Author: stoklund
Date: Sat Aug 15 06:03:03 2009
New Revision: 79090

URL: http://llvm.org/viewvc/llvm-project?rev=79090&view=rev
Log:
Update LocalRewriter::DistanceMap when inserting stack loads.

In the included test case, a stack load was not included in DistanceMap. That
caused TransferDeadness to ignore the instruction, leading to a scavenger
assert.

Added:
    llvm/trunk/test/CodeGen/Blackfin/2009-08-15-MissingDead.ll
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=79090&r1=79089&r2=79090&view=diff

==============================================================================
--- llvm/trunk/lib/CodeGen/VirtRegRewriter.cpp (original)
+++ llvm/trunk/lib/CodeGen/VirtRegRewriter.cpp Sat Aug 15 06:03:03 2009
@@ -1587,6 +1587,7 @@
           MachineInstr *LoadMI = prior(InsertLoc);
           VRM.addSpillSlotUse(SS, LoadMI);
           ++NumPSpills;
+          DistanceMap.insert(std::make_pair(LoadMI, Dist++));
         }
         NextMII = next(MII);
       }
@@ -1678,6 +1679,7 @@
             MachineInstr *LoadMI = prior(InsertLoc);
             VRM.addSpillSlotUse(SSorRMId, LoadMI);
             ++NumLoads;
+            DistanceMap.insert(std::make_pair(LoadMI, Dist++));
           }
 
           // This invalidates Phys.
@@ -1977,6 +1979,7 @@
             MachineInstr *LoadMI = prior(InsertLoc);
             VRM.addSpillSlotUse(SSorRMId, LoadMI);
             ++NumLoads;
+            DistanceMap.insert(std::make_pair(LoadMI, Dist++));
           }
           // This invalidates PhysReg.
           Spills.ClobberPhysReg(PhysReg);

Added: llvm/trunk/test/CodeGen/Blackfin/2009-08-15-MissingDead.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Blackfin/2009-08-15-MissingDead.ll?rev=79090&view=auto

==============================================================================
--- llvm/trunk/test/CodeGen/Blackfin/2009-08-15-MissingDead.ll (added)
+++ llvm/trunk/test/CodeGen/Blackfin/2009-08-15-MissingDead.ll Sat Aug 15 06:03:03 2009
@@ -0,0 +1,25 @@
+; RUN: llvm-as < %s | llc -march=bfin -verify-machineinstrs
+
+; LocalRewriter can forget to transfer a <def,dead> flag when setting up call
+; argument registers. This then causes register scavenger asserts.
+
+declare i32 @printf(i8*, i32, float)
+
+define i32 @testissue(i32 %i, float %x, float %y) {
+  br label %bb1
+
+bb1:                                              ; preds = %bb1, %0
+  %x2 = fmul float %x, 5.000000e-01               ; <float> [#uses=1]
+  %y2 = fmul float %y, 0x3FECCCCCC0000000         ; <float> [#uses=1]
+  %z2 = fadd float %x2, %y2                       ; <float> [#uses=1]
+  %z3 = fadd float undef, %z2                     ; <float> [#uses=1]
+  %i1 = shl i32 %i, 3                             ; <i32> [#uses=1]
+  %j1 = add i32 %i, 7                             ; <i32> [#uses=1]
+  %m1 = add i32 %i1, %j1                          ; <i32> [#uses=2]
+  %b = icmp sle i32 %m1, 6                        ; <i1> [#uses=1]
+  br i1 %b, label %bb1, label %bb2
+
+bb2:                                              ; preds = %bb1
+  %1 = call i32 @printf(i8* undef, i32 %m1, float %z3); <i32> [#uses=0]
+  ret i32 0
+}





More information about the llvm-commits mailing list