Skip to content

Commit ad5c2d0

Browse files
committed
[ValueTracking] Make sure we keep range metadata information when calculating known bits for calls to bitreverse intrinsic.
llvm-svn: 298488
1 parent 3646e62 commit ad5c2d0

File tree

2 files changed

+19
-2
lines changed

2 files changed

+19
-2
lines changed

llvm/lib/Analysis/ValueTracking.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1414,8 +1414,8 @@ static void computeKnownBitsFromOperator(const Operator *I, APInt &KnownZero,
14141414
default: break;
14151415
case Intrinsic::bitreverse:
14161416
computeKnownBits(I->getOperand(0), KnownZero2, KnownOne2, Depth + 1, Q);
1417-
KnownZero = KnownZero2.reverseBits();
1418-
KnownOne = KnownOne2.reverseBits();
1417+
KnownZero |= KnownZero2.reverseBits();
1418+
KnownOne |= KnownOne2.reverseBits();
14191419
break;
14201420
case Intrinsic::bswap:
14211421
computeKnownBits(I->getOperand(0), KnownZero2, KnownOne2, Depth + 1, Q);

llvm/test/Transforms/InstCombine/bitreverse-known-bits.ll

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
; RUN: opt < %s -S -instcombine | FileCheck %s
22

3+
declare i8 @llvm.bitreverse.i8(i8)
34
declare i32 @llvm.bitreverse.i32(i32)
45

56
; CHECK-LABEL: @test1
@@ -32,3 +33,19 @@ define i1 @test3(i32 %arg) {
3233
%res = icmp eq i32 %and, 0
3334
ret i1 %res
3435
}
36+
37+
; CHECK-LABEL: @add_bitreverse
38+
; Make sure we process range metadata on bitreverse
39+
define i8 @add_bitreverse(i8 %a) {
40+
%b = and i8 %a, 252
41+
; known bits for the bitreverse will say the result is in the range [0, 64)
42+
; but the metadata says [0, 16). So make sure the range metadata wins.
43+
; add %reverse, 1111 0000
44+
; should become
45+
; or %reverse, 1111 0000
46+
%reverse = call i8 @llvm.bitreverse.i8(i8 %b), !range !1
47+
%c = add i8 %reverse, -16
48+
; CHECK: or i8 %reverse, -16
49+
ret i8 %c
50+
}
51+
!1 = !{i8 0, i8 16}

0 commit comments

Comments
 (0)