[polly] r249274 - [FIX] Count affine loops correctly

Johannes Doerfert via llvm-commits llvm-commits at lists.llvm.org
Sun Oct 4 07:56:08 PDT 2015


Author: jdoerfert
Date: Sun Oct  4 09:56:08 2015
New Revision: 249274

URL: http://llvm.org/viewvc/llvm-project?rev=249274&view=rev
Log:
[FIX] Count affine loops correctly

  The "unprofitable" heuristic was broken and counted boxed loops
  even though we do not represent and optimize them.

Added:
    polly/trunk/test/ScopDetect/only-one-affine-loop.ll
Modified:
    polly/trunk/include/polly/ScopDetection.h
    polly/trunk/lib/Analysis/ScopDetection.cpp
    polly/trunk/test/ScopDetect/invalid-latch-conditions.ll
    polly/trunk/test/ScopDetect/non-affine-loop-condition-dependent-access.ll
    polly/trunk/test/ScopDetect/non-affine-loop-condition-dependent-access_2.ll
    polly/trunk/test/ScopDetect/non-affine-loop-condition-dependent-access_3.ll
    polly/trunk/test/ScopDetect/non-affine-loop.ll
    polly/trunk/test/ScopDetect/non_affine_loop_condition.ll
    polly/trunk/test/ScopInfo/NonAffine/non-affine-loop-condition-dependent-access_1.ll
    polly/trunk/test/ScopInfo/NonAffine/non_affine_conditional_surrounding_non_affine_loop.ll
    polly/trunk/test/ScopInfo/NonAffine/non_affine_loop_condition.ll
    polly/trunk/test/ScopInfo/NonAffine/non_affine_loop_used_later.ll

Modified: polly/trunk/include/polly/ScopDetection.h
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/include/polly/ScopDetection.h?rev=249274&r1=249273&r2=249274&view=diff
==============================================================================
--- polly/trunk/include/polly/ScopDetection.h (original)
+++ polly/trunk/include/polly/ScopDetection.h Sun Oct  4 09:56:08 2015
@@ -171,9 +171,6 @@ private:
     /// @brief The region has at least one store instruction.
     bool hasStores;
 
-    /// @brief The region has at least one loop that is not overapproximated.
-    bool hasAffineLoops;
-
     /// @brief The set of non-affine subregions in the region we analyze.
     NonAffineSubRegionSetTy &NonAffineSubRegionSet;
 
@@ -184,8 +181,7 @@ private:
                      NonAffineSubRegionSetTy &NASRS, BoxedLoopsSetTy &BLS,
                      bool Verify)
         : CurRegion(R), AST(AA), Verifying(Verify), Log(&R), hasLoads(false),
-          hasStores(false), hasAffineLoops(false), NonAffineSubRegionSet(NASRS),
-          BoxedLoopsSet(BLS) {}
+          hasStores(false), NonAffineSubRegionSet(NASRS), BoxedLoopsSet(BLS) {}
   };
 
   // Remember the valid regions
@@ -321,10 +317,10 @@ private:
   /// @return True if the loop is valid in the region.
   bool isValidLoop(Loop *L, DetectionContext &Context) const;
 
-  /// @brief Check if a region contains more than one loop.
+  /// @brief Count the number of beneficial loops in @p R.
   ///
   /// @param R The region to check
-  bool hasMoreThanOneLoop(Region *R) const;
+  int countBeneficialLoops(Region *R) const;
 
   /// @brief Check if the function @p F is marked as invalid.
   ///

