[polly] r267441 - Only add user assumptions on known parameters [NFC]
Johannes Doerfert via llvm-commits
llvm-commits at lists.llvm.org
Mon Apr 25 11:51:27 PDT 2016
Author: jdoerfert
Date: Mon Apr 25 13:51:27 2016
New Revision: 267441
URL: http://llvm.org/viewvc/llvm-project?rev=267441&view=rev
Log:
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.
Added:
polly/trunk/test/ScopInfo/user_provided_assumptions_2.ll
polly/trunk/test/ScopInfo/user_provided_assumptions_3.ll
Modified:
polly/trunk/lib/Analysis/ScopInfo.cpp
Modified: polly/trunk/lib/Analysis/ScopInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/Analysis/ScopInfo.cpp?rev=267441&r1=267440&r2=267441&view=diff
==============================================================================
--- polly/trunk/lib/Analysis/ScopInfo.cpp (original)
+++ polly/trunk/lib/Analysis/ScopInfo.cpp Mon Apr 25 13:51:27 2016
@@ -1877,7 +1877,15 @@ void Scop::addUserAssumptions(Assumption
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(Assumption
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));
Added: polly/trunk/test/ScopInfo/user_provided_assumptions_2.ll
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/ScopInfo/user_provided_assumptions_2.ll?rev=267441&view=auto
==============================================================================
--- polly/trunk/test/ScopInfo/user_provided_assumptions_2.ll (added)
+++ polly/trunk/test/ScopInfo/user_provided_assumptions_2.ll Mon Apr 25 13:51:27 2016
@@ -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
+
Added: polly/trunk/test/ScopInfo/user_provided_assumptions_3.ll
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/ScopInfo/user_provided_assumptions_3.ll?rev=267441&view=auto
==============================================================================
--- polly/trunk/test/ScopInfo/user_provided_assumptions_3.ll (added)
+++ polly/trunk/test/ScopInfo/user_provided_assumptions_3.ll Mon Apr 25 13:51:27 2016
@@ -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
+
More information about the llvm-commits
mailing list