[PATCH] D31857: [Analysis] Support bitreverse in -demanded-bits pass
Brian Gesiak via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon Apr 10 11:07:15 PDT 2017
modocache created this revision.
- Add a bitreverse case in the demanded bits analysis pass.
- Add tests for the bitreverse (and bswap) intrinsic in the demanded bits pass.
- Add a test case to the BDCE tests: that manipulations to high-order bits are eliminated once the bits are reversed and then right-shifted.
https://reviews.llvm.org/D31857
Files:
lib/Analysis/DemandedBits.cpp
test/Analysis/DemandedBits/intrinsics.ll
test/Transforms/BDCE/basic.ll
Index: test/Transforms/BDCE/basic.ll
===================================================================
--- test/Transforms/BDCE/basic.ll
+++ test/Transforms/BDCE/basic.ll
@@ -136,6 +136,44 @@
declare i32 @llvm.bswap.i32(i32) #0
; Function Attrs: nounwind readnone
+define signext i32 @tim(i32 signext %x) #0 {
+entry:
+ %call = tail call signext i32 @foo(i32 signext 5) #0
+ %and = and i32 %call, 536870912
+ %or = or i32 %and, %x
+ %call1 = tail call signext i32 @foo(i32 signext 3) #0
+ %and2 = and i32 %call1, 1073741824
+ %or3 = or i32 %or, %and2
+ %call4 = tail call signext i32 @foo(i32 signext 2) #0
+ %and5 = and i32 %call4, 16
+ %or6 = or i32 %or3, %and5
+ %call7 = tail call signext i32 @foo(i32 signext 1) #0
+ %and8 = and i32 %call7, 32
+ %or9 = or i32 %or6, %and8
+ %call10 = tail call signext i32 @foo(i32 signext 0) #0
+ %and11 = and i32 %call10, 64
+ %or12 = or i32 %or9, %and11
+ %call13 = tail call signext i32 @foo(i32 signext 4) #0
+ %and14 = and i32 %call13, 128
+ %or15 = or i32 %or12, %and14
+ %bs = tail call i32 @llvm.bitreverse.i32(i32 %or15) #0
+ %shr = ashr i32 %bs, 4
+ ret i32 %shr
+
+; CHECK-LABEL: @tim
+; CHECK-NOT: tail call signext i32 @foo(i32 signext 5)
+; CHECK-NOT: tail call signext i32 @foo(i32 signext 3)
+; CHECK: tail call signext i32 @foo(i32 signext 2)
+; CHECK: tail call signext i32 @foo(i32 signext 1)
+; CHECK: tail call signext i32 @foo(i32 signext 0)
+; CHECK: tail call signext i32 @foo(i32 signext 4)
+; CHECK: ret i32
+}
+
+; Function Attrs: nounwind readnone
+declare i32 @llvm.bitreverse.i32(i32) #0
+
+; Function Attrs: nounwind readnone
define signext i32 @tar2(i32 signext %x) #0 {
entry:
%call = tail call signext i32 @foo(i32 signext 5) #0
Index: test/Analysis/DemandedBits/intrinsics.ll
===================================================================
--- /dev/null
+++ test/Analysis/DemandedBits/intrinsics.ll
@@ -0,0 +1,25 @@
+; RUN: opt -S -demanded-bits -analyze < %s | FileCheck %s
+; RUN: opt -S -disable-output -passes="print<demanded-bits>" < %s 2>&1 | FileCheck %s
+
+; CHECK-DAG: DemandedBits: 0xFF000000 for %1 = or i32 %x, 1
+; CHECK-DAG: DemandedBits: 0xFF for %2 = call i32 @llvm.bitreverse.i32(i32 %1)
+; CHECK-DAG: DemandedBits: 0xFF for %3 = trunc i32 %2 to i8
+define i8 @test_bswap(i32 %x) {
+ %1 = or i32 %x, 1
+ %2 = call i32 @llvm.bswap.i32(i32 %1)
+ %3 = trunc i32 %2 to i8
+ ret i8 %3
+}
+declare i32 @llvm.bswap.i32(i32)
+
+; CHECK-DAG: DemandedBits: 0xFF000000 for %1 = or i32 %x, 1
+; CHECK-DAG: DemandedBits: 0xFF for %2 = call i32 @llvm.bswap.i32(i32 %1)
+; CHECK-DAG: DemandedBits: 0xFF for %3 = trunc i32 %2 to i8
+define i8 @test_bitreverse(i32 %x) {
+ %1 = or i32 %x, 1
+ %2 = call i32 @llvm.bitreverse.i32(i32 %1)
+ %3 = trunc i32 %2 to i8
+ ret i8 %3
+}
+declare i32 @llvm.bitreverse.i32(i32)
+
Index: lib/Analysis/DemandedBits.cpp
===================================================================
--- lib/Analysis/DemandedBits.cpp
+++ lib/Analysis/DemandedBits.cpp
@@ -110,6 +110,9 @@
// the output.
AB = AOut.byteSwap();
break;
+ case Intrinsic::bitreverse:
+ AB = AOut.reverseBits();
+ break;
case Intrinsic::ctlz:
if (OperandNo == 0) {
// We need some output bits, so we need all bits of the
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D31857.94608.patch
Type: text/x-patch
Size: 3324 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170410/8fe5d70c/attachment.bin>
More information about the llvm-commits
mailing list