From 7784ce736d88efe4aa94970ec76e70361ec22d97 Mon Sep 17 00:00:00 2001 From: Sanjay Patel Date: Thu, 13 Apr 2017 18:47:06 +0000 Subject: [PATCH] [InstCombine] fold X == 0 || X == -1 to one compare (PR32524) This is effectively a retry of: https://reviews.llvm.org/rL299851 but now we have tests and an assert to make sure the bug that was exposed with that attempt will not happen again. I'll fix the code duplication and missing sibling fold next, but I want to make this change as small as possible to reduce risk since I messed it up last time. This should fix: https://bugs.llvm.org/show_bug.cgi?id=32524 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@300236 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/InstCombine/InstCombineAndOrXor.cpp | 6 +++++- test/Transforms/InstCombine/or.ll | 7 +++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp b/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp index efe1c068300..a661156f4ca 100644 --- a/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp +++ b/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp @@ -878,7 +878,7 @@ Value *InstCombiner::FoldAndOfICmps(ICmpInst *LHS, ICmpInst *RHS) { return RHS; case ICmpInst::ICMP_NE: // Special case to get the ordering right when the values wrap around - // zero. + // zero. Ie, we assumed the constants were unsigned when swapping earlier. if (LHSC->getValue() == 0 && RHSC->getValue().isAllOnesValue()) std::swap(LHSC, RHSC); if (LHSC == SubOne(RHSC)) { @@ -1785,6 +1785,10 @@ Value *InstCombiner::FoldOrOfICmps(ICmpInst *LHS, ICmpInst *RHS, } } + // Special case to get the ordering right when the values wrap around + // zero. Ie, we assumed the constants were unsigned when swapping earlier. + if (LHSC->getValue() == 0 && RHSC->getValue().isAllOnesValue()) + std::swap(LHSC, RHSC); if (LHSC == SubOne(RHSC)) { // (X == 13 | X == 14) -> X-13 <=u 1 // An 'add' is the canonical IR form, so favor that over a 'sub'. diff --git a/test/Transforms/InstCombine/or.ll b/test/Transforms/InstCombine/or.ll index bf575418ce9..ad46023d8a5 100644 --- a/test/Transforms/InstCombine/or.ll +++ b/test/Transforms/InstCombine/or.ll @@ -271,10 +271,9 @@ define i1 @cmp_eq_with_diff_one(i8 %x) { define i1 @cmp_eq_with_diff_one_signed(i32 %x) { ; CHECK-LABEL: @cmp_eq_with_diff_one_signed( -; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i32 %x, -1 -; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i32 %x, 0 -; CHECK-NEXT: [[OR:%.*]] = or i1 [[CMP1]], [[CMP2]] -; CHECK-NEXT: ret i1 [[OR]] +; CHECK-NEXT: [[TMP1:%.*]] = add i32 %x, 1 +; CHECK-NEXT: [[TMP2:%.*]] = icmp ult i32 [[TMP1]], 2 +; CHECK-NEXT: ret i1 [[TMP2]] ; %cmp1 = icmp eq i32 %x, -1 %cmp2 = icmp eq i32 %x, 0 -- 2.40.0