Modified: polly/trunk/lib/Analysis/ScopDetection.cpp
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/Analysis/ScopDetection.cpp?rev=249274&r1=249273&r2=249274&view=diff
==============================================================================
--- polly/trunk/lib/Analysis/ScopDetection.cpp (original)
+++ polly/trunk/lib/Analysis/ScopDetection.cpp Sun Oct  4 09:56:08 2015
@@ -752,10 +752,8 @@ bool ScopDetection::canUseISLTripCount(L
 }
 
 bool ScopDetection::isValidLoop(Loop *L, DetectionContext &Context) const {
-  if (canUseISLTripCount(L, Context)) {
-    Context.hasAffineLoops = true;
+  if (canUseISLTripCount(L, Context))
     return true;
-  }
 
   if (AllowNonAffineSubLoops && AllowNonAffineSubRegions) {
     Region *R = RI->getRegionFor(L->getHeader());
@@ -772,22 +770,23 @@ bool ScopDetection::isValidLoop(Loop *L,
 
 /// @brief Return the number of loops in @p L (incl. @p L) that have a trip
 ///        count that is not known to be less than MIN_LOOP_TRIP_COUNT.
-static unsigned countBeneficialLoops(Loop *L, ScalarEvolution &SE) {
+static int countBeneficialSubLoops(Loop *L, ScalarEvolution &SE) {
   auto *TripCount = SE.getBackedgeTakenCount(L);
 
-  auto count = 1;
+  int count = 1;
   if (auto *TripCountC = dyn_cast<SCEVConstant>(TripCount))
-    if (TripCountC->getValue()->getZExtValue() < MIN_LOOP_TRIP_COUNT)
-      count -= 1;
+    if (TripCountC->getType()->getScalarSizeInBits() <= 64)
+      if (TripCountC->getValue()->getZExtValue() < MIN_LOOP_TRIP_COUNT)
+        count -= 1;
 
   for (auto &SubLoop : *L)
-    count += countBeneficialLoops(SubLoop, SE);
+    count += countBeneficialSubLoops(SubLoop, SE);
 
   return count;
 }
 
-bool ScopDetection::hasMoreThanOneLoop(Region *R) const {
-  auto LoopNum = 0;
+int ScopDetection::countBeneficialLoops(Region *R) const {
+  int LoopNum = 0;
 
   auto L = LI->getLoopFor(R->getEntry());
   L = L ? R->outermostLoopInRegion(L) : nullptr;
@@ -797,13 +796,10 @@ bool ScopDetection::hasMoreThanOneLoop(R
       L ? L->getSubLoopsVector() : std::vector<Loop *>(LI->begin(), LI->end());
 
   for (auto &SubLoop : SubLoops)
-    if (R->contains(SubLoop)) {
-      LoopNum += countBeneficialLoops(SubLoop, *SE);
+    if (R->contains(SubLoop))
+      LoopNum += countBeneficialSubLoops(SubLoop, *SE);
 
-      if (LoopNum >= 2)
-        return true;
-    }
-  return false;
+  return LoopNum;
 }
 
 Region *ScopDetection::expandRegion(Region &R) {
@@ -1003,7 +999,8 @@ bool ScopDetection::isValidRegion(Detect
       &(CurRegion.getEntry()->getParent()->getEntryBlock()))
     return invalid<ReportEntry>(Context, /*Assert=*/true, CurRegion.getEntry());
 
-  if (!DetectUnprofitable && !hasMoreThanOneLoop(&CurRegion))
+  int NumLoops = countBeneficialLoops(&CurRegion);
+  if (!DetectUnprofitable && NumLoops < 2)
     invalid<ReportUnprofitable>(Context, /*Assert=*/true, &CurRegion);
 
   if (!allBlocksValid(Context))
@@ -1014,9 +1011,9 @@ bool ScopDetection::isValidRegion(Detect
   if (!DetectUnprofitable && (!Context.hasStores || !Context.hasLoads))
     invalid<ReportUnprofitable>(Context, /*Assert=*/true, &CurRegion);
 
-  // Check if there was at least one non-overapproximated loop in the region or
-  // we allow regions without loops.
-  if (!DetectUnprofitable && !Context.hasAffineLoops)
+  // Check if there are sufficent non-overapproximated loops.
+  int NumAffineLoops = NumLoops - Context.BoxedLoopsSet.size();
+  if (!DetectUnprofitable && NumAffineLoops < 2)
     invalid<ReportUnprofitable>(Context, /*Assert=*/true, &CurRegion);
 
   DEBUG(dbgs() << "OK\n");

Modified: polly/trunk/test/ScopDetect/invalid-latch-conditions.ll
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/ScopDetect/invalid-latch-conditions.ll?rev=249274&r1=249273&r2=249274&view=diff
==============================================================================
--- polly/trunk/test/ScopDetect/invalid-latch-conditions.ll (original)
+++ polly/trunk/test/ScopDetect/invalid-latch-conditions.ll Sun Oct  4 09:56:08 2015
@@ -1,11 +1,13 @@
 ; RUN: opt %loadPolly -polly-detect -analyze < %s | FileCheck %s
-; RUN: opt %loadPolly -polly-allow-nonaffine-loops -polly-detect -analyze < %s | FileCheck %s --check-prefix=NALOOPS
+; RUN: opt %loadPolly -polly-allow-nonaffine-loops -polly-detect-unprofitable -polly-detect -analyze < %s | FileCheck %s --check-prefix=NALOOPS
+; RUN: opt %loadPolly -polly-allow-nonaffine-loops -polly-detect -analyze < %s | FileCheck %s --check-prefix=PROFIT
 
 ; The latch conditions of the outer loop are not affine, thus the loop cannot
 ; handled by the domain generation and needs to be overapproximated.
 
-; CHECK-NOT: Valid
-; NALOOPS:   Valid Region for Scop: for.body.6 => for.end.45
+; CHECK-NOT:  Valid
+; NALOOPS:    Valid Region for Scop: for.body.6 => for.end.45
+; PROFIT-NOT: Valid
 
 ; ModuleID = '/home/johannes/Downloads/bug.ll'
 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"

Modified: polly/trunk/test/ScopDetect/non-affine-loop-condition-dependent-access.ll
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/ScopDetect/non-affine-loop-condition-dependent-access.ll?rev=249274&r1=249273&r2=249274&view=diff
==============================================================================
--- polly/trunk/test/ScopDetect/non-affine-loop-condition-dependent-access.ll (original)
+++ polly/trunk/test/ScopDetect/non-affine-loop-condition-dependent-access.ll Sun Oct  4 09:56:08 2015
@@ -1,6 +1,7 @@
-; RUN: opt %loadPolly -basicaa -polly-detect -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=false -analyze < %s | FileCheck %s --check-prefix=REJECTNONAFFINELOOPS
-; RUN: opt %loadPolly -basicaa -polly-detect -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=true -analyze < %s | FileCheck %s --check-prefix=ALLOWNONAFFINELOOPS
-; RUN: opt %loadPolly -basicaa -polly-detect -polly-allow-nonaffine -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=true -analyze < %s | FileCheck %s --check-prefix=ALLOWNONAFFINELOOPSANDACCESSES
+; RUN: opt %loadPolly -basicaa -polly-detect-unprofitable -polly-detect -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=false -analyze < %s | FileCheck %s --check-prefix=REJECTNONAFFINELOOPS
+; RUN: opt %loadPolly -basicaa -polly-detect-unprofitable -polly-detect -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=true -analyze < %s | FileCheck %s --check-prefix=ALLOWNONAFFINELOOPS
+; RUN: opt %loadPolly -basicaa -polly-detect-unprofitable -polly-detect -polly-allow-nonaffine -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=true -analyze < %s | FileCheck %s --check-prefix=ALLOWNONAFFINELOOPSANDACCESSES
+; RUN: opt %loadPolly -basicaa -polly-detect -polly-allow-nonaffine -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=true -analyze < %s | FileCheck %s --check-prefix=PROFIT
 ;
 ; Here we have a non-affine loop but also a non-affine access which should
 ; be rejected as long as -polly-allow-nonaffine isn't given.
@@ -8,6 +9,7 @@
 ; REJECTNONAFFINELOOPS-NOT:       Valid
 ; ALLOWNONAFFINELOOPS-NOT:        Valid
 ; ALLOWNONAFFINELOOPSANDACCESSES: Valid Region for Scop: bb1 => bb13
+; PROFIT-NOT:                     Valid
 ;
 ;    void f(int * restrict A, int * restrict C) {
 ;      int j;

Modified: polly/trunk/test/ScopDetect/non-affine-loop-condition-dependent-access_2.ll
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/ScopDetect/non-affine-loop-condition-dependent-access_2.ll?rev=249274&r1=249273&r2=249274&view=diff
==============================================================================
--- polly/trunk/test/ScopDetect/non-affine-loop-condition-dependent-access_2.ll (original)
+++ polly/trunk/test/ScopDetect/non-affine-loop-condition-dependent-access_2.ll Sun Oct  4 09:56:08 2015
@@ -1,10 +1,10 @@
-; RUN: opt %loadPolly -basicaa -polly-detect -polly-allow-nonaffine-branches \
+; RUN: opt %loadPolly -polly-detect-unprofitable -polly-detect -polly-allow-nonaffine-branches \
 ; RUN:     -polly-allow-nonaffine-loops=false -polly-detect-unprofitable \
 ; RUN:     -analyze < %s | FileCheck %s --check-prefix=REJECTNONAFFINELOOPS
-; RUN: opt %loadPolly -basicaa -polly-detect -polly-allow-nonaffine-branches \
+; RUN: opt %loadPolly -polly-detect-unprofitable -polly-detect -polly-allow-nonaffine-branches \
 ; RUN:     -polly-allow-nonaffine-loops=true -polly-detect-unprofitable \
 ; RUN:     -analyze < %s | FileCheck %s --check-prefix=ALLOWNONAFFINELOOPS
-; RUN: opt %loadPolly -basicaa -polly-detect -polly-allow-nonaffine \
+; RUN: opt %loadPolly -polly-detect-unprofitable -polly-detect -polly-allow-nonaffine \
 ; RUN:     -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=true \
 ; RUN:     -polly-detect-unprofitable -analyze < %s \
 ; RUN:     | FileCheck %s --check-prefix=ALLOWNONAFFINELOOPSANDACCESSES

Modified: polly/trunk/test/ScopDetect/non-affine-loop-condition-dependent-access_3.ll
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/ScopDetect/non-affine-loop-condition-dependent-access_3.ll?rev=249274&r1=249273&r2=249274&view=diff
==============================================================================
--- polly/trunk/test/ScopDetect/non-affine-loop-condition-dependent-access_3.ll (original)
+++ polly/trunk/test/ScopDetect/non-affine-loop-condition-dependent-access_3.ll Sun Oct  4 09:56:08 2015
@@ -1,10 +1,10 @@
-; RUN: opt %loadPolly -basicaa -polly-detect -polly-allow-nonaffine-branches \
+; RUN: opt %loadPolly -polly-detect-unprofitable -polly-detect -polly-allow-nonaffine-branches \
 ; RUN:     -polly-allow-nonaffine-loops=false -polly-detect-unprofitable \
 ; RUN:     -analyze < %s | FileCheck %s --check-prefix=REJECTNONAFFINELOOPS
-; RUN: opt %loadPolly -basicaa -polly-detect -polly-allow-nonaffine-branches \
+; RUN: opt %loadPolly -polly-detect-unprofitable -polly-detect -polly-allow-nonaffine-branches \
 ; RUN:     -polly-allow-nonaffine-loops=true -polly-detect-unprofitable \
 ; RUN:     -analyze < %s | FileCheck %s --check-prefix=ALLOWNONAFFINELOOPS
-; RUN: opt %loadPolly -basicaa -polly-detect -polly-allow-nonaffine \
+; RUN: opt %loadPolly -polly-detect-unprofitable -polly-detect -polly-allow-nonaffine \
 ; RUN:     -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=true \
 ; RUN:     -polly-detect-unprofitable -analyze < %s | FileCheck %s \
 ; RUN:     --check-prefix=ALLOWNONAFFINELOOPSANDACCESSES

Modified: polly/trunk/test/ScopDetect/non-affine-loop.ll
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/ScopDetect/non-affine-loop.ll?rev=249274&r1=249273&r2=249274&view=diff
==============================================================================
--- polly/trunk/test/ScopDetect/non-affine-loop.ll (original)
+++ polly/trunk/test/ScopDetect/non-affine-loop.ll Sun Oct  4 09:56:08 2015
@@ -1,13 +1,21 @@
-; RUN: opt %loadPolly -polly-detect -polly-allow-nonaffine-branches \
+; RUN: opt %loadPolly -polly-detect-unprofitable -polly-detect -polly-allow-nonaffine-branches \
 ; RUN:     -polly-allow-nonaffine-loops=false -polly-detect-unprofitable \
 ; RUN:     -analyze < %s | FileCheck %s --check-prefix=REJECTNONAFFINELOOPS
-; RUN: opt %loadPolly -polly-detect -polly-allow-nonaffine-branches \
+; RUN: opt %loadPolly -polly-detect-unprofitable -polly-detect -polly-allow-nonaffine-branches \
 ; RUN:     -polly-allow-nonaffine-loops=true -polly-detect-unprofitable \
 ; RUN:     -analyze < %s | FileCheck %s --check-prefix=ALLOWNONAFFINELOOPS
-; RUN: opt %loadPolly -polly-detect -polly-allow-nonaffine-branches \
+; RUN: opt %loadPolly -polly-detect-unprofitable -polly-detect -polly-allow-nonaffine-branches \
+; RUN:     -polly-allow-nonaffine-loops=false -polly-allow-nonaffine \
+; RUN:     -analyze < %s | FileCheck %s \
+; RUN:     --check-prefix=ALLOWNONAFFINEREGIONSANDACCESSES
+; RUN: opt %loadPolly -polly-detect-unprofitable -polly-detect -polly-allow-nonaffine-branches \
 ; RUN:     -polly-allow-nonaffine-loops=true -polly-allow-nonaffine \
 ; RUN:     -analyze < %s | FileCheck %s \
 ; RUN:     --check-prefix=ALLOWNONAFFINELOOPSANDACCESSES
+; RUN: opt %loadPolly -polly-detect -polly-allow-nonaffine-branches \
+; RUN:     -polly-allow-nonaffine-loops=true -polly-allow-nonaffine \
+; RUN:     -analyze < %s | FileCheck %s \
+; RUN:     --check-prefix=PROFIT
 ;
 ; This function/region does contain a loop, however it is non-affine, hence the access
 ; A[i] is also. Furthermore, it is the only loop, thus when we over approximate
@@ -19,9 +27,11 @@
 ;        A[-1]++;
 ;    }
 ;
-; REJECTNONAFFINELOOPS-NOT:                 Valid
-; ALLOWNONAFFINELOOPS-NOT:                  Valid
-; ALLOWNONAFFINELOOPSANDACCESSES-NOT:       Valid
+; REJECTNONAFFINELOOPS-NOT:              Valid
+; ALLOWNONAFFINELOOPS-NOT:               Valid
+; ALLOWNONAFFINEREGIONSANDACCESSES-NOT:  Valid
+; ALLOWNONAFFINELOOPSANDACCESSES:        Valid
+; PROFIT-NOT:                            Valid
 ;
 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
 

Modified: polly/trunk/test/ScopDetect/non_affine_loop_condition.ll
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/ScopDetect/non_affine_loop_condition.ll?rev=249274&r1=249273&r2=249274&view=diff
==============================================================================
--- polly/trunk/test/ScopDetect/non_affine_loop_condition.ll (original)
+++ polly/trunk/test/ScopDetect/non_affine_loop_condition.ll Sun Oct  4 09:56:08 2015
@@ -1,4 +1,5 @@
-; RUN: opt %loadPolly -polly-detect -polly-allow-nonaffine-loops -analyze < %s | FileCheck %s
+; RUN: opt %loadPolly -polly-detect-unprofitable -polly-detect -polly-allow-nonaffine-loops -analyze < %s | FileCheck %s
+; RUN: opt %loadPolly -polly-detect -polly-allow-nonaffine-loops -analyze < %s | FileCheck %s --check-prefix=PROFIT
 ;
 ;    void f(int *A) {
 ;      for (int i = 0; i < 1024; i++) {
@@ -7,6 +8,8 @@
 ;      }
 ;    }
 ;
+; PROFIT-NOT: Valid
+;
 ; CHECK: Valid Region for Scop: bb1 => bb12
 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
 

Added: polly/trunk/test/ScopDetect/only-one-affine-loop.ll
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/ScopDetect/only-one-affine-loop.ll?rev=249274&view=auto
==============================================================================
--- polly/trunk/test/ScopDetect/only-one-affine-loop.ll (added)
+++ polly/trunk/test/ScopDetect/only-one-affine-loop.ll Sun Oct  4 09:56:08 2015
@@ -0,0 +1,170 @@
+; RUN: opt %loadPolly -polly-detect -analyze \
+; RUN:     -polly-allow-nonaffine-loops < %s | FileCheck %s
+;
+; RUN: opt %loadPolly -polly-detect -polly-detect-unprofitable -analyze \
+; RUN:     -polly-allow-nonaffine-loops < %s | FileCheck %s --check-prefix=UNPROFIT
+;
+; Even if we allow non-affine loops we can only model the outermost loop, all
+; other loops are boxed in non-affine regions
+;
+; CHECK-NOT: Valid
+; UNPROFIT:  Valid Region for Scop: for.cond => for.end.51
+;
+;    void f(int *A) {
+;      for (int i = 0; i < 100; i++) {
+;        // Non-affine
+;        for (int j = 0; j < i * i; j++)
+;          for (int k = 0; k < i; k++)
+;            A[i]++;
+;        // Non-affine
+;        for (int j = 0; j < i * i; j++)
+;          // Non-affine
+;          for (int k = 0; k < j; k++)
+;            A[i]++;
+;        // Non-affine
+;        if (A[i])
+;          for (int j = 0; j < 100; j++)
+;            for (int k = 0; k < j * j; k++)
+;              A[i]++;
+;      }
+;    }
+;
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+
+define void @f(i32* %A) {
+entry:
+  br label %for.cond
+
+for.cond:                                         ; preds = %for.inc.49, %entry
+  %indvars.iv5 = phi i64 [ %indvars.iv.next6, %for.inc.49 ], [ 0, %entry ]
+  %indvars.iv = phi i32 [ %indvars.iv.next, %for.inc.49 ], [ 0, %entry ]
+  %exitcond9 = icmp ne i64 %indvars.iv5, 100
+  br i1 %exitcond9, label %for.body, label %for.end.51
+
+for.body:                                         ; preds = %for.cond
+  br label %for.cond.1
+
+for.cond.1:                                       ; preds = %for.inc.8, %for.body
+  %j.0 = phi i32 [ 0, %for.body ], [ %inc9, %for.inc.8 ]
+  %tmp = mul nsw i64 %indvars.iv5, %indvars.iv5
+  %tmp10 = sext i32 %j.0 to i64
+  %cmp2 = icmp slt i64 %tmp10, %tmp
+  br i1 %cmp2, label %for.body.3, label %for.end.10
+
+for.body.3:                                       ; preds = %for.cond.1
+  br label %for.cond.4
+
+for.cond.4:                                       ; preds = %for.inc, %for.body.3
+  %k.0 = phi i32 [ 0, %for.body.3 ], [ %inc7, %for.inc ]
+  %exitcond = icmp ne i32 %k.0, %indvars.iv
+  br i1 %exitcond, label %for.body.6, label %for.end
+
+for.body.6:                                       ; preds = %for.cond.4
+  %arrayidx = getelementptr inbounds i32, i32* %A, i64 %indvars.iv5
+  %tmp11 = load i32, i32* %arrayidx, align 4
+  %inc = add nsw i32 %tmp11, 1
+  store i32 %inc, i32* %arrayidx, align 4
+  br label %for.inc
+
+for.inc:                                          ; preds = %for.body.6
+  %inc7 = add nuw nsw i32 %k.0, 1
+  br label %for.cond.4
+
+for.end:                                          ; preds = %for.cond.4
+  br label %for.inc.8
+
+for.inc.8:                                        ; preds = %for.end
+  %inc9 = add nuw nsw i32 %j.0, 1
+  br label %for.cond.1
+
+for.end.10:                                       ; preds = %for.cond.1
+  br label %for.cond.12
+
+for.cond.12:                                      ; preds = %for.inc.26, %for.end.10
+  %indvars.iv1 = phi i32 [ %indvars.iv.next2, %for.inc.26 ], [ 0, %for.end.10 ]
+  %tmp12 = mul nsw i64 %indvars.iv5, %indvars.iv5
+  %tmp13 = sext i32 %indvars.iv1 to i64
+  %cmp14 = icmp slt i64 %tmp13, %tmp12
+  br i1 %cmp14, label %for.body.15, label %for.end.28
+
+for.body.15:                                      ; preds = %for.cond.12
+  br label %for.cond.17
+
+for.cond.17:                                      ; preds = %for.inc.23, %for.body.15
+  %k16.0 = phi i32 [ 0, %for.body.15 ], [ %inc24, %for.inc.23 ]
+  %exitcond3 = icmp ne i32 %k16.0, %indvars.iv1
+  br i1 %exitcond3, label %for.body.19, label %for.end.25
+
+for.body.19:                                      ; preds = %for.cond.17
+  %arrayidx21 = getelementptr inbounds i32, i32* %A, i64 %indvars.iv5
+  %tmp14 = load i32, i32* %arrayidx21, align 4
+  %inc22 = add nsw i32 %tmp14, 1
+  store i32 %inc22, i32* %arrayidx21, align 4
+  br label %for.inc.23
+
+for.inc.23:                                       ; preds = %for.body.19
+  %inc24 = add nuw nsw i32 %k16.0, 1
+  br label %for.cond.17
+
+for.end.25:                                       ; preds = %for.cond.17
+  br label %for.inc.26
+
+for.inc.26:                                       ; preds = %for.end.25
+  %indvars.iv.next2 = add nuw nsw i32 %indvars.iv1, 1
+  br label %for.cond.12
+
+for.end.28:                                       ; preds = %for.cond.12
+  %arrayidx30 = getelementptr inbounds i32, i32* %A, i64 %indvars.iv5
+  %tmp15 = load i32, i32* %arrayidx30, align 4
+  %tobool = icmp eq i32 %tmp15, 0
+  br i1 %tobool, label %if.end, label %if.then
+
+if.then:                                          ; preds = %for.end.28
+  br label %for.cond.32
+
+for.cond.32:                                      ; preds = %for.inc.46, %if.then
+  %j31.0 = phi i32 [ 0, %if.then ], [ %inc47, %for.inc.46 ]
+  %exitcond4 = icmp ne i32 %j31.0, 100
+  br i1 %exitcond4, label %for.body.34, label %for.end.48
+
+for.body.34:                                      ; preds = %for.cond.32
+  br label %for.cond.36
+
+for.cond.36:                                      ; preds = %for.inc.43, %for.body.34
+  %k35.0 = phi i32 [ 0, %for.body.34 ], [ %inc44, %for.inc.43 ]
+  %mul37 = mul nsw i32 %j31.0, %j31.0
+  %cmp38 = icmp slt i32 %k35.0, %mul37
+  br i1 %cmp38, label %for.body.39, label %for.end.45
+
+for.body.39:                                      ; preds = %for.cond.36
+  %arrayidx41 = getelementptr inbounds i32, i32* %A, i64 %indvars.iv5
+  %tmp16 = load i32, i32* %arrayidx41, align 4
+  %inc42 = add nsw i32 %tmp16, 1
+  store i32 %inc42, i32* %arrayidx41, align 4
+  br label %for.inc.43
+
+for.inc.43:                                       ; preds = %for.body.39
+  %inc44 = add nuw nsw i32 %k35.0, 1
+  br label %for.cond.36
+
+for.end.45:                                       ; preds = %for.cond.36
+  br label %for.inc.46
+
+for.inc.46:                                       ; preds = %for.end.45
+  %inc47 = add nuw nsw i32 %j31.0, 1
+  br label %for.cond.32
+
+for.end.48:                                       ; preds = %for.cond.32
+  br label %if.end
+
+if.end:                                           ; preds = %for.end.28, %for.end.48
+  br label %for.inc.49
+
+for.inc.49:                                       ; preds = %if.end
+  %indvars.iv.next6 = add nuw nsw i64 %indvars.iv5, 1
+  %indvars.iv.next = add nuw nsw i32 %indvars.iv, 1
+  br label %for.cond
+
+for.end.51:                                       ; preds = %for.cond
+  ret void
+}

Modified: polly/trunk/test/ScopInfo/NonAffine/non-affine-loop-condition-dependent-access_1.ll
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/ScopInfo/NonAffine/non-affine-loop-condition-dependent-access_1.ll?rev=249274&r1=249273&r2=249274&view=diff
==============================================================================
--- polly/trunk/test/ScopInfo/NonAffine/non-affine-loop-condition-dependent-access_1.ll (original)
+++ polly/trunk/test/ScopInfo/NonAffine/non-affine-loop-condition-dependent-access_1.ll Sun Oct  4 09:56:08 2015
@@ -1,4 +1,5 @@
-; RUN: opt %loadPolly -basicaa -polly-scops -polly-allow-nonaffine -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=true -analyze < %s | FileCheck %s -check-prefix=SCALAR
+; RUN: opt %loadPolly -basicaa -polly-detect-unprofitable -polly-scops -polly-allow-nonaffine -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=true -analyze < %s | FileCheck %s -check-prefix=SCALAR
+; RUN: opt %loadPolly -basicaa -polly-scops -polly-allow-nonaffine -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=true -analyze < %s | FileCheck %s -check-prefix=PROFIT
 ;
 ; SCALAR:    Function: f
 ; SCALAR:    Region: %bb1---%bb13
@@ -27,6 +28,7 @@
 ; SCALAR:                { Stmt_bb3__TO__bb11[i0] -> MemRef_A[o0] : o0 <= 2147483645 and o0 >= -2147483648 };
 ; SCALAR:    }
 
+; PROFIT-NOT: Statements
 ;
 ;    void f(int * restrict A, int * restrict C) {
 ;      int j;

Modified: polly/trunk/test/ScopInfo/NonAffine/non_affine_conditional_surrounding_non_affine_loop.ll
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/ScopInfo/NonAffine/non_affine_conditional_surrounding_non_affine_loop.ll?rev=249274&r1=249273&r2=249274&view=diff
==============================================================================
--- polly/trunk/test/ScopInfo/NonAffine/non_affine_conditional_surrounding_non_affine_loop.ll (original)
+++ polly/trunk/test/ScopInfo/NonAffine/non_affine_conditional_surrounding_non_affine_loop.ll Sun Oct  4 09:56:08 2015
@@ -1,9 +1,12 @@
 ; RUN: opt %loadPolly -polly-scops -polly-allow-nonaffine-branches \
 ; RUN:     -polly-allow-nonaffine-loops=true -polly-detect-unprofitable \
 ; RUN:     -analyze < %s | FileCheck %s --check-prefix=INNERMOST
-; RUN: opt %loadPolly -polly-scops -polly-allow-nonaffine \
+; RUN: opt %loadPolly -polly-scops -polly-allow-nonaffine -polly-detect-unprofitable \
 ; RUN:     -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=true \
 ; RUN:     -analyze < %s | FileCheck %s --check-prefix=ALL
+; RUN: opt %loadPolly -polly-scops -polly-allow-nonaffine \
+; RUN:     -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=true \
+; RUN:     -analyze < %s | FileCheck %s --check-prefix=PROFIT
 ;
 ; INNERMOST:    Function: f
 ; INNERMOST:    Region: %bb9---%bb18
@@ -62,6 +65,8 @@
 ; ALL:                { Stmt_bb4__TO__bb18[i0] -> MemRef_A[o0] : o0 <= 2199023254526 and o0 >= 0 };
 ; ALL:    }
 ;
+; PROFIT-NOT: Statements
+;
 ;    void f(int *A, int N) {
 ;      for (int i = 0; i < 1024; i++)
 ;        if (A[i])

Modified: polly/trunk/test/ScopInfo/NonAffine/non_affine_loop_condition.ll
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/ScopInfo/NonAffine/non_affine_loop_condition.ll?rev=249274&r1=249273&r2=249274&view=diff
==============================================================================
--- polly/trunk/test/ScopInfo/NonAffine/non_affine_loop_condition.ll (original)
+++ polly/trunk/test/ScopInfo/NonAffine/non_affine_loop_condition.ll Sun Oct  4 09:56:08 2015
@@ -1,8 +1,10 @@
-; RUN: opt %loadPolly -polly-scops -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops -analyze < %s | FileCheck %s
+; RUN: opt %loadPolly -polly-detect-unprofitable -polly-scops -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops -analyze < %s | FileCheck %s
+; RUN: opt %loadPolly -polly-scops -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops -analyze < %s | FileCheck %s --check-prefix=PROFIT
 
 
 ; RUN: opt %loadPolly -polly-scops -polly-detect-reductions \
 ; RUN:                -polly-allow-nonaffine-branches \
+; RUN:                -polly-detect-unprofitable \
 ; RUN:                -polly-allow-nonaffine-loops -analyze < %s \
 ; RUN:                -polly-detect-reductions=false \
 ; RUN: | FileCheck %s -check-prefix=NO-REDUCTION
@@ -35,6 +37,8 @@
 ; CHECK:                { Stmt_bb3__TO__bb10[i0] -> MemRef_A[i0] };
 ; CHECK:    }
 
+; PROFIT-NOT: Statements
+
 ; NO-REDUCTION-NOT: Reduction Type: +
 
 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"

Modified: polly/trunk/test/ScopInfo/NonAffine/non_affine_loop_used_later.ll
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/ScopInfo/NonAffine/non_affine_loop_used_later.ll?rev=249274&r1=249273&r2=249274&view=diff
==============================================================================
--- polly/trunk/test/ScopInfo/NonAffine/non_affine_loop_used_later.ll (original)
+++ polly/trunk/test/ScopInfo/NonAffine/non_affine_loop_used_later.ll Sun Oct  4 09:56:08 2015
@@ -1,4 +1,5 @@
-; RUN: opt %loadPolly -polly-scops -polly-allow-nonaffine -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops -analyze < %s | FileCheck %s
+; RUN: opt %loadPolly -polly-detect-unprofitable -polly-scops -polly-allow-nonaffine -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops -analyze < %s | FileCheck %s
+; RUN: opt %loadPolly -polly-scops -polly-allow-nonaffine -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops -analyze < %s | FileCheck %s --check-prefix=PROFIT
 ;
 ; Verify that we over approximate the read acces of A[j] in the last statement as j is
 ; computed in a non-affine loop we do not model.
@@ -59,6 +60,8 @@
 ; CHECK:                [N] -> { Stmt_bb23[i0] -> MemRef_j_0__phi[] };
 ; CHECK:    }
 ;
+; PROFIT-NOT: Statements
+;
 ;    void f(int *A, int N, int M) {
 ;      int i = 0, j = 0;
 ;      for (i = 0; i < N; i++) {




More information about the llvm-commits mailing list