diff options
Diffstat (limited to 'llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp')
| -rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp | 14 |
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; |

