[llvm-commits] [llvm] r141923 - in /llvm/trunk: lib/CodeGen/InlineSpiller.cpp test/CodeGen/X86/2011-10-11-SpillDead.ll

Jakob Stoklund Olesen stoklund at 2pi.dk
Thu Oct 13 17:34:31 PDT 2011


Author: stoklund
Date: Thu Oct 13 19:34:31 2011
New Revision: 141923

URL: http://llvm.org/viewvc/llvm-project?rev=141923&view=rev
Log:
Add value numbers when spilling dead defs.

When spilling around an instruction with a dead def, remember to add a
value number for the def.

The missing value number wouldn't normally create problems since there
would be an incoming live range as well.  However, due to another bug
we could spill a dead V_SET0 instruction which doesn't read any values.

The missing value number caused an empty live range to be created which
is dangerous since it doesn't interfere with anything.

This fixes part of PR11125.

Added:
    llvm/trunk/test/CodeGen/X86/2011-10-11-SpillDead.ll
Modified:
    llvm/trunk/lib/CodeGen/InlineSpiller.cpp

Modified: llvm/trunk/lib/CodeGen/InlineSpiller.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/InlineSpiller.cpp?rev=141923&r1=141922&r2=141923&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/InlineSpiller.cpp (original)
+++ llvm/trunk/lib/CodeGen/InlineSpiller.cpp Thu Oct 13 19:34:31 2011
@@ -1187,8 +1187,16 @@
     DEBUG(dbgs() << "\trewrite: " << Idx << '\t' << *MI);
 
     // FIXME: Use a second vreg if instruction has no tied ops.
-    if (Writes && hasLiveDef)
+    if (Writes) {
+     if (hasLiveDef)
       insertSpill(NewLI, OldLI, Idx, MI);
+     else {
+       // This instruction defines a dead value.  We don't need to spill it,
+       // but do create a live range for the dead value.
+       VNInfo *VNI = NewLI.getNextValue(Idx, 0, LIS.getVNInfoAllocator());
+       NewLI.addRange(LiveRange(Idx, Idx.getNextSlot(), VNI));
+     }
+    }
 
     DEBUG(dbgs() << "\tinterval: " << NewLI << '\n');
   }

Added: llvm/trunk/test/CodeGen/X86/2011-10-11-SpillDead.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/2011-10-11-SpillDead.ll?rev=141923&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/X86/2011-10-11-SpillDead.ll (added)
+++ llvm/trunk/test/CodeGen/X86/2011-10-11-SpillDead.ll Thu Oct 13 19:34:31 2011
@@ -0,0 +1,19 @@
+; RUN: llc < %s -verify-regalloc
+; PR11125
+target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
+target triple = "x86_64-apple-macosx10.7"
+
+; The inline asm takes %x as a GR32_ABCD virtual register.
+; The call to @g forces a spill of that register.
+;
+; The asm has a dead output tied to %x.
+; Verify that the spiller creates a value number for that dead def.
+;
+define void @f(i32 %x) nounwind uwtable ssp {
+entry:
+  tail call void @g() nounwind
+  %0 = tail call i32 asm sideeffect "foo $0", "=Q,0,~{ebx},~{dirflag},~{fpsr},~{flags}"(i32 %x) nounwind
+  ret void
+}
+
+declare void @g()





More information about the llvm-commits mailing list