[PATCH] D23139: Add popcount(n) == bitsize(n) -> n == -1 transformation.
Amaury SECHET via llvm-commits
llvm-commits at lists.llvm.org
Wed Aug 3 22:35:14 PDT 2016
This revision was automatically updated to reflect the committed changes.
Closed by commit rL277694: Add popcount(n) == bitsize(n) -> n == -1 transformation. (authored by deadalnix).
Changed prior to commit:
https://reviews.llvm.org/D23139?vs=66757&id=66759#toc
Repository:
rL LLVM
https://reviews.llvm.org/D23139
Files:
llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp
llvm/trunk/test/Transforms/InstCombine/intrinsics.ll
Index: llvm/trunk/test/Transforms/InstCombine/intrinsics.ll
===================================================================
--- llvm/trunk/test/Transforms/InstCombine/intrinsics.ll
+++ llvm/trunk/test/Transforms/InstCombine/intrinsics.ll
@@ -302,18 +302,23 @@
%tz = tail call i32 @llvm.cttz.i32(i32 %a, i1 false) nounwind readnone
%tz.cmp = icmp ne i32 %tz, 32
store volatile i1 %tz.cmp, i1* %c
- %pop = tail call i32 @llvm.ctpop.i32(i32 %b) nounwind readnone
- %pop.cmp = icmp eq i32 %pop, 0
- store volatile i1 %pop.cmp, i1* %c
+ %pop0 = tail call i32 @llvm.ctpop.i32(i32 %b) nounwind readnone
+ %pop0.cmp = icmp eq i32 %pop0, 0
+ store volatile i1 %pop0.cmp, i1* %c
+ %pop1 = tail call i32 @llvm.ctpop.i32(i32 %b) nounwind readnone
+ %pop1.cmp = icmp eq i32 %pop1, 32
+ store volatile i1 %pop1.cmp, i1* %c
ret void
; CHECK: @cmp.simplify
; CHECK-NEXT: entry:
; CHECK-NEXT: %lz.cmp = icmp eq i32 %a, 0
; CHECK-NEXT: store volatile i1 %lz.cmp, i1* %c
; CHECK-NEXT: %tz.cmp = icmp ne i32 %a, 0
; CHECK-NEXT: store volatile i1 %tz.cmp, i1* %c
-; CHECK-NEXT: %pop.cmp = icmp eq i32 %b, 0
-; CHECK-NEXT: store volatile i1 %pop.cmp, i1* %c
+; CHECK-NEXT: %pop0.cmp = icmp eq i32 %b, 0
+; CHECK-NEXT: store volatile i1 %pop0.cmp, i1* %c
+; CHECK-NEXT: %pop1.cmp = icmp eq i32 %b, -1
+; CHECK-NEXT: store volatile i1 %pop1.cmp, i1* %c
}
define <2 x i1> @ctlz_cmp_vec(<2 x i32> %a) {
@@ -336,14 +341,19 @@
ret <2 x i1> %cmp
}
-define <2 x i1> @ctpop_cmp_vec(<2 x i32> %a) {
+define void @ctpop_cmp_vec(<2 x i32> %a, <2 x i1>* %b) {
+ %pop0 = tail call <2 x i32> @llvm.ctpop.v2i32(<2 x i32> %a) nounwind readnone
+ %pop0.cmp = icmp eq <2 x i32> %pop0, zeroinitializer
+ store volatile <2 x i1> %pop0.cmp, <2 x i1>* %b
+ %pop1 = tail call <2 x i32> @llvm.ctpop.v2i32(<2 x i32> %a) nounwind readnone
+ %pop1.cmp = icmp eq <2 x i32> %pop1, < i32 32, i32 32 >
+ store volatile <2 x i1> %pop1.cmp, <2 x i1>* %b
+ ret void
; CHECK-LABEL: @ctpop_cmp_vec(
-; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i32> %a, zeroinitializer
-; CHECK-NEXT: ret <2 x i1> [[CMP]]
-;
- %x = tail call <2 x i32> @llvm.ctpop.v2i32(<2 x i32> %a) nounwind readnone
- %cmp = icmp eq <2 x i32> %x, zeroinitializer
- ret <2 x i1> %cmp
+; CHECK-NEXT: %pop0.cmp = icmp eq <2 x i32> %a, zeroinitializer
+; CHECK-NEXT: store volatile <2 x i1> %pop0.cmp, <2 x i1>* %c
+; CHECK-NEXT: %pop1.cmp = icmp eq <2 x i32> %a, zeroinitializer
+; CHECK-NEXT: store volatile <2 x i1> %pop1.cmp, <2 x i1>* %c
}
define i32 @cttz_simplify1a(i32 %x) nounwind readnone ssp {
Index: llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp
===================================================================
--- llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp
+++ llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp
@@ -2372,22 +2372,28 @@
return &ICI;
case Intrinsic::ctlz:
case Intrinsic::cttz:
- // ctz(A) == bitwidth(a) -> A == 0 and likewise for !=
+ // ctz(A) == bitwidth(A) -> A == 0 and likewise for !=
if (*Op1C == Op1C->getBitWidth()) {
Worklist.Add(II);
ICI.setOperand(0, II->getArgOperand(0));
ICI.setOperand(1, ConstantInt::getNullValue(II->getType()));
return &ICI;
}
break;
- case Intrinsic::ctpop:
+ case Intrinsic::ctpop: {
// popcount(A) == 0 -> A == 0 and likewise for !=
- if (*Op1C == 0) {
+ // popcount(A) == bitwidth(A) -> A == -1 and likewise for !=
+ bool IsZero = *Op1C == 0;
+ if (IsZero || *Op1C == Op1C->getBitWidth()) {
Worklist.Add(II);
ICI.setOperand(0, II->getArgOperand(0));
- ICI.setOperand(1, ConstantInt::getNullValue(II->getType()));
+ auto *NewOp = IsZero
+ ? ConstantInt::getNullValue(II->getType())
+ : ConstantInt::getAllOnesValue(II->getType());
+ ICI.setOperand(1, NewOp);
return &ICI;
}
+ }
break;
default:
break;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D23139.66759.patch
Type: text/x-patch
Size: 3940 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160804/c5151d7f/attachment.bin>
More information about the llvm-commits
mailing list