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