@@ -323,7 +323,7 @@ define i32 @rev_i1(i1 %x) {
323
323
; CHECK-LABEL: @rev_i1(
324
324
; CHECK-NEXT: [[Z:%.*]] = zext i1 [[X:%.*]] to i32
325
325
; CHECK-NEXT: call void @use_i32(i32 [[Z]])
326
- ; CHECK-NEXT: [[R:%.*]] = call i32 @llvm.bitreverse.i32(i32 [[Z]])
326
+ ; CHECK-NEXT: [[R:%.*]] = select i1 [[X]], i32 -2147483648, i32 0
327
327
; CHECK-NEXT: ret i32 [[R]]
328
328
;
329
329
%z = zext i1 %x to i32
@@ -334,8 +334,7 @@ define i32 @rev_i1(i1 %x) {
334
334
335
335
define <2 x i8 > @rev_v2i1 (<2 x i1 > %x ) {
336
336
; CHECK-LABEL: @rev_v2i1(
337
- ; CHECK-NEXT: [[Z:%.*]] = zext <2 x i1> [[X:%.*]] to <2 x i8>
338
- ; CHECK-NEXT: [[R:%.*]] = call <2 x i8> @llvm.bitreverse.v2i8(<2 x i8> [[Z]])
337
+ ; CHECK-NEXT: [[R:%.*]] = select <2 x i1> [[X:%.*]], <2 x i8> <i8 -128, i8 -128>, <2 x i8> zeroinitializer
339
338
; CHECK-NEXT: ret <2 x i8> [[R]]
340
339
;
341
340
%z = zext <2 x i1 > %x to <2 x i8 >
@@ -353,3 +352,19 @@ define i32 @rev_i2(i2 %x) {
353
352
%r = call i32 @llvm.bitreverse.i32 (i32 %z )
354
353
ret i32 %r
355
354
}
355
+
356
+ ; This used to infinite loop.
357
+
358
+ define i64 @PR59897 (i1 %X1_2 ) {
359
+ ; CHECK-LABEL: @PR59897(
360
+ ; CHECK-NEXT: [[NOT_X1_2:%.*]] = xor i1 [[X1_2:%.*]], true
361
+ ; CHECK-NEXT: [[X0_3X2X5X0:%.*]] = zext i1 [[NOT_X1_2]] to i64
362
+ ; CHECK-NEXT: ret i64 [[X0_3X2X5X0]]
363
+ ;
364
+ %X1_3 = zext i1 %X1_2 to i32
365
+ %X8_3x2x2x0 = call i32 @llvm.bitreverse.i32 (i32 %X1_3 )
366
+ %X8_4x2x3x0 = xor i32 %X8_3x2x2x0 , -1
367
+ %X0_3x2x4x0 = lshr i32 %X8_4x2x3x0 , 31
368
+ %X0_3x2x5x0 = zext i32 %X0_3x2x4x0 to i64
369
+ ret i64 %X0_3x2x5x0
370
+ }
0 commit comments