[polly] r303762 - [DeLICM] Partial writes for PHIs.
Michael Kruse via llvm-commits
llvm-commits at lists.llvm.org
Wed May 24 08:23:06 PDT 2017
Author: meinersbur
Date: Wed May 24 10:23:06 2017
New Revision: 303762
URL: http://llvm.org/viewvc/llvm-project?rev=303762&view=rev
Log:
[DeLICM] Partial writes for PHIs.
Enable the use for partial writes for PHI write accesses with a switch.
This simply skips the test for whether a PHI write would be partial.
The analog test for partial value writes also protects for partial reads
which we do not support (yet). It is possible to test for partial reads
separately such that we could skip the partial write check as well. In
case this shows up to be useful, I can implement it as well.
Differential Revision: https://reviews.llvm.org/D33487
Added:
polly/trunk/test/DeLICM/reduction.ll
- copied, changed from r303759, polly/trunk/test/DeLICM/reduction_looprotate_gvnpre.ll
Modified:
polly/trunk/lib/Transform/DeLICM.cpp
polly/trunk/test/DeLICM/reduction_looprotate_gvnpre.ll
polly/trunk/test/DeLICM/reduction_overapproximate.ll
Modified: polly/trunk/lib/Transform/DeLICM.cpp
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/Transform/DeLICM.cpp?rev=303762&r1=303761&r2=303762&view=diff
==============================================================================
--- polly/trunk/lib/Transform/DeLICM.cpp (original)
+++ polly/trunk/lib/Transform/DeLICM.cpp Wed May 24 10:23:06 2017
@@ -180,6 +180,11 @@ cl::opt<bool> DelicmOverapproximateWrite
"Do more PHI writes than necessary in order to avoid partial accesses"),
cl::init(false), cl::Hidden, cl::cat(PollyCategory));
+cl::opt<bool> DelicmPartialWrites("polly-delicm-partial-writes",
+ cl::desc("Allow partial writes"),
+ cl::init(false), cl::Hidden,
+ cl::cat(PollyCategory));
+
cl::opt<bool>
DelicmComputeKnown("polly-delicm-compute-known",
cl::desc("Compute known content of array elements"),
@@ -1793,7 +1798,8 @@ private:
WritesTarget = expandMapping(WritesTarget, UniverseWritesDom);
auto ExpandedWritesDom = give(isl_union_map_domain(WritesTarget.copy()));
- if (!isl_union_set_is_subset(UniverseWritesDom.keep(),
+ if (!DelicmPartialWrites &&
+ !isl_union_set_is_subset(UniverseWritesDom.keep(),
ExpandedWritesDom.keep())) {
DEBUG(dbgs() << " Reject because did not find PHI write mapping for "
"all instances\n");
Copied: polly/trunk/test/DeLICM/reduction.ll (from r303759, polly/trunk/test/DeLICM/reduction_looprotate_gvnpre.ll)
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/DeLICM/reduction.ll?p2=polly/trunk/test/DeLICM/reduction.ll&p1=polly/trunk/test/DeLICM/reduction_looprotate_gvnpre.ll&r1=303759&r2=303762&rev=303762&view=diff
==============================================================================
--- polly/trunk/test/DeLICM/reduction_looprotate_gvnpre.ll (original)
+++ polly/trunk/test/DeLICM/reduction.ll Wed May 24 10:23:06 2017
@@ -1,52 +1,45 @@
-; RUN: opt %loadPolly -polly-flatten-schedule -polly-delicm-overapproximate-writes=true -polly-delicm-compute-known=true -polly-delicm -analyze < %s | FileCheck %s
+; RUN: opt %loadPolly -polly-delicm-partial-writes=true -polly-delicm -analyze < %s | FileCheck -match-full-lines %s
;
; void func(double *A) {
; for (int j = 0; j < 2; j += 1) { /* outer */
; double phi = 0.0;
-; for (int i = 0; i < 4; i += 1) { /* reduction */
+; for (int i = 0; i < 4; i += 1) /* reduction */
; phi += 4.2;
-; A[j] = phi;
-; }
+; A[j] = phi;
; }
; }
;
define void @func(double* noalias nonnull %A) {
entry:
- br label %outer.preheader
-
-outer.preheader:
br label %outer.for
outer.for:
- %j = phi i32 [0, %outer.preheader], [%j.inc, %outer.inc]
+ %j = phi i32 [0, %entry], [%j.inc, %outer.inc]
%j.cmp = icmp slt i32 %j, 2
- br i1 %j.cmp, label %reduction.preheader, label %outer.exit
-
+ br i1 %j.cmp, label %reduction.for, label %outer.exit
- reduction.preheader:
- br label %reduction.for
reduction.for:
- %i = phi i32 [0, %reduction.preheader], [%i.inc, %reduction.inc]
- %phi = phi double [0.0, %reduction.preheader], [%add, %reduction.inc]
- br label %body
+ %i = phi i32 [0, %outer.for], [%i.inc, %reduction.inc]
+ %phi = phi double [0.0, %outer.for], [%add, %reduction.inc]
+ %i.cmp = icmp slt i32 %i, 4
+ br i1 %i.cmp, label %body, label %reduction.exit
body:
%add = fadd double %phi, 4.2
- %A_idx = getelementptr inbounds double, double* %A, i32 %j
- store double %add, double* %A_idx
br label %reduction.inc
reduction.inc:
%i.inc = add nuw nsw i32 %i, 1
- %i.cmp = icmp slt i32 %i.inc, 4
- br i1 %i.cmp, label %reduction.for, label %reduction.exit
+ br label %reduction.for
reduction.exit:
+ %A_idx = getelementptr inbounds double, double* %A, i32 %j
+ store double %phi, double* %A_idx
br label %outer.inc
@@ -64,31 +57,35 @@ return:
; CHECK: After accesses {
-; CHECK-NEXT: Stmt_reduction_preheader
-; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 1]
-; CHECK-NEXT: { Stmt_reduction_preheader[i0] -> MemRef_phi__phi[] };
-; CHECK-NEXT: new: { Stmt_reduction_preheader[i0] -> MemRef_A[i0] : 0 <= i0 <= 1 };
+; CHECK-NEXT: Stmt_outer_for
+; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 1]
+; CHECK-NEXT: { Stmt_outer_for[i0] -> MemRef_phi__phi[] };
+; CHECK-NEXT: new: { Stmt_outer_for[i0] -> MemRef_A[i0] : 0 <= i0 <= 1 };
; CHECK-NEXT: Stmt_reduction_for
; CHECK-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 1]
; CHECK-NEXT: { Stmt_reduction_for[i0, i1] -> MemRef_phi__phi[] };
-; CHECK-NEXT: new: { Stmt_reduction_for[i0, i1] -> MemRef_A[i0] : 0 <= i0 <= 1 and 0 <= i1 <= 3 };
+; CHECK-NEXT: new: { Stmt_reduction_for[i0, i1] -> MemRef_A[i0] : 0 <= i0 <= 1 and 0 <= i1 <= 4 };
; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 1]
; CHECK-NEXT: { Stmt_reduction_for[i0, i1] -> MemRef_phi[] };
-; CHECK-NEXT: new: { Stmt_reduction_for[i0, i1] -> MemRef_A[i0] : 0 <= i0 <= 1 and 0 <= i1 <= 3 };
+; CHECK-NEXT: new: { Stmt_reduction_for[i0, i1] -> MemRef_A[i0] : 0 <= i0 <= 1 and 0 <= i1 <= 4 };
; CHECK-NEXT: Stmt_body
; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 1]
; CHECK-NEXT: { Stmt_body[i0, i1] -> MemRef_add[] };
-; CHECK-NEXT: new: { Stmt_body[i0, i1] -> MemRef_A[i0] : 0 <= i0 <= 1 and 0 <= i1 <= 3 and 3i1 <= 22 - 13i0 };
+; CHECK-NEXT: new: { Stmt_body[i0, i1] -> MemRef_A[i0] : 0 <= i0 <= 1 and 0 <= i1 <= 3 };
; CHECK-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 1]
; CHECK-NEXT: { Stmt_body[i0, i1] -> MemRef_phi[] };
-; CHECK-NEXT: new: { Stmt_body[i0, i1] -> MemRef_A[i0] : i0 >= 0 and 0 <= i1 <= 3 and 3i1 <= 21 - 13i0; Stmt_body[1, 3] -> MemRef_A[1] };
-; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 0]
-; CHECK-NEXT: { Stmt_body[i0, i1] -> MemRef_A[i0] };
+; CHECK-NEXT: new: { Stmt_body[i0, i1] -> MemRef_A[i0] : 0 <= i0 <= 1 and 0 <= i1 <= 3 };
; CHECK-NEXT: Stmt_reduction_inc
; CHECK-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 1]
; CHECK-NEXT: { Stmt_reduction_inc[i0, i1] -> MemRef_add[] };
-; CHECK-NEXT: new: { Stmt_reduction_inc[i0, i1] -> MemRef_A[i0] : i0 >= 0 and 0 <= i1 <= 3 and 3i1 <= 21 - 13i0; Stmt_reduction_inc[1, 3] -> MemRef_A[1] };
+; CHECK-NEXT: new: { Stmt_reduction_inc[i0, i1] -> MemRef_A[i0] : 0 <= i0 <= 1 and 0 <= i1 <= 3 };
; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 1]
; CHECK-NEXT: { Stmt_reduction_inc[i0, i1] -> MemRef_phi__phi[] };
; CHECK-NEXT: new: { Stmt_reduction_inc[i0, i1] -> MemRef_A[i0] : 0 <= i0 <= 1 and 0 <= i1 <= 3 };
+; CHECK-NEXT: Stmt_reduction_exit
+; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 0]
+; CHECK-NEXT: { Stmt_reduction_exit[i0] -> MemRef_A[i0] };
+; CHECK-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 1]
+; CHECK-NEXT: { Stmt_reduction_exit[i0] -> MemRef_phi[] };
+; CHECK-NEXT: new: { Stmt_reduction_exit[i0] -> MemRef_A[i0] : 0 <= i0 <= 1 };
; CHECK-NEXT: }
Modified: polly/trunk/test/DeLICM/reduction_looprotate_gvnpre.ll
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/DeLICM/reduction_looprotate_gvnpre.ll?rev=303762&r1=303761&r2=303762&view=diff
==============================================================================
--- polly/trunk/test/DeLICM/reduction_looprotate_gvnpre.ll (original)
+++ polly/trunk/test/DeLICM/reduction_looprotate_gvnpre.ll Wed May 24 10:23:06 2017
@@ -1,4 +1,5 @@
; RUN: opt %loadPolly -polly-flatten-schedule -polly-delicm-overapproximate-writes=true -polly-delicm-compute-known=true -polly-delicm -analyze < %s | FileCheck %s
+; RUN: opt %loadPolly -polly-flatten-schedule -polly-delicm-partial-writes=true -polly-delicm-compute-known=true -polly-delicm -analyze < %s | FileCheck -check-prefix=PARTIAL %s
;
; void func(double *A) {
; for (int j = 0; j < 2; j += 1) { /* outer */
@@ -92,3 +93,34 @@ return:
; CHECK-NEXT: { Stmt_reduction_inc[i0, i1] -> MemRef_phi__phi[] };
; CHECK-NEXT: new: { Stmt_reduction_inc[i0, i1] -> MemRef_A[i0] : 0 <= i0 <= 1 and 0 <= i1 <= 3 };
; CHECK-NEXT: }
+
+
+; PARTIAL: After accesses {
+; PARTIAL-NEXT: Stmt_reduction_preheader
+; PARTIAL-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 1]
+; PARTIAL-NEXT: { Stmt_reduction_preheader[i0] -> MemRef_phi__phi[] };
+; PARTIAL-NEXT: new: { Stmt_reduction_preheader[i0] -> MemRef_A[i0] : 0 <= i0 <= 1 };
+; PARTIAL-NEXT: Stmt_reduction_for
+; PARTIAL-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 1]
+; PARTIAL-NEXT: { Stmt_reduction_for[i0, i1] -> MemRef_phi__phi[] };
+; PARTIAL-NEXT: new: { Stmt_reduction_for[i0, i1] -> MemRef_A[i0] : 0 <= i0 <= 1 and 0 <= i1 <= 3 };
+; PARTIAL-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 1]
+; PARTIAL-NEXT: { Stmt_reduction_for[i0, i1] -> MemRef_phi[] };
+; PARTIAL-NEXT: new: { Stmt_reduction_for[i0, i1] -> MemRef_A[i0] : 0 <= i0 <= 1 and 0 <= i1 <= 3 };
+; PARTIAL-NEXT: Stmt_body
+; PARTIAL-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 1]
+; PARTIAL-NEXT: { Stmt_body[i0, i1] -> MemRef_add[] };
+; PARTIAL-NEXT: new: { Stmt_body[i0, i1] -> MemRef_A[i0] : 0 <= i0 <= 1 and 0 <= i1 <= 3 and 3i1 <= 22 - 13i0 };
+; PARTIAL-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 1]
+; PARTIAL-NEXT: { Stmt_body[i0, i1] -> MemRef_phi[] };
+; PARTIAL-NEXT: new: { Stmt_body[i0, i1] -> MemRef_A[i0] : i0 >= 0 and 0 <= i1 <= 3 and 3i1 <= 21 - 13i0; Stmt_body[1, 3] -> MemRef_A[1] };
+; PARTIAL-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 0]
+; PARTIAL-NEXT: { Stmt_body[i0, i1] -> MemRef_A[i0] };
+; PARTIAL-NEXT: Stmt_reduction_inc
+; PARTIAL-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 1]
+; PARTIAL-NEXT: { Stmt_reduction_inc[i0, i1] -> MemRef_add[] };
+; PARTIAL-NEXT: new: { Stmt_reduction_inc[i0, i1] -> MemRef_A[i0] : i0 >= 0 and 0 <= i1 <= 3 and 3i1 <= 21 - 13i0; Stmt_reduction_inc[1, 3] -> MemRef_A[1] };
+; PARTIAL-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 1]
+; PARTIAL-NEXT: { Stmt_reduction_inc[i0, i1] -> MemRef_phi__phi[] };
+; PARTIAL-NEXT: new: { Stmt_reduction_inc[i0, i1] -> MemRef_A[i0] : 0 <= i0 <= 1 and 0 <= i1 <= 2 and 3i1 >= -13i0 };
+; PARTIAL-NEXT: }
Modified: polly/trunk/test/DeLICM/reduction_overapproximate.ll
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/DeLICM/reduction_overapproximate.ll?rev=303762&r1=303761&r2=303762&view=diff
==============================================================================
--- polly/trunk/test/DeLICM/reduction_overapproximate.ll (original)
+++ polly/trunk/test/DeLICM/reduction_overapproximate.ll Wed May 24 10:23:06 2017
@@ -1,5 +1,6 @@
; RUN: opt %loadPolly -polly-flatten-schedule -polly-delicm-compute-known=true -polly-delicm-overapproximate-writes=true -polly-delicm -analyze < %s | FileCheck %s --check-prefix=APPROX
; RUN: opt %loadPolly -polly-flatten-schedule -polly-delicm-compute-known=true -polly-delicm-overapproximate-writes=false -polly-delicm -analyze < %s | FileCheck %s --check-prefix=EXACT
+; RUN: opt %loadPolly -polly-flatten-schedule -polly-delicm-compute-known=true -polly-delicm-partial-writes=true -polly-delicm -analyze < %s | FileCheck %s --check-prefix=PARTIAL
;
; void func(double *A {
; for (int j = -1; j < 3; j += 1) { /* outer */
@@ -113,3 +114,45 @@ return:
; EXACT: No modification has been made
+
+
+; PARTIAL: After accesses {
+; PARTIAL-NEXT: Stmt_reduction_checkloop
+; PARTIAL-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 1]
+; PARTIAL-NEXT: { Stmt_reduction_checkloop[i0] -> MemRef_val__phi[] };
+; PARTIAL-NEXT: new: { Stmt_reduction_checkloop[i0] -> MemRef_A[-1 + i0] : 0 <= i0 <= 1 };
+; PARTIAL-NEXT: Stmt_reduction_preheader
+; PARTIAL-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 1]
+; PARTIAL-NEXT: { Stmt_reduction_preheader[i0] -> MemRef_phi__phi[] };
+; PARTIAL-NEXT: new: { Stmt_reduction_preheader[i0] -> MemRef_A[-1 + i0] : 2 <= i0 <= 3 };
+; PARTIAL-NEXT: Stmt_reduction_for
+; PARTIAL-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 1]
+; PARTIAL-NEXT: { Stmt_reduction_for[i0, i1] -> MemRef_phi__phi[] };
+; PARTIAL-NEXT: new: { Stmt_reduction_for[i0, i1] -> MemRef_A[-1 + i0] : i0 <= 3 and i1 >= 0 and 2 - 3i0 <= i1 <= 11 - 3i0 and i1 <= 2 and i1 <= -2 + i0 };
+; PARTIAL-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 1]
+; PARTIAL-NEXT: { Stmt_reduction_for[i0, i1] -> MemRef_phi[] };
+; PARTIAL-NEXT: new: { Stmt_reduction_for[i0, i1] -> MemRef_A[-1 + i0] : i0 <= 3 and i1 >= 0 and 2 - 3i0 <= i1 <= 11 - 3i0 and i1 <= 2 and i1 <= -2 + i0 };
+; PARTIAL-NEXT: Stmt_body
+; PARTIAL-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 1]
+; PARTIAL-NEXT: { Stmt_body[i0, i1] -> MemRef_add[] };
+; PARTIAL-NEXT: new: { Stmt_body[i0, i1] -> MemRef_A[-1 + i0] : i0 <= 3 and i1 >= 0 and 2 - 3i0 <= i1 <= 10 - 3i0 and i1 <= 1 and i1 <= -2 + i0 };
+; PARTIAL-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 1]
+; PARTIAL-NEXT: { Stmt_body[i0, i1] -> MemRef_phi[] };
+; PARTIAL-NEXT: new: { Stmt_body[i0, i1] -> MemRef_A[-1 + i0] : i0 <= 3 and 0 <= i1 <= -2 + i0 };
+; PARTIAL-NEXT: Stmt_reduction_inc
+; PARTIAL-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 1]
+; PARTIAL-NEXT: { Stmt_reduction_inc[i0, i1] -> MemRef_add[] };
+; PARTIAL-NEXT: new: { Stmt_reduction_inc[i0, i1] -> MemRef_A[-1 + i0] : i0 <= 3 and 0 <= i1 <= -2 + i0 };
+; PARTIAL-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 1]
+; PARTIAL-NEXT: { Stmt_reduction_inc[i0, i1] -> MemRef_phi__phi[] };
+; PARTIAL-NEXT: new: { Stmt_reduction_inc[3, 0] -> MemRef_A[2] };
+; PARTIAL-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 1]
+; PARTIAL-NEXT: { Stmt_reduction_inc[i0, i1] -> MemRef_val__phi[] };
+; PARTIAL-NEXT: new: { Stmt_reduction_inc[i0, -2 + i0] -> MemRef_A[-1 + i0] : 2 <= i0 <= 3 };
+; PARTIAL-NEXT: Stmt_reduction_exit
+; PARTIAL-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 1]
+; PARTIAL-NEXT: { Stmt_reduction_exit[i0] -> MemRef_val__phi[] };
+; PARTIAL-NEXT: new: { Stmt_reduction_exit[i0] -> MemRef_A[-1 + i0] : 0 <= i0 <= 3 };
+; PARTIAL-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 0]
+; PARTIAL-NEXT: { Stmt_reduction_exit[i0] -> MemRef_A[-1 + i0] };
+; PARTIAL-NEXT: }
More information about the llvm-commits
mailing list