]> granicus.if.org Git - llvm/commitdiff
[InstCombine] fold X == 0 || X == -1 to one compare (PR32524)
authorSanjay Patel <spatel@rotateright.com>
Thu, 13 Apr 2017 18:47:06 +0000 (18:47 +0000)
committerSanjay Patel <spatel@rotateright.com>
Thu, 13 Apr 2017 18:47:06 +0000 (18:47 +0000)
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
test/Transforms/InstCombine/or.ll

index efe1c068300341567c1052d924ec28e046f2e04e..a661156f4cae66709c3eecd8892f7f8e0206028d 100644 (file)
@@ -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'.
index bf575418ce9305154a547405036e642547a1cafd..ad46023d8a580d97a753c401e1b6d95eb0e99637 100644 (file)
@@ -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