[PATCH] D45481: [IRCE] isKnownNonNegative helper

Sam Parker via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Apr 10 03:20:23 PDT 2018


samparker created this revision.
samparker added reviewers: mkazantsev, sanjoy.

Breaking out the isKnownNonNegative helper function from https://reviews.llvm.org/D45439. The reason why isKnownNegative was seemingly eeded was because I was using the UGE predicate as well as SGE...


https://reviews.llvm.org/D45481

Files:
  lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp
  test/Transforms/IRCE/variable-loop-bounds.ll


Index: test/Transforms/IRCE/variable-loop-bounds.ll
===================================================================
--- test/Transforms/IRCE/variable-loop-bounds.ll
+++ test/Transforms/IRCE/variable-loop-bounds.ll
@@ -55,7 +55,7 @@
 ; CHECK-LABEL: test_inc_ne
 ; CHECK: main.exit.selector:
 ; CHECK: [[PSEUDO_PHI:%[^ ]+]] = phi i32 [ %inc, %for.inc ]
-; CHECK: [[COND:%[^ ]+]] = icmp slt i32 [[PSEUDO_PHI]], %N
+; CHECK: [[COND:%[^ ]+]] = icmp ult i32 [[PSEUDO_PHI]], %N
 ; CHECK: br i1 [[COND]], label %main.pseudo.exit, label %for.cond.cleanup.loopexit
 define void @test_inc_ne(i32* nocapture %a, i32* nocapture readonly %b, i32* nocapture readonly %c, i32 %N) {
 entry:
Index: lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp
===================================================================
--- lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp
+++ lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp
@@ -804,6 +804,12 @@
                                      SE.getConstant(Min));
 }
 
+static bool isKnownNonNegative(const SCEV *BoundSCEV, Loop *L,
+                               ScalarEvolution &SE) {
+  const SCEV *Zero = SE.getConstant(BoundSCEV->getType(), 0, true);
+  return SE.isLoopEntryGuardedByCond(L, ICmpInst::ICMP_SGE, BoundSCEV, Zero);
+}
+
 Optional<LoopStructure>
 LoopStructure::parseLoopStructure(ScalarEvolution &SE,
                                   BranchProbabilityInfo *BPI, Loop &L,
@@ -963,8 +969,8 @@
         // If both parts are known non-negative, it is profitable to use
         // unsigned comparison in increasing loop. This allows us to make the
         // comparison check against "RightSCEV + 1" more optimistic.
-        if (SE.isKnownNonNegative(IndVarStart) &&
-            SE.isKnownNonNegative(RightSCEV))
+        if (isKnownNonNegative(IndVarStart, &L, SE) &&
+            isKnownNonNegative(RightSCEV, &L, SE))
           Pred = ICmpInst::ICMP_ULT;
         else
           Pred = ICmpInst::ICMP_SLT;


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D45481.141817.patch
Type: text/x-patch
Size: 1982 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180410/7b83f4e4/attachment.bin>


More information about the llvm-commits mailing list