From: James Molloy Date: Thu, 12 Nov 2015 12:39:41 +0000 (+0000) Subject: [InstCombine] Add trivial folding (bitreverse (bitreverse x)) -> x X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=7086a4139d152bef7a2a6dbb84924e7641f1ff11;p=oota-llvm.git [InstCombine] Add trivial folding (bitreverse (bitreverse x)) -> x 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 --- diff --git a/lib/Transforms/InstCombine/InstCombineCalls.cpp b/lib/Transforms/InstCombine/InstCombineCalls.cpp index c3fa7be3272..cde26cc24c2 100644 --- a/lib/Transforms/InstCombine/InstCombineCalls.cpp +++ b/lib/Transforms/InstCombine/InstCombineCalls.cpp @@ -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(m_Value(X)))) + return ReplaceInstUsesWith(CI, X); + break; + } + case Intrinsic::powi: if (ConstantInt *Power = dyn_cast(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 index 00000000000..ad7fc3a7464 --- /dev/null +++ b/test/Transforms/InstCombine/bitreverse-fold.ll @@ -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