aboutsummaryrefslogtreecommitdiff
path: root/llvm/test/CodeGen/X86/switch-phi-const.ll
blob: dba7666a14fc75e2834f1c4eb1ad0bc80d581d5e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc %s -o - -mtriple=x86_64-- | FileCheck %s
@g = global i32 0
@effect = global i32 0

define void @switch_phi_const(i32 %x) {
; CHECK-LABEL: switch_phi_const:
; CHECK:       # %bb.0: # %bb0
; CHECK-NEXT:    # kill: def $edi killed $edi def $rdi
; CHECK-NEXT:    leal -1(%rdi), %eax
; CHECK-NEXT:    cmpl $54, %eax
; CHECK-NEXT:    ja .LBB0_9
; CHECK-NEXT:  # %bb.1: # %bb0
; CHECK-NEXT:    jmpq *.LJTI0_0(,%rax,8)
; CHECK-NEXT:  .LBB0_3: # %case_7
; CHECK-NEXT:    movq g@GOTPCREL(%rip), %rax
; CHECK-NEXT:    movl (%rax), %edi
; CHECK-NEXT:    movq effect@GOTPCREL(%rip), %rax
; CHECK-NEXT:    movl $7, (%rax)
; CHECK-NEXT:  .LBB0_4: # %case_1_loop
; CHECK-NEXT:    movq effect@GOTPCREL(%rip), %rax
; CHECK-NEXT:    movl $1, (%rax)
; CHECK-NEXT:  .LBB0_5: # %case_5
; CHECK-NEXT:    movq effect@GOTPCREL(%rip), %rax
; CHECK-NEXT:    movl $5, (%rax)
; CHECK-NEXT:  .LBB0_6: # %case_13
; CHECK-NEXT:    movq effect@GOTPCREL(%rip), %rax
; CHECK-NEXT:    movl $13, (%rax)
; CHECK-NEXT:  .LBB0_7: # %case_42
; CHECK-NEXT:    movq effect@GOTPCREL(%rip), %rax
; CHECK-NEXT:    movl %edi, (%rax)
; CHECK-NEXT:    movl $55, %eax
; CHECK-NEXT:  .LBB0_8: # %case_55
; CHECK-NEXT:    movq effect@GOTPCREL(%rip), %rcx
; CHECK-NEXT:    movl %eax, (%rcx)
; CHECK-NEXT:  .LBB0_9: # %default
; CHECK-NEXT:    retq
; CHECK-NEXT:  .LBB0_2:
; CHECK-NEXT:    movl $42, %eax
; CHECK-NEXT:    jmp .LBB0_8
bb0:
  switch i32 %x, label %default [
  i32 1, label %case_1_loop
  i32 5, label %case_5
  i32 7, label %case_7
  i32 13, label %case_13
  i32 42, label %case_42
  i32 55, label %case_55
  ]

case_1_loop:
  ; We should replace 1 with %x
  %x0 = phi i32 [ 1, %bb0 ], [ %x5, %case_7 ]
  store i32 1, ptr @effect, align 4
  br label %case_5

case_5:
  ; We should replace 5 with %x
  %x1 = phi i32 [ 5, %bb0 ], [ %x0, %case_1_loop ]
  store i32 5, ptr @effect, align 4
  br label %case_13

case_13:
  ; We should replace 13 with %x
  %x2 = phi i32 [ 13, %bb0 ], [ %x1, %case_5 ]
  store i32 13, ptr @effect, align 4
  br label %case_42

case_42:
  ; We should replace 42 with %x
  %x3 = phi i32 [ 42, %bb0 ], [ %x2, %case_13 ]
  store i32 %x3, ptr @effect, align 4
  br label %case_55

case_55:
  ; We must not replace any of the PHI arguments!
  %x4 = phi i32 [ 42, %bb0 ], [ 55, %case_42 ]
  store i32 %x4, ptr @effect, align 4
  br label %default

case_7:
  %x5 = load i32, ptr @g, align 4
  store i32 7, ptr @effect, align 4
  br label %case_1_loop

default:
  ret void
}

