73
73
ret i32 %phi
74
74
}
75
75
76
- define i32 @test_duplicate_successors_phi_3 (i1 %c1 , i32 %x ) {
76
+ define i32 @test_duplicate_successors_phi_3 (i1 %c1 , i32* %p , i32 %y ) {
77
77
; CHECK-LABEL: @test_duplicate_successors_phi_3(
78
78
; CHECK-NEXT: entry:
79
79
; CHECK-NEXT: br i1 [[C1:%.*]], label [[SWITCH:%.*]], label [[SWITCH_1:%.*]]
80
80
; CHECK: switch:
81
- ; CHECK-NEXT: [[C2:%.*]] = icmp ult i32 [[X:%.*]], 3
82
- ; CHECK-NEXT: call void @llvm.assume(i1 [[C2]])
81
+ ; CHECK-NEXT: [[X:%.*]] = load i32, i32* [[P:%.*]], align 4, !range !0
83
82
; CHECK-NEXT: switch i32 [[X]], label [[SWITCH_DEFAULT:%.*]] [
84
83
; CHECK-NEXT: i32 0, label [[SWITCH_DEFAULT]]
85
84
; CHECK-NEXT: i32 1, label [[SWITCH_0:%.*]]
86
85
; CHECK-NEXT: i32 2, label [[SWITCH_0]]
87
- ; CHECK-NEXT: i32 3, label [[SWITCH_1]]
88
- ; CHECK-NEXT: i32 4, label [[SWITCH_1]]
89
86
; CHECK-NEXT: ]
90
87
; CHECK: switch.default:
91
88
; CHECK-NEXT: ret i32 -1
92
89
; CHECK: switch.0:
93
90
; CHECK-NEXT: ret i32 0
94
91
; CHECK: switch.1:
95
- ; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ [[X]], [[ENTRY:%.*]] ], [ 0, [[SWITCH]] ], [ 0, [[SWITCH]] ]
96
- ; CHECK-NEXT: ret i32 [[PHI]]
92
+ ; CHECK-NEXT: ret i32 [[Y:%.*]]
97
93
;
98
94
entry:
99
95
br i1 %c1 , label %switch , label %switch.1
100
96
101
97
switch:
102
- %c2 = icmp ult i32 %x , 3
103
- call void @llvm.assume (i1 %c2 )
98
+ %x = load i32 , i32* %p , !range !{i32 0 , i32 3 }
104
99
switch i32 %x , label %switch.default [
105
100
i32 0 , label %switch.default
106
101
i32 1 , label %switch.0
@@ -116,19 +111,18 @@ switch.0:
116
111
ret i32 0
117
112
118
113
switch .1 :
119
- %phi = phi i32 [ %x , %entry ], [ 0 , %switch ], [ 0 , %switch ]
114
+ %phi = phi i32 [ %y , %entry ], [ 0 , %switch ], [ 0 , %switch ]
120
115
ret i32 %phi
121
116
}
122
117
123
- define i32 @test_local_range (i32 %x ) {
118
+ ; TODO: Determine that the default destination is dead.
119
+ define i32 @test_local_range (i32* %p ) {
124
120
; CHECK-LABEL: @test_local_range(
125
- ; CHECK-NEXT: [[C:%.*]] = icmp ult i32 [[X:%.*]], 3
126
- ; CHECK-NEXT: call void @llvm.assume(i1 [[C]])
121
+ ; CHECK-NEXT: [[X:%.*]] = load i32, i32* [[P:%.*]], align 4, !range !0
127
122
; CHECK-NEXT: switch i32 [[X]], label [[SWITCH_DEFAULT:%.*]] [
128
123
; CHECK-NEXT: i32 0, label [[SWITCH_0:%.*]]
129
124
; CHECK-NEXT: i32 1, label [[SWITCH_1:%.*]]
130
125
; CHECK-NEXT: i32 2, label [[SWITCH_2:%.*]]
131
- ; CHECK-NEXT: i32 3, label [[SWITCH_3:%.*]]
132
126
; CHECK-NEXT: ]
133
127
; CHECK: switch.default:
134
128
; CHECK-NEXT: ret i32 -1
@@ -138,11 +132,8 @@ define i32 @test_local_range(i32 %x) {
138
132
; CHECK-NEXT: ret i32 1
139
133
; CHECK: switch.2:
140
134
; CHECK-NEXT: ret i32 2
141
- ; CHECK: switch.3:
142
- ; CHECK-NEXT: ret i32 3
143
135
;
144
- %c = icmp ult i32 %x , 3
145
- call void @llvm.assume (i1 %c )
136
+ %x = load i32 , i32* %p , !range !{i32 0 , i32 3 }
146
137
switch i32 %x , label %switch.default [
147
138
i32 0 , label %switch.0
148
139
i32 1 , label %switch.1
@@ -166,29 +157,24 @@ switch.3:
166
157
ret i32 3
167
158
}
168
159
169
- define i32 @test_duplicate_successors (i32 %x ) {
160
+ ; TODO: Determine that case i3 is dead, even though the edge is shared?
161
+ define i32 @test_duplicate_successors (i32* %p ) {
170
162
; CHECK-LABEL: @test_duplicate_successors(
171
- ; CHECK-NEXT: [[C:%.*]] = icmp ult i32 [[X:%.*]], 3
172
- ; CHECK-NEXT: call void @llvm.assume(i1 [[C]])
163
+ ; CHECK-NEXT: [[X:%.*]] = load i32, i32* [[P:%.*]], align 4, !range !0
173
164
; CHECK-NEXT: switch i32 [[X]], label [[SWITCH_DEFAULT:%.*]] [
174
165
; CHECK-NEXT: i32 0, label [[SWITCH_0:%.*]]
175
166
; CHECK-NEXT: i32 1, label [[SWITCH_0]]
176
167
; CHECK-NEXT: i32 2, label [[SWITCH_1:%.*]]
177
168
; CHECK-NEXT: i32 3, label [[SWITCH_1]]
178
- ; CHECK-NEXT: i32 4, label [[SWITCH_2:%.*]]
179
- ; CHECK-NEXT: i32 5, label [[SWITCH_2]]
180
169
; CHECK-NEXT: ]
181
170
; CHECK: switch.default:
182
171
; CHECK-NEXT: ret i32 -1
183
172
; CHECK: switch.0:
184
173
; CHECK-NEXT: ret i32 0
185
174
; CHECK: switch.1:
186
175
; CHECK-NEXT: ret i32 1
187
- ; CHECK: switch.2:
188
- ; CHECK-NEXT: ret i32 2
189
176
;
190
- %c = icmp ult i32 %x , 3
191
- call void @llvm.assume (i1 %c )
177
+ %x = load i32 , i32* %p , !range !{i32 0 , i32 3 }
192
178
switch i32 %x , label %switch.default [
193
179
i32 0 , label %switch.0
194
180
i32 1 , label %switch.0
@@ -211,18 +197,17 @@ switch.2:
211
197
ret i32 2
212
198
}
213
199
200
+ ; Case i32 2 is dead as well, but this cannot be determined based on
201
+ ; range information.
214
202
define internal i32 @test_ip_range (i32 %x ) {
215
203
; CHECK-LABEL: @test_ip_range(
216
204
; CHECK-NEXT: switch i32 [[X:%.*]], label [[SWITCH_DEFAULT:%.*]] [
217
- ; CHECK-NEXT: i32 0 , label [[SWITCH_0 :%.*]]
205
+ ; CHECK-NEXT: i32 3 , label [[SWITCH_3 :%.*]]
218
206
; CHECK-NEXT: i32 1, label [[SWITCH_1:%.*]]
219
207
; CHECK-NEXT: i32 2, label [[SWITCH_2:%.*]]
220
- ; CHECK-NEXT: i32 3, label [[SWITCH_3:%.*]]
221
- ; CHECK-NEXT: ]
208
+ ; CHECK-NEXT: ], !prof !1
222
209
; CHECK: switch.default:
223
210
; CHECK-NEXT: ret i32 -1
224
- ; CHECK: switch.0:
225
- ; CHECK-NEXT: ret i32 0
226
211
; CHECK: switch.1:
227
212
; CHECK-NEXT: ret i32 1
228
213
; CHECK: switch.2:
@@ -235,7 +220,7 @@ define internal i32 @test_ip_range(i32 %x) {
235
220
i32 1 , label %switch.1
236
221
i32 2 , label %switch.2
237
222
i32 3 , label %switch.3
238
- ]
223
+ ], !prof !{! "branch_weights" , i32 1 , i32 2 , i32 3 , i32 4 , i32 5 }
239
224
240
225
switch .default:
241
226
ret i32 -1
@@ -265,3 +250,5 @@ define void @call_test_ip_range() {
265
250
}
266
251
267
252
declare void @llvm.assume (i1 )
253
+
254
+ ; CHECK: !1 = !{!"branch_weights", i32 1, i32 5, i32 3, i32 4}
0 commit comments