diff options
author | Sanjay Patel <spatel@rotateright.com> | 2016-04-14 20:17:40 +0000 |
---|---|---|
committer | Sanjay Patel <spatel@rotateright.com> | 2016-04-14 20:17:40 +0000 |
commit | e998b91d865e6d0db389b026d7b85f65ef5a2cad (patch) | |
tree | 64a3ec228bf51322262fd3e23e36f0f02eeaf071 /llvm/lib/Transforms | |
parent | dfa63248c7b2dd4ba903b9e55183c5d7f5d7338f (diff) | |
download | bcm5719-llvm-e998b91d865e6d0db389b026d7b85f65ef5a2cad.tar.gz bcm5719-llvm-e998b91d865e6d0db389b026d7b85f65ef5a2cad.zip |
[InstCombine] remove constant by inverting compare + logic (PR27105)
https://llvm.org/bugs/show_bug.cgi?id=27105
We can check if all bits outside of a constant mask are set with a
single constant.
As noted in the bug report, although this form should be considered the
canonical IR, backends may want to transform this into an 'andn' / 'andc'
comparison against zero because that could be a single machine instruction.
Differential Revision: http://reviews.llvm.org/D18842
llvm-svn: 266362
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp index 9b963fd6f12..c97b67eff24 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp @@ -2248,6 +2248,15 @@ Instruction *InstCombiner::visitICmpInstWithInstAndIntCst(ICmpInst &ICI, Constant *NotCI = ConstantExpr::getNot(RHS); if (!ConstantExpr::getAnd(BOC, NotCI)->isNullValue()) return replaceInstUsesWith(ICI, Builder->getInt1(isICMP_NE)); + + // Comparing if all bits outside of a constant mask are set? + // Replace (X | C) == -1 with (X & ~C) == ~C. + // This removes the -1 constant. + if (BO->hasOneUse() && RHS->isAllOnesValue()) { + Constant *NotBOC = ConstantExpr::getNot(BOC); + Value *And = Builder->CreateAnd(BO->getOperand(0), NotBOC); + return new ICmpInst(ICI.getPredicate(), And, NotBOC); + } } break; |