[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