[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