From: David Bolvansky Date: Wed, 3 Apr 2019 08:08:44 +0000 (+0000) Subject: [InstCombine] Simplify ctpop with bitreverse/bswap X-Git-Tag: llvmorg-10-init~8602 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=937720e75b4692d6ec394fda3e23675d14449c86;p=platform%2Fupstream%2Fllvm.git [InstCombine] Simplify ctpop with bitreverse/bswap Summary: Fixes PR41337 Reviewers: spatel Reviewed By: spatel Subscribers: llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D60148 llvm-svn: 357564 --- diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp index c250679..afcd878 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp @@ -1383,6 +1383,14 @@ static Instruction *foldCtpop(IntrinsicInst &II, InstCombiner &IC) { assert(II.getIntrinsicID() == Intrinsic::ctpop && "Expected ctpop intrinsic"); Value *Op0 = II.getArgOperand(0); + Value *X; + // ctpop(bitreverse(x)) -> ctpop(x) + // ctpop(bswap(x)) -> ctpop(x) + if (match(Op0, m_BitReverse(m_Value(X))) || match(Op0, m_BSwap(m_Value(X)))) { + II.setOperand(0, X); + return &II; + } + // FIXME: Try to simplify vectors of integers. auto *IT = dyn_cast(Op0->getType()); if (!IT) diff --git a/llvm/test/Transforms/InstCombine/ctpop-bswap-bitreverse.ll b/llvm/test/Transforms/InstCombine/ctpop-bswap-bitreverse.ll index 5005b3d..00e2aa8 100644 --- a/llvm/test/Transforms/InstCombine/ctpop-bswap-bitreverse.ll +++ b/llvm/test/Transforms/InstCombine/ctpop-bswap-bitreverse.ll @@ -3,8 +3,7 @@ define i32 @ctpop_bitreverse(i32 %x) { ; CHECK-LABEL: @ctpop_bitreverse( -; CHECK-NEXT: [[A:%.*]] = tail call i32 @llvm.bitreverse.i32(i32 [[X:%.*]]) -; CHECK-NEXT: [[B:%.*]] = tail call i32 @llvm.ctpop.i32(i32 [[A]]), !range !0 +; CHECK-NEXT: [[B:%.*]] = tail call i32 @llvm.ctpop.i32(i32 [[X:%.*]]), !range !0 ; CHECK-NEXT: ret i32 [[B]] ; %a = tail call i32 @llvm.bitreverse.i32(i32 %x) @@ -14,8 +13,7 @@ define i32 @ctpop_bitreverse(i32 %x) { define <2 x i64> @ctpop_bitreverse_vec(<2 x i64> %x) { ; CHECK-LABEL: @ctpop_bitreverse_vec( -; CHECK-NEXT: [[A:%.*]] = tail call <2 x i64> @llvm.bitreverse.v2i64(<2 x i64> [[X:%.*]]) -; CHECK-NEXT: [[B:%.*]] = tail call <2 x i64> @llvm.ctpop.v2i64(<2 x i64> [[A]]) +; CHECK-NEXT: [[B:%.*]] = tail call <2 x i64> @llvm.ctpop.v2i64(<2 x i64> [[X:%.*]]) ; CHECK-NEXT: ret <2 x i64> [[B]] ; %a = tail call <2 x i64> @llvm.bitreverse.v2i64(<2 x i64> %x) @@ -25,8 +23,7 @@ define <2 x i64> @ctpop_bitreverse_vec(<2 x i64> %x) { define i32 @ctpop_bswap(i32 %x) { ; CHECK-LABEL: @ctpop_bswap( -; CHECK-NEXT: [[A:%.*]] = tail call i32 @llvm.bswap.i32(i32 [[X:%.*]]) -; CHECK-NEXT: [[B:%.*]] = tail call i32 @llvm.ctpop.i32(i32 [[A]]), !range !0 +; CHECK-NEXT: [[B:%.*]] = tail call i32 @llvm.ctpop.i32(i32 [[X:%.*]]), !range !0 ; CHECK-NEXT: ret i32 [[B]] ; %a = tail call i32 @llvm.bswap.i32(i32 %x) @@ -36,8 +33,7 @@ define i32 @ctpop_bswap(i32 %x) { define <2 x i64> @ctpop_bswap_vec(<2 x i64> %x) { ; CHECK-LABEL: @ctpop_bswap_vec( -; CHECK-NEXT: [[A:%.*]] = tail call <2 x i64> @llvm.bswap.v2i64(<2 x i64> [[X:%.*]]) -; CHECK-NEXT: [[B:%.*]] = tail call <2 x i64> @llvm.ctpop.v2i64(<2 x i64> [[A]]) +; CHECK-NEXT: [[B:%.*]] = tail call <2 x i64> @llvm.ctpop.v2i64(<2 x i64> [[X:%.*]]) ; CHECK-NEXT: ret <2 x i64> [[B]] ; %a = tail call <2 x i64> @llvm.bswap.v2i64(<2 x i64> %x)