@@ -7,13 +7,11 @@ target datalayout = "e-n32"
7
7
define i32 @test1 (i32 %a ) {
8
8
; CHECK-LABEL: @test1(
9
9
; CHECK-NEXT: [[TMP1:%.*]] = sub i32 [[A:%.*]], 97
10
- ; CHECK-NEXT: [[TMP2:%.*]] = lshr i32 [[TMP1]], 2
11
- ; CHECK-NEXT: [[TMP3:%.*]] = shl i32 [[TMP1]], 30
12
- ; CHECK-NEXT: [[TMP4:%.*]] = or i32 [[TMP2]], [[TMP3]]
13
- ; CHECK-NEXT: [[TMP5:%.*]] = icmp ult i32 [[TMP4]], 4
14
- ; CHECK-NEXT: br i1 [[TMP5]], label [[SWITCH_LOOKUP:%.*]], label [[COMMON_RET:%.*]]
10
+ ; CHECK-NEXT: [[TMP2:%.*]] = call i32 @llvm.fshl.i32(i32 [[TMP1]], i32 [[TMP1]], i32 30)
11
+ ; CHECK-NEXT: [[TMP3:%.*]] = icmp ult i32 [[TMP2]], 4
12
+ ; CHECK-NEXT: br i1 [[TMP3]], label [[SWITCH_LOOKUP:%.*]], label [[COMMON_RET:%.*]]
15
13
; CHECK: switch.lookup:
16
- ; CHECK-NEXT: [[SWITCH_GEP:%.*]] = getelementptr inbounds [4 x i32], ptr @switch.table.test1, i32 0, i32 [[TMP4 ]]
14
+ ; CHECK-NEXT: [[SWITCH_GEP:%.*]] = getelementptr inbounds [4 x i32], ptr @switch.table.test1, i32 0, i32 [[TMP2 ]]
17
15
; CHECK-NEXT: [[SWITCH_LOAD:%.*]] = load i32, ptr [[SWITCH_GEP]], align 4
18
16
; CHECK-NEXT: br label [[COMMON_RET]]
19
17
; CHECK: common.ret:
@@ -183,13 +181,11 @@ three:
183
181
define i32 @test6 (i32 %a ) optsize {
184
182
; CHECK-LABEL: @test6(
185
183
; CHECK-NEXT: [[TMP1:%.*]] = sub i32 [[A:%.*]], -109
186
- ; CHECK-NEXT: [[TMP2:%.*]] = lshr i32 [[TMP1]], 2
187
- ; CHECK-NEXT: [[TMP3:%.*]] = shl i32 [[TMP1]], 30
188
- ; CHECK-NEXT: [[TMP4:%.*]] = or i32 [[TMP2]], [[TMP3]]
189
- ; CHECK-NEXT: [[TMP5:%.*]] = icmp ult i32 [[TMP4]], 4
190
- ; CHECK-NEXT: br i1 [[TMP5]], label [[SWITCH_LOOKUP:%.*]], label [[COMMON_RET:%.*]]
184
+ ; CHECK-NEXT: [[TMP2:%.*]] = call i32 @llvm.fshl.i32(i32 [[TMP1]], i32 [[TMP1]], i32 30)
185
+ ; CHECK-NEXT: [[TMP3:%.*]] = icmp ult i32 [[TMP2]], 4
186
+ ; CHECK-NEXT: br i1 [[TMP3]], label [[SWITCH_LOOKUP:%.*]], label [[COMMON_RET:%.*]]
191
187
; CHECK: switch.lookup:
192
- ; CHECK-NEXT: [[SWITCH_GEP:%.*]] = getelementptr inbounds [4 x i32], ptr @switch.table.test6, i32 0, i32 [[TMP4 ]]
188
+ ; CHECK-NEXT: [[SWITCH_GEP:%.*]] = getelementptr inbounds [4 x i32], ptr @switch.table.test6, i32 0, i32 [[TMP2 ]]
193
189
; CHECK-NEXT: [[SWITCH_LOAD:%.*]] = load i32, ptr [[SWITCH_GEP]], align 4
194
190
; CHECK-NEXT: br label [[COMMON_RET]]
195
191
; CHECK: common.ret:
@@ -218,15 +214,13 @@ define i8 @test7(i8 %a) optsize {
218
214
; CHECK-LABEL: @test7(
219
215
; CHECK-NEXT: common.ret:
220
216
; CHECK-NEXT: [[TMP0:%.*]] = sub i8 [[A:%.*]], -36
221
- ; CHECK-NEXT: [[TMP1:%.*]] = lshr i8 [[TMP0]], 2
222
- ; CHECK-NEXT: [[TMP2:%.*]] = shl i8 [[TMP0]], 6
223
- ; CHECK-NEXT: [[TMP3:%.*]] = or i8 [[TMP1]], [[TMP2]]
224
- ; CHECK-NEXT: [[TMP4:%.*]] = icmp ult i8 [[TMP3]], 4
225
- ; CHECK-NEXT: [[SWITCH_CAST:%.*]] = zext i8 [[TMP3]] to i32
217
+ ; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.fshl.i8(i8 [[TMP0]], i8 [[TMP0]], i8 6)
218
+ ; CHECK-NEXT: [[TMP2:%.*]] = icmp ult i8 [[TMP1]], 4
219
+ ; CHECK-NEXT: [[SWITCH_CAST:%.*]] = zext i8 [[TMP1]] to i32
226
220
; CHECK-NEXT: [[SWITCH_SHIFTAMT:%.*]] = mul nuw nsw i32 [[SWITCH_CAST]], 8
227
221
; CHECK-NEXT: [[SWITCH_DOWNSHIFT:%.*]] = lshr i32 -943228976, [[SWITCH_SHIFTAMT]]
228
222
; CHECK-NEXT: [[SWITCH_MASKED:%.*]] = trunc i32 [[SWITCH_DOWNSHIFT]] to i8
229
- ; CHECK-NEXT: [[COMMON_RET_OP:%.*]] = select i1 [[TMP4 ]], i8 [[SWITCH_MASKED]], i8 -93
223
+ ; CHECK-NEXT: [[COMMON_RET_OP:%.*]] = select i1 [[TMP2 ]], i8 [[SWITCH_MASKED]], i8 -93
230
224
; CHECK-NEXT: ret i8 [[COMMON_RET_OP]]
231
225
;
232
226
switch i8 %a , label %def [
@@ -250,13 +244,11 @@ three:
250
244
define i32 @test8 (i32 %a ) optsize {
251
245
; CHECK-LABEL: @test8(
252
246
; CHECK-NEXT: [[TMP1:%.*]] = sub i32 [[A:%.*]], 97
253
- ; CHECK-NEXT: [[TMP2:%.*]] = lshr i32 [[TMP1]], 2
254
- ; CHECK-NEXT: [[TMP3:%.*]] = shl i32 [[TMP1]], 30
255
- ; CHECK-NEXT: [[TMP4:%.*]] = or i32 [[TMP2]], [[TMP3]]
256
- ; CHECK-NEXT: [[TMP5:%.*]] = icmp ult i32 [[TMP4]], 5
257
- ; CHECK-NEXT: br i1 [[TMP5]], label [[SWITCH_LOOKUP:%.*]], label [[COMMON_RET:%.*]]
247
+ ; CHECK-NEXT: [[TMP2:%.*]] = call i32 @llvm.fshl.i32(i32 [[TMP1]], i32 [[TMP1]], i32 30)
248
+ ; CHECK-NEXT: [[TMP3:%.*]] = icmp ult i32 [[TMP2]], 5
249
+ ; CHECK-NEXT: br i1 [[TMP3]], label [[SWITCH_LOOKUP:%.*]], label [[COMMON_RET:%.*]]
258
250
; CHECK: switch.lookup:
259
- ; CHECK-NEXT: [[SWITCH_GEP:%.*]] = getelementptr inbounds [5 x i32], ptr @switch.table.test8, i32 0, i32 [[TMP4 ]]
251
+ ; CHECK-NEXT: [[SWITCH_GEP:%.*]] = getelementptr inbounds [5 x i32], ptr @switch.table.test8, i32 0, i32 [[TMP2 ]]
260
252
; CHECK-NEXT: [[SWITCH_LOAD:%.*]] = load i32, ptr [[SWITCH_GEP]], align 4
261
253
; CHECK-NEXT: br label [[COMMON_RET]]
262
254
; CHECK: common.ret:
@@ -284,13 +276,11 @@ three:
284
276
define i32 @test9 (i32 %a ) {
285
277
; CHECK-LABEL: @test9(
286
278
; CHECK-NEXT: [[TMP1:%.*]] = sub i32 [[A:%.*]], 6
287
- ; CHECK-NEXT: [[TMP2:%.*]] = lshr i32 [[TMP1]], 1
288
- ; CHECK-NEXT: [[TMP3:%.*]] = shl i32 [[TMP1]], 31
289
- ; CHECK-NEXT: [[TMP4:%.*]] = or i32 [[TMP2]], [[TMP3]]
290
- ; CHECK-NEXT: [[TMP5:%.*]] = icmp ult i32 [[TMP4]], 8
291
- ; CHECK-NEXT: br i1 [[TMP5]], label [[SWITCH_LOOKUP:%.*]], label [[COMMON_RET:%.*]]
279
+ ; CHECK-NEXT: [[TMP2:%.*]] = call i32 @llvm.fshl.i32(i32 [[TMP1]], i32 [[TMP1]], i32 31)
280
+ ; CHECK-NEXT: [[TMP3:%.*]] = icmp ult i32 [[TMP2]], 8
281
+ ; CHECK-NEXT: br i1 [[TMP3]], label [[SWITCH_LOOKUP:%.*]], label [[COMMON_RET:%.*]]
292
282
; CHECK: switch.lookup:
293
- ; CHECK-NEXT: [[SWITCH_GEP:%.*]] = getelementptr inbounds [8 x i32], ptr @switch.table.test9, i32 0, i32 [[TMP4 ]]
283
+ ; CHECK-NEXT: [[SWITCH_GEP:%.*]] = getelementptr inbounds [8 x i32], ptr @switch.table.test9, i32 0, i32 [[TMP2 ]]
294
284
; CHECK-NEXT: [[SWITCH_LOAD:%.*]] = load i32, ptr [[SWITCH_GEP]], align 4
295
285
; CHECK-NEXT: br label [[COMMON_RET]]
296
286
; CHECK: common.ret:
0 commit comments