summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp')
-rw-r--r--llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp14
1 files changed, 10 insertions, 4 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
index 75c434265fb..6a798f91759 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
@@ -2372,7 +2372,7 @@ Instruction *InstCombiner::foldICmpIntrinsicWithConstant(ICmpInst &ICI) {
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));
@@ -2380,14 +2380,20 @@ Instruction *InstCombiner::foldICmpIntrinsicWithConstant(ICmpInst &ICI) {
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;
OpenPOWER on IntegriCloud