Skip to content

Commit 0eedc9e

Browse files
committed
[InstCombine] bitrev (zext i1 X) --> select X, SMinC, 0
https://alive2.llvm.org/ce/z/ZXCtgi This breaks the infinite combine loop for issue #59897, but we may still need more changes to avoid those loops.
1 parent b1e6947 commit 0eedc9e

File tree

2 files changed

+30
-3
lines changed

2 files changed

+30
-3
lines changed

llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1441,6 +1441,18 @@ Instruction *InstCombinerImpl::visitCallInst(CallInst &CI) {
14411441

14421442
break;
14431443
}
1444+
case Intrinsic::bitreverse: {
1445+
// bitrev (zext i1 X to ?) --> X ? SignBitC : 0
1446+
Value *X;
1447+
if (match(II->getArgOperand(0), m_ZExt(m_Value(X))) &&
1448+
X->getType()->isIntOrIntVectorTy(1)) {
1449+
Type *Ty = II->getType();
1450+
APInt SignBit = APInt::getSignMask(Ty->getScalarSizeInBits());
1451+
return SelectInst::Create(X, ConstantInt::get(Ty, SignBit),
1452+
ConstantInt::getNullValue(Ty));
1453+
}
1454+
break;
1455+
}
14441456
case Intrinsic::bswap: {
14451457
Value *IIOperand = II->getArgOperand(0);
14461458

llvm/test/Transforms/InstCombine/bitreverse.ll

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -323,7 +323,7 @@ define i32 @rev_i1(i1 %x) {
323323
; CHECK-LABEL: @rev_i1(
324324
; CHECK-NEXT: [[Z:%.*]] = zext i1 [[X:%.*]] to i32
325325
; 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
327327
; CHECK-NEXT: ret i32 [[R]]
328328
;
329329
%z = zext i1 %x to i32
@@ -334,8 +334,7 @@ define i32 @rev_i1(i1 %x) {
334334

335335
define <2 x i8> @rev_v2i1(<2 x i1> %x) {
336336
; 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
339338
; CHECK-NEXT: ret <2 x i8> [[R]]
340339
;
341340
%z = zext <2 x i1> %x to <2 x i8>
@@ -353,3 +352,19 @@ define i32 @rev_i2(i2 %x) {
353352
%r = call i32 @llvm.bitreverse.i32(i32 %z)
354353
ret i32 %r
355354
}
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

Comments
 (0)