[PATCH] D141990: [InstSimplify] Add transform ctpop(X) -> 1 iff X is non-zero power of 2
Noah Goldstein via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Jan 18 11:16:59 PST 2023
goldstein.w.n updated this revision to Diff 490254.
goldstein.w.n marked 3 inline comments as done.
goldstein.w.n added a comment.
Don't change func decl
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D141990/new/
https://reviews.llvm.org/D141990
Files:
llvm/lib/Analysis/InstructionSimplify.cpp
llvm/test/Transforms/InstSimplify/ctpop-pow2.ll
Index: llvm/test/Transforms/InstSimplify/ctpop-pow2.ll
===================================================================
--- llvm/test/Transforms/InstSimplify/ctpop-pow2.ll
+++ llvm/test/Transforms/InstSimplify/ctpop-pow2.ll
@@ -10,9 +10,7 @@
define i64 @ctpop_1_shl(i64 %x) {
; CHECK-LABEL: @ctpop_1_shl(
-; CHECK-NEXT: [[V:%.*]] = shl i64 1, [[X:%.*]]
-; CHECK-NEXT: [[CNT:%.*]] = call i64 @llvm.ctpop.i64(i64 [[V]])
-; CHECK-NEXT: ret i64 [[CNT]]
+; CHECK-NEXT: ret i64 1
;
%v = shl i64 1, %x
%cnt = call i64 @llvm.ctpop.i64(i64 %v)
@@ -21,9 +19,7 @@
define i32 @ctpop_imin_lshr(i32 %x) {
; CHECK-LABEL: @ctpop_imin_lshr(
-; CHECK-NEXT: [[V:%.*]] = lshr i32 -2147483648, [[X:%.*]]
-; CHECK-NEXT: [[CNT:%.*]] = call i32 @llvm.ctpop.i32(i32 [[V]])
-; CHECK-NEXT: ret i32 [[CNT]]
+; CHECK-NEXT: ret i32 1
;
%v = lshr i32 2147483648, %x
%cnt = call i32 @llvm.ctpop.i32(i32 %v)
@@ -129,9 +125,7 @@
define <2 x i32> @ctpop_shl1_vec(<2 x i32> %x) {
; CHECK-LABEL: @ctpop_shl1_vec(
-; CHECK-NEXT: [[SHL:%.*]] = shl <2 x i32> <i32 1, i32 1>, [[X:%.*]]
-; CHECK-NEXT: [[CNT:%.*]] = call <2 x i32> @llvm.ctpop.v2i32(<2 x i32> [[SHL]])
-; CHECK-NEXT: ret <2 x i32> [[CNT]]
+; CHECK-NEXT: ret <2 x i32> <i32 1, i32 1>
;
%shl = shl <2 x i32> <i32 1 ,i32 1>, %x
%cnt = call <2 x i32> @llvm.ctpop.v2i32(<2 x i32> %shl)
@@ -151,9 +145,7 @@
define <2 x i32> @ctpop_lshr_intmin_vec(<2 x i32> %x) {
; CHECK-LABEL: @ctpop_lshr_intmin_vec(
-; CHECK-NEXT: [[SHR:%.*]] = lshr <2 x i32> <i32 -2147483648, i32 -2147483648>, [[X:%.*]]
-; CHECK-NEXT: [[CNT:%.*]] = call <2 x i32> @llvm.ctpop.v2i32(<2 x i32> [[SHR]])
-; CHECK-NEXT: ret <2 x i32> [[CNT]]
+; CHECK-NEXT: ret <2 x i32> <i32 1, i32 1>
;
%shr = lshr <2 x i32> <i32 2147483648 ,i32 2147483648>, %x
%cnt = call <2 x i32> @llvm.ctpop.v2i32(<2 x i32> %shr)
Index: llvm/lib/Analysis/InstructionSimplify.cpp
===================================================================
--- llvm/lib/Analysis/InstructionSimplify.cpp
+++ llvm/lib/Analysis/InstructionSimplify.cpp
@@ -5919,6 +5919,10 @@
return X;
break;
case Intrinsic::ctpop: {
+ // ctpop(X) -> 1 iff X is non-zero power of 2.
+ if (isKnownToBeAPowerOfTwo(Op0, Q.DL, /*OrZero*/ false, 0, Q.AC, Q.CxtI,
+ Q.DT))
+ return ConstantInt::get(Op0->getType(), 1);
// If everything but the lowest bit is zero, that bit is the pop-count. Ex:
// ctpop(and X, 1) --> and X, 1
unsigned BitWidth = Op0->getType()->getScalarSizeInBits();
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D141990.490254.patch
Type: text/x-patch
Size: 2575 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230118/79ca49b9/attachment.bin>
More information about the llvm-commits
mailing list