@g64 = global i64 0
@effect64 = global i64 0

define void @switch_trunc_phi_const(i32 %x) {
; CHECK-LABEL: switch_trunc_phi_const:
; CHECK:       # %bb.0: # %bb0
; CHECK-NEXT:    movzbl %dil, %eax
; CHECK-NEXT:    leal -1(%rax), %ecx
; CHECK-NEXT:    cmpl $54, %ecx
; CHECK-NEXT:    ja .LBB1_9
; CHECK-NEXT:  # %bb.1: # %bb0
; CHECK-NEXT:    jmpq *.LJTI1_0(,%rcx,8)
; CHECK-NEXT:  .LBB1_2:
; CHECK-NEXT:    movl $3895, %eax # imm = 0xF37
; CHECK-NEXT:    jmp .LBB1_7
; CHECK-NEXT:  .LBB1_9: # %default
; CHECK-NEXT:    retq
; CHECK-NEXT:  .LBB1_3: # %case_1_loop
; CHECK-NEXT:    movq effect64@GOTPCREL(%rip), %rcx
; CHECK-NEXT:    movq $1, (%rcx)
; CHECK-NEXT:  .LBB1_4: # %case_5
; CHECK-NEXT:    movq effect64@GOTPCREL(%rip), %rcx
; CHECK-NEXT:    movq $5, (%rcx)
; CHECK-NEXT:  .LBB1_5: # %case_13
; CHECK-NEXT:    movq effect64@GOTPCREL(%rip), %rcx
; CHECK-NEXT:    movq $13, (%rcx)
; CHECK-NEXT:  .LBB1_6: # %case_42
; CHECK-NEXT:    movq effect64@GOTPCREL(%rip), %rcx
; CHECK-NEXT:    movq %rax, (%rcx)
; CHECK-NEXT:    movl $55, %eax
; CHECK-NEXT:  .LBB1_7: # %case_55
; CHECK-NEXT:    movq effect64@GOTPCREL(%rip), %rcx
; CHECK-NEXT:    movq %rax, (%rcx)
; CHECK-NEXT:  .LBB1_8: # %case_7
; CHECK-NEXT:    movq g64@GOTPCREL(%rip), %rax
; CHECK-NEXT:    movq (%rax), %rax
; CHECK-NEXT:    movq effect64@GOTPCREL(%rip), %rcx
; CHECK-NEXT:    movq $7, (%rcx)
; CHECK-NEXT:    jmp .LBB1_3
bb0:
  %x_trunc = trunc i32 %x to i8
  switch i8 %x_trunc, label %default [
  i8 1, label %case_1_loop
  i8 5, label %case_5
  i8 7, label %case_7
  i8 13, label %case_13
  i8 42, label %case_42
  i8 55, label %case_55
  ]

case_1_loop:
  ; We should replace 1 with %x
  %x0 = phi i64 [ 1, %bb0 ], [ %x5, %case_7 ]
  store i64 1, ptr @effect64, align 4
  br label %case_5

case_5:
  ; We should replace 5 with %x
  %x1 = phi i64 [ 5, %bb0 ], [ %x0, %case_1_loop ]
  store i64 5, ptr @effect64, align 4
  br label %case_13

case_13:
  ; We should replace 13 with %x
  %x2 = phi i64 [ 13, %bb0 ], [ %x1, %case_5 ]
  store i64 13, ptr @effect64, align 4
  br label %case_42

case_42:
  ; We should replace 42 with %x
  %x3 = phi i64 [ 42, %bb0 ], [ %x2, %case_13 ]
  store i64 %x3, ptr @effect64, align 4
  br label %case_55

case_55:
  ; We must not replace any of the PHI arguments! (3898 == 0xf00 + 55)
  %x4 = phi i64 [ 3895, %bb0 ], [ 55, %case_42 ]
  store i64 %x4, ptr @effect64, align 4
  br label %case_7

case_7:
  %x5 = load i64, ptr @g64, align 4
  store i64 7, ptr @effect64, align 4
  br label %case_1_loop

default:
  ret void
}