From f4fa9879fbe056b48b2553cb6b6235e849c12c7b Mon Sep 17 00:00:00 2001 From: Johannes Doerfert Date: Thu, 10 Sep 2015 15:53:59 +0000 Subject: [PATCH] [FIX] Do not assume only one loop can be left at a time llvm-svn: 247291 --- polly/lib/Analysis/ScopInfo.cpp | 22 ++++-- .../multiple_exiting_blocks_two_loop.ll | 78 +++++++++++++++++++ 2 files changed, 93 insertions(+), 7 deletions(-) create mode 100644 polly/test/ScopInfo/multiple_exiting_blocks_two_loop.ll diff --git a/polly/lib/Analysis/ScopInfo.cpp b/polly/lib/Analysis/ScopInfo.cpp index 04cd6e9e3419..0fcde7d308e3 100644 --- a/polly/lib/Analysis/ScopInfo.cpp +++ b/polly/lib/Analysis/ScopInfo.cpp @@ -1601,13 +1601,17 @@ void Scop::buildDomainsWithBranchConstraints(Region *R, LoopInfo &LI, // adjust the dimensionality accordingly. Lastly, if we leave a loop // and enter a new one we need to drop the old constraints. int SuccBBLoopDepth = getRelativeLoopDepth(SuccBBLoop); - assert(std::abs(BBLoopDepth - SuccBBLoopDepth) <= 1); + unsigned LoopDepthDiff = std::abs(BBLoopDepth - SuccBBLoopDepth); if (BBLoopDepth > SuccBBLoopDepth) { - CondSet = isl_set_project_out(CondSet, isl_dim_set, BBLoopDepth, 1); + CondSet = isl_set_project_out(CondSet, isl_dim_set, + isl_set_n_dim(CondSet) - LoopDepthDiff, + LoopDepthDiff); } else if (SuccBBLoopDepth > BBLoopDepth) { + assert(LoopDepthDiff == 1); CondSet = isl_set_add_dims(CondSet, isl_dim_set, 1); CondSet = addDomainDimId(CondSet, SuccBBLoopDepth, SuccBBLoop); } else if (BBLoopDepth >= 0) { + assert(LoopDepthDiff <= 1); CondSet = isl_set_project_out(CondSet, isl_dim_set, BBLoopDepth, 1); CondSet = isl_set_add_dims(CondSet, isl_dim_set, 1); CondSet = addDomainDimId(CondSet, SuccBBLoopDepth, SuccBBLoop); @@ -1714,15 +1718,19 @@ void Scop::propagateDomainConstraints(Region *R, LoopInfo &LI, PredBBLoop = PredBBLoop->getParentLoop(); int PredBBLoopDepth = getRelativeLoopDepth(PredBBLoop); - assert(std::abs(BBLoopDepth - PredBBLoopDepth) <= 1); + unsigned LoopDepthDiff = std::abs(BBLoopDepth - PredBBLoopDepth); if (BBLoopDepth < PredBBLoopDepth) - PredBBDom = - isl_set_project_out(PredBBDom, isl_dim_set, PredBBLoopDepth, 1); - else if (PredBBLoopDepth < BBLoopDepth) + PredBBDom = isl_set_project_out( + PredBBDom, isl_dim_set, isl_set_n_dim(PredBBDom) - LoopDepthDiff, + LoopDepthDiff); + else if (PredBBLoopDepth < BBLoopDepth) { + assert(LoopDepthDiff == 1); PredBBDom = isl_set_add_dims(PredBBDom, isl_dim_set, 1); - else if (BBLoop != PredBBLoop && BBLoopDepth >= 0) + } else if (BBLoop != PredBBLoop && BBLoopDepth >= 0) { + assert(LoopDepthDiff <= 1); PredBBDom = isl_set_drop_constraints_involving_dims( PredBBDom, isl_dim_set, BBLoopDepth, 1); + } } PredDom = isl_set_union(PredDom, PredBBDom); diff --git a/polly/test/ScopInfo/multiple_exiting_blocks_two_loop.ll b/polly/test/ScopInfo/multiple_exiting_blocks_two_loop.ll new file mode 100644 index 000000000000..6a72739363f1 --- /dev/null +++ b/polly/test/ScopInfo/multiple_exiting_blocks_two_loop.ll @@ -0,0 +1,78 @@ +; RUN: opt %loadPolly -polly-scops -polly-detect-unprofitable -analyze < %s | FileCheck %s +; +; void foo(long n, float A[100]) { +; for (long j = 0; j < n; j++) { +; for (long i = j; i < n; i++) { +; if (i < 0) +; goto end; +; +; if (i >= 100) +; goto end; +; +; A[i] += i; +; } +; } +; end: +; return; +; } +; +; CHECK: Domain := +; CHECK: [n] -> { Stmt_if_end_7[i0, i1] : i0 >= 0 and i1 <= 99 - i0 and i1 >= 0 and i1 <= -1 + n - i0 }; +; +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" + +define void @foo(i64 %n, float* %A) { +entry: + br label %for.cond + +for.cond: ; preds = %for.inc.8, %entry + %j.0 = phi i64 [ 0, %entry ], [ %inc9, %for.inc.8 ] + %cmp = icmp slt i64 %j.0, %n + br i1 %cmp, label %for.body, label %for.end.10 + +for.body: ; preds = %for.cond + br label %for.cond.1 + +for.cond.1: ; preds = %for.inc, %for.body + %i.0 = phi i64 [ %j.0, %for.body ], [ %inc, %for.inc ] + %cmp2 = icmp slt i64 %i.0, %n + br i1 %cmp2, label %for.body.3, label %for.end + +for.body.3: ; preds = %for.cond.1 + br i1 false, label %if.then, label %if.end + +if.then: ; preds = %for.body.3 + br label %end + +if.end: ; preds = %for.body.3 + %cmp5 = icmp sgt i64 %i.0, 99 + br i1 %cmp5, label %if.then.6, label %if.end.7 + +if.then.6: ; preds = %if.end + br label %end + +if.end.7: ; preds = %if.end + %conv = sitofp i64 %i.0 to float + %arrayidx = getelementptr inbounds float, float* %A, i64 %i.0 + %tmp = load float, float* %arrayidx, align 4 + %add = fadd float %tmp, %conv + store float %add, float* %arrayidx, align 4 + br label %for.inc + +for.inc: ; preds = %if.end.7 + %inc = add nuw nsw i64 %i.0, 1 + br label %for.cond.1 + +for.end: ; preds = %for.cond.1 + br label %for.inc.8 + +for.inc.8: ; preds = %for.end + %inc9 = add nuw nsw i64 %j.0, 1 + br label %for.cond + +for.end.10: ; preds = %for.cond + br label %end + +end: ; preds = %for.end.10, %if.then.6, %if.then + ret void +} -- GitLab