[InstCombine] Add trivial folding (bitreverse (bitreverse x)) -> x
authorJames Molloy <james.molloy@arm.com>
Thu, 12 Nov 2015 12:39:41 +0000 (12:39 +0000)
committerJames Molloy <james.molloy@arm.com>
Thu, 12 Nov 2015 12:39:41 +0000 (12:39 +0000)
There are plenty more instcombines we could probably do with bitreverse, but this seems like a very obvious and trivial starting point and was brought up by Hal in his review.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@252879 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/InstCombine/InstCombineCalls.cpp
test/Transforms/InstCombine/bitreverse-fold.ll [new file with mode: 0644]

index c3fa7be327242af75c12d48b48c7836a13fc8e34..cde26cc24c29d922656d14814582fd87fc5f05a0 100644 (file)
@@ -788,6 +788,16 @@ Instruction *InstCombiner::visitCallInst(CallInst &CI) {
     break;
   }
 
+  case Intrinsic::bitreverse: {
+    Value *IIOperand = II->getArgOperand(0);
+    Value *X = nullptr;
+
+    // bitreverse(bitreverse(x)) -> x
+    if (match(IIOperand, m_Intrinsic<Intrinsic::bitreverse>(m_Value(X))))
+      return ReplaceInstUsesWith(CI, X);
+    break;
+  }
+
   case Intrinsic::powi:
     if (ConstantInt *Power = dyn_cast<ConstantInt>(II->getArgOperand(1))) {
       // powi(x, 0) -> 1.0
diff --git a/test/Transforms/InstCombine/bitreverse-fold.ll b/test/Transforms/InstCombine/bitreverse-fold.ll
new file mode 100644 (file)
index 0000000..ad7fc3a
--- /dev/null
@@ -0,0 +1,11 @@
+; RUN: opt < %s -instcombine -S | FileCheck %s
+
+define i32 @test1(i32 %p) {
+; CHECK-LABEL: @test1
+; CHECK-NEXT: ret i32 %p
+  %a = call i32 @llvm.bitreverse.i32(i32 %p)
+  %b = call i32 @llvm.bitreverse.i32(i32 %a)
+  ret i32 %b
+}
+
+declare i32 @llvm.bitreverse.i32(i32) readnone