; REQUIRES: asserts ; RUN: llc -mtriple=thumbv6m -regalloc=greedy -stats < %s 2>&1 | FileCheck %s ; Undef incoming values to phis end up creating IMPLICIT_DEF values. If we don't ; prefer them to be in a register then we get fewer spilled live ranges (6 ; compared to 7). ; CHECK: 6 regalloc - Number of spilled live ranges declare i32 @otherfn(i32) define void @fn(i32 %val, i32* %ptr) { entry: %gep1 = getelementptr i32, i32* %ptr, i32 0 %gep2 = getelementptr i32, i32* %ptr, i32 1 %gep3 = getelementptr i32, i32* %ptr, i32 2 %gep4 = getelementptr i32, i32* %ptr, i32 3 %gep5 = getelementptr i32, i32* %ptr, i32 4 %gep6 = getelementptr i32, i32* %ptr, i32 5 %gep7 = getelementptr i32, i32* %ptr, i32 6 %gep8 = getelementptr i32, i32* %ptr, i32 7 %cmp1 = icmp uge i32 %val, 3 br i1 %cmp1, label %if, label %then if: %val1 = load i32, i32* %gep1, align 4 %val2 = load i32, i32* %gep2, align 4 %val3 = load i32, i32* %gep3, align 4 %val4 = load i32, i32* %gep4, align 4 %val5 = load i32, i32* %gep5, align 4 %val6 = load i32, i32* %gep6, align 4 %val7 = load i32, i32* %gep7, align 4 %val8 = load i32, i32* %gep8, align 4 br label %then then: %phi1a = phi i32 [ %val1, %if ], [ undef, %entry ] %phi2a = phi i32 [ %val2, %if ], [ undef, %entry ] %phi3a = phi i32 [ %val3, %if ], [ undef, %entry ] %phi4a = phi i32 [ %val4, %if ], [ undef, %entry ] %phi5a = phi i32 [ %val5, %if ], [ undef, %entry ] %phi6a = phi i32 [ %val6, %if ], [ undef, %entry ] %phi7a = phi i32 [ %val7, %if ], [ undef, %entry ] %phi8a = phi i32 [ %val8, %if ], [ undef, %entry ] %switchval = call i32 @otherfn(i32 %val) switch i32 %switchval, label %default [ i32 0, label %case0 i32 1, label %case1 i32 5, label %case5 i32 6, label %case6 i32 7, label %case7 i32 8, label %case8 ] default: br label %switchend case0: br label %switchend case1: br label %switchend case5: br label %switchend case6: br label %switchend case7: br label %switchend case8: br label %switchend switchend: %phi1b = phi i32 [ 0, %default ], [ undef, %case0 ], [ undef, %case1 ], [ %phi1a, %case5 ], [ 1, %case6 ], [ 2, %case7 ], [ 1, %case8 ] %phi2b = phi i32 [ 0, %default ], [ undef, %case0 ], [ undef, %case1 ], [ %phi2a, %case5 ], [ 2, %case6 ], [ 2, %case7 ], [ 1, %case8 ] %phi3b = phi i32 [ 0, %default ], [ undef, %case0 ], [ undef, %case1 ], [ %phi3a, %case5 ], [ 3, %case6 ], [ 2, %case7 ], [ 1, %case8 ] %phi4b = phi i32 [ 0, %default ], [ undef, %case0 ], [ undef, %case1 ], [ %phi4a, %case5 ], [ 4, %case6 ], [ 2, %case7 ], [ 1, %case8 ] %phi5b = phi i32 [ 0, %default ], [ undef, %case0 ], [ undef, %case1 ], [ %phi5a, %case5 ], [ 5, %case6 ], [ 2, %case7 ], [ 1, %case8 ] %phi6b = phi i32 [ 0, %default ], [ undef, %case0 ], [ undef, %case1 ], [ %phi6a, %case5 ], [ 6, %case6 ], [ 2, %case7 ], [ 1, %case8 ] %phi7b = phi i32 [ 0, %default ], [ undef, %case0 ], [ undef, %case1 ], [ %phi7a, %case5 ], [ 7, %case6 ], [ 2, %case7 ], [ 1, %case8 ] %phi8b = phi i32 [ 0, %default ], [ undef, %case0 ], [ undef, %case1 ], [ %phi8a, %case5 ], [ 8, %case6 ], [ 2, %case7 ], [ 1, %case8 ] %cmp2 = icmp uge i32 %val, 4 br i1 %cmp2, label %if2, label %end if2: store i32 %phi1b, i32* %gep1, align 4 store i32 %phi2b, i32* %gep2, align 4 store i32 %phi3b, i32* %gep3, align 4 store i32 %phi4b, i32* %gep4, align 4 store i32 %phi5b, i32* %gep5, align 4 store i32 %phi6b, i32* %gep6, align 4 store i32 %phi7b, i32* %gep7, align 4 store i32 %phi8b, i32* %gep8, align 4 br label %end end: ret void }