llvm.org GIT mirror llvm / a80444f
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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@141923 91177308-0d34-0410-b5e6-96231b3b80d8 Jakob Stoklund Olesen 9 years ago
2 changed file(s) with 28 addition(s) and 1 deletion(s). Raw diff Collapse all Expand all
11861186 DEBUG(dbgs() << "\trewrite: " << Idx << '\t' << *MI);
11871187
11881188 // FIXME: Use a second vreg if instruction has no tied ops.
1189 if (Writes && hasLiveDef)
1189 if (Writes) {
1190 if (hasLiveDef)
11901191 insertSpill(NewLI, OldLI, Idx, MI);
1192 else {
1193 // This instruction defines a dead value. We don't need to spill it,
1194 // but do create a live range for the dead value.
1195 VNInfo *VNI = NewLI.getNextValue(Idx, 0, LIS.getVNInfoAllocator());
1196 NewLI.addRange(LiveRange(Idx, Idx.getNextSlot(), VNI));
1197 }
1198 }
11911199
11921200 DEBUG(dbgs() << "\tinterval: " << NewLI << '\n');
11931201 }
0 ; RUN: llc < %s -verify-regalloc
1 ; PR11125
2 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"
3 target triple = "x86_64-apple-macosx10.7"
4
5 ; The inline asm takes %x as a GR32_ABCD virtual register.
6 ; The call to @g forces a spill of that register.
7 ;
8 ; The asm has a dead output tied to %x.
9 ; Verify that the spiller creates a value number for that dead def.
10 ;
11 define void @f(i32 %x) nounwind uwtable ssp {
12 entry:
13 tail call void @g() nounwind
14 %0 = tail call i32 asm sideeffect "foo $0", "=Q,0,~{ebx},~{dirflag},~{fpsr},~{flags}"(i32 %x) nounwind
15 ret void
16 }
17
18 declare void @g()