1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc %s -o - -mtriple=x86_64-- | FileCheck %s 3@g = global i32 0 4@effect = global i32 0 5 6define void @switch_phi_const(i32 %x) { 7; CHECK-LABEL: switch_phi_const: 8; CHECK: # %bb.0: # %bb0 9; CHECK-NEXT: # kill: def $edi killed $edi def $rdi 10; CHECK-NEXT: leal -1(%rdi), %ecx 11; CHECK-NEXT: cmpl $54, %ecx 12; CHECK-NEXT: ja .LBB0_8 13; CHECK-NEXT: # %bb.1: # %bb0 14; CHECK-NEXT: movl $42, %eax 15; CHECK-NEXT: jmpq *.LJTI0_0(,%rcx,8) 16; CHECK-NEXT: .LBB0_2: # %case_7 17; CHECK-NEXT: movq g@GOTPCREL(%rip), %rax 18; CHECK-NEXT: movl (%rax), %edi 19; CHECK-NEXT: movq effect@GOTPCREL(%rip), %rax 20; CHECK-NEXT: movl $7, (%rax) 21; CHECK-NEXT: .LBB0_3: # %case_1_loop 22; CHECK-NEXT: movq effect@GOTPCREL(%rip), %rax 23; CHECK-NEXT: movl $1, (%rax) 24; CHECK-NEXT: .LBB0_4: # %case_5 25; CHECK-NEXT: movq effect@GOTPCREL(%rip), %rax 26; CHECK-NEXT: movl $5, (%rax) 27; CHECK-NEXT: .LBB0_5: # %case_13 28; CHECK-NEXT: movq effect@GOTPCREL(%rip), %rax 29; CHECK-NEXT: movl $13, (%rax) 30; CHECK-NEXT: .LBB0_6: # %case_42 31; CHECK-NEXT: movq effect@GOTPCREL(%rip), %rax 32; CHECK-NEXT: movl %edi, (%rax) 33; CHECK-NEXT: movl $55, %eax 34; CHECK-NEXT: .LBB0_7: # %case_55 35; CHECK-NEXT: movq effect@GOTPCREL(%rip), %rcx 36; CHECK-NEXT: movl %eax, (%rcx) 37; CHECK-NEXT: .LBB0_8: # %default 38; CHECK-NEXT: retq 39bb0: 40 switch i32 %x, label %default [ 41 i32 1, label %case_1_loop 42 i32 5, label %case_5 43 i32 7, label %case_7 44 i32 13, label %case_13 45 i32 42, label %case_42 46 i32 55, label %case_55 47 ] 48 49case_1_loop: 50 ; We should replace 1 with %x 51 %x0 = phi i32 [ 1, %bb0 ], [ %x5, %case_7 ] 52 store i32 1, i32* @effect, align 4 53 br label %case_5 54 55case_5: 56 ; We should replace 5 with %x 57 %x1 = phi i32 [ 5, %bb0 ], [ %x0, %case_1_loop ] 58 store i32 5, i32* @effect, align 4 59 br label %case_13 60 61case_13: 62 ; We should replace 13 with %x 63 %x2 = phi i32 [ 13, %bb0 ], [ %x1, %case_5 ] 64 store i32 13, i32* @effect, align 4 65 br label %case_42 66 67case_42: 68 ; We should replace 42 with %x 69 %x3 = phi i32 [ 42, %bb0 ], [ %x2, %case_13 ] 70 store i32 %x3, i32* @effect, align 4 71 br label %case_55 72 73case_55: 74 ; We must not replace any of the PHI arguments! 75 %x4 = phi i32 [ 42, %bb0 ], [ 55, %case_42 ] 76 store i32 %x4, i32* @effect, align 4 77 br label %default 78 79case_7: 80 %x5 = load i32, i32* @g, align 4 81 store i32 7, i32* @effect, align 4 82 br label %case_1_loop 83 84default: 85 ret void 86} 87 88@g64 = global i64 0 89@effect64 = global i64 0 90 91define void @switch_trunc_phi_const(i32 %x) { 92; CHECK-LABEL: switch_trunc_phi_const: 93; CHECK: # %bb.0: # %bb0 94; CHECK-NEXT: movzbl %dil, %r8d 95; CHECK-NEXT: movl $3895, %ecx # imm = 0xF37 96; CHECK-NEXT: movl $42, %esi 97; CHECK-NEXT: movl $13, %edx 98; CHECK-NEXT: movl $5, %edi 99; CHECK-NEXT: movl $1, %eax 100; CHECK-NEXT: decl %r8d 101; CHECK-NEXT: cmpl $54, %r8d 102; CHECK-NEXT: ja .LBB1_8 103; CHECK-NEXT: # %bb.1: # %bb0 104; CHECK-NEXT: jmpq *.LJTI1_0(,%r8,8) 105; CHECK-NEXT: .LBB1_8: # %default 106; CHECK-NEXT: retq 107; CHECK-NEXT: .LBB1_2: # %case_1_loop 108; CHECK-NEXT: movq effect64@GOTPCREL(%rip), %rcx 109; CHECK-NEXT: movq $1, (%rcx) 110; CHECK-NEXT: movq %rax, %rdi 111; CHECK-NEXT: .LBB1_3: # %case_5 112; CHECK-NEXT: movq effect64@GOTPCREL(%rip), %rax 113; CHECK-NEXT: movq $5, (%rax) 114; CHECK-NEXT: movq %rdi, %rdx 115; CHECK-NEXT: .LBB1_4: # %case_13 116; CHECK-NEXT: movq effect64@GOTPCREL(%rip), %rax 117; CHECK-NEXT: movq $13, (%rax) 118; CHECK-NEXT: movq %rdx, %rsi 119; CHECK-NEXT: .LBB1_5: # %case_42 120; CHECK-NEXT: movq effect64@GOTPCREL(%rip), %rax 121; CHECK-NEXT: movq %rsi, (%rax) 122; CHECK-NEXT: movl $55, %ecx 123; CHECK-NEXT: .LBB1_6: # %case_55 124; CHECK-NEXT: movq effect64@GOTPCREL(%rip), %rax 125; CHECK-NEXT: movq %rcx, (%rax) 126; CHECK-NEXT: .LBB1_7: # %case_7 127; CHECK-NEXT: movq g64@GOTPCREL(%rip), %rax 128; CHECK-NEXT: movq (%rax), %rax 129; CHECK-NEXT: movq effect64@GOTPCREL(%rip), %rcx 130; CHECK-NEXT: movq $7, (%rcx) 131; CHECK-NEXT: jmp .LBB1_2 132bb0: 133 %x_trunc = trunc i32 %x to i8 134 switch i8 %x_trunc, label %default [ 135 i8 1, label %case_1_loop 136 i8 5, label %case_5 137 i8 7, label %case_7 138 i8 13, label %case_13 139 i8 42, label %case_42 140 i8 55, label %case_55 141 ] 142 143case_1_loop: 144 ; We should replace 1 with %x 145 %x0 = phi i64 [ 1, %bb0 ], [ %x5, %case_7 ] 146 store i64 1, i64* @effect64, align 4 147 br label %case_5 148 149case_5: 150 ; We should replace 5 with %x 151 %x1 = phi i64 [ 5, %bb0 ], [ %x0, %case_1_loop ] 152 store i64 5, i64* @effect64, align 4 153 br label %case_13 154 155case_13: 156 ; We should replace 13 with %x 157 %x2 = phi i64 [ 13, %bb0 ], [ %x1, %case_5 ] 158 store i64 13, i64* @effect64, align 4 159 br label %case_42 160 161case_42: 162 ; We should replace 42 with %x 163 %x3 = phi i64 [ 42, %bb0 ], [ %x2, %case_13 ] 164 store i64 %x3, i64* @effect64, align 4 165 br label %case_55 166 167case_55: 168 ; We must not replace any of the PHI arguments! (3898 == 0xf00 + 55) 169 %x4 = phi i64 [ 3895, %bb0 ], [ 55, %case_42 ] 170 store i64 %x4, i64* @effect64, align 4 171 br label %case_7 172 173case_7: 174 %x5 = load i64, i64* @g64, align 4 175 store i64 7, i64* @effect64, align 4 176 br label %case_1_loop 177 178default: 179 ret void 180} 181