[PATCH] D109959: [SCEV] Generalize implication when signedness of FoundPred doesn't matter

Max Kazantsev via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Sep 17 03:42:47 PDT 2021


mkazantsev created this revision.
mkazantsev added reviewers: reames, nikic, lebedev.ri, fhahn.
Herald added a subscriber: hiraditya.
mkazantsev requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

The implication logic for two values that are both negative or non-negative
says that it doesn't matter whether their predicate is signed and unsigned it,
but only flips unsigned into signed for further inference. This patch adds support
for flipping an signed predicate into unsigned.


https://reviews.llvm.org/D109959

Files:
  llvm/lib/Analysis/ScalarEvolution.cpp
  llvm/test/Transforms/IndVarSimplify/negative_ranges.ll


Index: llvm/test/Transforms/IndVarSimplify/negative_ranges.ll
===================================================================
--- llvm/test/Transforms/IndVarSimplify/negative_ranges.ll
+++ llvm/test/Transforms/IndVarSimplify/negative_ranges.ll
@@ -4,7 +4,6 @@
 
 declare i1 @cond()
 
-; FIXME: 2nd check is implied by the 1st one as both values are negative.
 define i32 @test_01(i32* %p, i32* %s) {
 ; CHECK-LABEL: @test_01(
 ; CHECK-NEXT:  entry:
@@ -16,8 +15,7 @@
 ; CHECK-NEXT:    [[C1:%.*]] = icmp slt i32 [[IV]], [[END]]
 ; CHECK-NEXT:    br i1 [[C1]], label [[GUARDED:%.*]], label [[SIDE_EXIT:%.*]]
 ; CHECK:       guarded:
-; CHECK-NEXT:    [[C2:%.*]] = icmp ult i32 [[IV]], [[END]]
-; CHECK-NEXT:    br i1 [[C2]], label [[BACKEDGE]], label [[SIDE_EXIT]]
+; CHECK-NEXT:    br i1 true, label [[BACKEDGE]], label [[SIDE_EXIT]]
 ; CHECK:       backedge:
 ; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1
 ; CHECK-NEXT:    [[LOOP_COND:%.*]] = call i1 @cond()
Index: llvm/lib/Analysis/ScalarEvolution.cpp
===================================================================
--- llvm/lib/Analysis/ScalarEvolution.cpp
+++ llvm/lib/Analysis/ScalarEvolution.cpp
@@ -10704,8 +10704,13 @@
 
   // Unsigned comparison is the same as signed comparison when both the operands
   // are non-negative or negative.
-  if (CmpInst::isUnsigned(FoundPred) &&
-      CmpInst::getSignedPredicate(FoundPred) == Pred &&
+  auto IsSignSwappedPredicate = [](CmpInst::Predicate P1,
+                                   CmpInst::Predicate P2) {
+    assert(P1 != P2 && "Handled earlier!");
+    return (CmpInst::isUnsigned(P2) && P1 == CmpInst::getSignedPredicate(P2)) ||
+           (CmpInst::isSigned(P2) && P1 == CmpInst::getUnsignedPredicate(P2));
+  };
+  if (IsSignSwappedPredicate(Pred, FoundPred) &&
       ((isKnownNonNegative(FoundLHS) && isKnownNonNegative(FoundRHS)) ||
        (isKnownNegative(FoundLHS) && isKnownNegative(FoundRHS))))
     return isImpliedCondOperands(Pred, LHS, RHS, FoundLHS, FoundRHS, Context);


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D109959.373182.patch
Type: text/x-patch
Size: 2019 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210917/95eaf418/attachment.bin>


More information about the llvm-commits mailing list