diff options
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp | 9 | ||||
| -rw-r--r-- | llvm/test/Transforms/InstCombine/icmp.ll | 23 |
2 files changed, 32 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; diff --git a/llvm/test/Transforms/InstCombine/icmp.ll b/llvm/test/Transforms/InstCombine/icmp.ll index dcf30a1ce8f..2937e46cb8a 100644 --- a/llvm/test/Transforms/InstCombine/icmp.ll +++ b/llvm/test/Transforms/InstCombine/icmp.ll @@ -1956,3 +1956,26 @@ define i1 @PR26407(i32 %x, i32 %y) { %cmp = icmp uge i32 %addx, %addy ret i1 %cmp } + +define i1 @cmp_inverse_mask_bits_set_eq(i32 %x) { +; CHECK-LABEL: @cmp_inverse_mask_bits_set_eq( +; CHECK-NEXT: [[TMP1:%.*]] = and i32 %x, -43 +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[TMP1]], -43 +; CHECK-NEXT: ret i1 [[CMP]] +; + %or = or i32 %x, 42 + %cmp = icmp eq i32 %or, -1 + ret i1 %cmp +} + +define i1 @cmp_inverse_mask_bits_set_ne(i32 %x) { +; CHECK-LABEL: @cmp_inverse_mask_bits_set_ne( +; CHECK-NEXT: [[TMP1:%.*]] = and i32 %x, -43 +; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[TMP1]], -43 +; CHECK-NEXT: ret i1 [[CMP]] +; + %or = or i32 %x, 42 + %cmp = icmp ne i32 %or, -1 + ret i1 %cmp +} + |

