diff options
author | Johannes Doerfert <doerfert@cs.uni-saarland.de> | 2016-04-25 18:51:27 +0000 |
---|---|---|
committer | Johannes Doerfert <doerfert@cs.uni-saarland.de> | 2016-04-25 18:51:27 +0000 |
commit | c78ce7dc2154d559657d6799065fe60456118e80 (patch) | |
tree | 1c13a59b16656a69dfab4df466e2c14296d2038d | |
parent | 3bb28329000cd646ae24bbf44878b070c6d43bec (diff) | |
download | bcm5719-llvm-c78ce7dc2154d559657d6799065fe60456118e80.tar.gz bcm5719-llvm-c78ce7dc2154d559657d6799065fe60456118e80.zip |
Only add user assumptions on known parameters [NFC]
Before, assumptions derived from llvm.assume could reference new
parameters that were not known to the SCoP before. These were neither
beneficial to the representation nor to the user that reads the
emitted remark. Now we project them out and keep only user assumptions
on known parameters. Nevertheless, the new parameters are still part
of the SCoPs parameter space as the SCEVAffinator currently adds them
on demand.
llvm-svn: 267441
-rw-r--r-- | polly/lib/Analysis/ScopInfo.cpp | 26 | ||||
-rw-r--r-- | polly/test/ScopInfo/user_provided_assumptions_2.ll | 52 | ||||
-rw-r--r-- | polly/test/ScopInfo/user_provided_assumptions_3.ll | 54 |
3 files changed, 131 insertions, 1 deletions
diff --git a/polly/lib/Analysis/ScopInfo.cpp b/polly/lib/Analysis/ScopInfo.cpp index 6baa395f06c..18912169369 100644 --- a/polly/lib/Analysis/ScopInfo.cpp +++ b/polly/lib/Analysis/ScopInfo.cpp @@ -1877,7 +1877,15 @@ void Scop::addUserAssumptions(AssumptionCache &AC, DominatorTree &DT, continue; } - addParams(DetectedParams); + // Collect all newly introduced parameters. + ParameterSetTy NewParams; + for (auto *Param : DetectedParams) { + Param = extractConstantFactor(Param, *SE).second; + Param = getRepresentingInvariantLoadSCEV(Param); + if (Parameters.count(Param)) + continue; + NewParams.insert(Param); + } SmallVector<isl_set *, 2> ConditionSets; buildConditionSets(*Stmts.begin(), Val, nullptr, L, Context, ConditionSets); @@ -1885,6 +1893,22 @@ void Scop::addUserAssumptions(AssumptionCache &AC, DominatorTree &DT, isl_set_free(ConditionSets[1]); auto *AssumptionCtx = ConditionSets[0]; + + // Project out newly introduced parameters as they are not otherwise useful. + if (!NewParams.empty()) { + for (unsigned u = 0; u < isl_set_n_param(AssumptionCtx); u++) { + auto *Id = isl_set_get_dim_id(AssumptionCtx, isl_dim_param, u); + auto *Param = static_cast<const SCEV *>(isl_id_get_user(Id)); + isl_id_free(Id); + + if (!NewParams.count(Param)) + continue; + + AssumptionCtx = + isl_set_project_out(AssumptionCtx, isl_dim_param, u--, 1); + } + } + emitOptimizationRemarkAnalysis( F.getContext(), DEBUG_TYPE, F, CI->getDebugLoc(), "Use user assumption: " + stringFromIslObj(AssumptionCtx)); diff --git a/polly/test/ScopInfo/user_provided_assumptions_2.ll b/polly/test/ScopInfo/user_provided_assumptions_2.ll new file mode 100644 index 00000000000..f85c30e272f --- /dev/null +++ b/polly/test/ScopInfo/user_provided_assumptions_2.ll @@ -0,0 +1,52 @@ +; RUN: opt %loadPolly -pass-remarks-analysis="polly-scops" -polly-scops -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadPolly -polly-scops -analyze < %s | FileCheck %s --check-prefix=SCOP +; +; CHECK: remark: <unknown>:0:0: SCoP begins here. +; CHECK-NEXT: remark: <unknown>:0:0: Use user assumption: { : } +; CHECK-NEXT: remark: <unknown>:0:0: SCoP ends here. + +; SCOP: Context: +; SCOP-NEXT: [N, M] -> { : -2147483648 <= N <= 2147483647 and -2147483648 <= M <= 2147483647 } +; SCOP: Assumed Context: +; SCOP-NEXT: [N, M] -> { : } +; SCOP: Invalid Context: +; SCOP-NEXT: [N, M] -> { : 1 = 0 } +; +; int f(int *A, int N, int M) { +; __builtin_assume(M > 0); +; for (int i = 0; i < N; i++) +; A[i]++; +; return M; +; } +; +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" + +define i32 @f(i32* %A, i32 %N, i32 %M) { +entry: + %cmp = icmp sgt i32 %M, 0 + call void @llvm.assume(i1 %cmp) + %tmp = sext i32 %N to i64 + br label %for.cond + +for.cond: ; preds = %for.inc, %entry + %indvars.iv = phi i64 [ %indvars.iv.next, %for.inc ], [ 0, %entry ] + %cmp1 = icmp slt i64 %indvars.iv, %tmp + br i1 %cmp1, label %for.body, label %for.end + +for.body: ; preds = %for.cond + %arrayidx = getelementptr inbounds i32, i32* %A, i64 %indvars.iv + %tmp1 = load i32, i32* %arrayidx, align 4 + %inc = add nsw i32 %tmp1, 1 + store i32 %inc, i32* %arrayidx, align 4 + br label %for.inc + +for.inc: ; preds = %for.body + %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 + br label %for.cond + +for.end: ; preds = %for.cond + ret i32 %M +} + +declare void @llvm.assume(i1) #1 + diff --git a/polly/test/ScopInfo/user_provided_assumptions_3.ll b/polly/test/ScopInfo/user_provided_assumptions_3.ll new file mode 100644 index 00000000000..f16df219218 --- /dev/null +++ b/polly/test/ScopInfo/user_provided_assumptions_3.ll @@ -0,0 +1,54 @@ +; RUN: opt %loadPolly -pass-remarks-analysis="polly-scops" -polly-scops -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadPolly -polly-scops -analyze < %s | FileCheck %s --check-prefix=SCOP +; +; CHECK: remark: <unknown>:0:0: SCoP begins here. +; CHECK-NEXT: remark: <unknown>:0:0: Use user assumption: [N] -> { : N >= 2 } +; CHECK-NEXT: remark: <unknown>:0:0: SCoP ends here. + +; SCOP: Context: +; SCOP-NEXT: [N, M] -> { : 2 <= N <= 2147483647 and -2147483648 <= M <= 2147483647 } +; SCOP: Assumed Context: +; SCOP-NEXT: [N, M] -> { : } +; SCOP: Invalid Context: +; SCOP-NEXT: [N, M] -> { : 1 = 0 } +; +; int f(int *A, int N, int M) { +; __builtin_assume(M > 0 && N > M); +; for (int i = 0; i < N; i++) +; A[i]++; +; return M; +; } +; +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" + +define i32 @f(i32* %A, i32 %N, i32 %M) { +entry: + %cmp = icmp sgt i32 %M, 0 + %cmp1 = icmp sgt i32 %N, %M + %and = and i1 %cmp, %cmp1 + call void @llvm.assume(i1 %and) + %tmp1 = sext i32 %N to i64 + br label %for.cond + +for.cond: ; preds = %for.inc, %land.end + %indvars.iv = phi i64 [ %indvars.iv.next, %for.inc ], [ 0, %entry ] + %cmp2 = icmp slt i64 %indvars.iv, %tmp1 + br i1 %cmp2, label %for.body, label %for.end + +for.body: ; preds = %for.cond + %arrayidx = getelementptr inbounds i32, i32* %A, i64 %indvars.iv + %tmp2 = load i32, i32* %arrayidx, align 4 + %inc = add nsw i32 %tmp2, 1 + store i32 %inc, i32* %arrayidx, align 4 + br label %for.inc + +for.inc: ; preds = %for.body + %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 + br label %for.cond + +for.end: ; preds = %for.cond + ret i32 %M +} + +declare void @llvm.assume(i1) #1 + |