[polly] r296348 - [DeLICM] Add nomap regressions tests. NFC.
Tobias Grosser via llvm-commits
llvm-commits at lists.llvm.org
Mon Feb 27 22:58:35 PST 2017
On Mon, Feb 27, 2017, at 04:53 PM, Michael Kruse via llvm-commits wrote:
> Author: meinersbur
> Date: Mon Feb 27 09:53:18 2017
> New Revision: 296348
>
> URL: http://llvm.org/viewvc/llvm-project?rev=296348&view=rev
> Log:
> [DeLICM] Add nomap regressions tests. NFC.
>
> These verify that some scalars are not mapped because it would be
> incorrect to do so.
>
> For these check we verify that no transformation has been executed from
> output of the pass's '-analyze'. Adding optimization remarks is not
> useful
> as it would result in too many messages, even repeated ones. I avoided
> checking the '-debug-only=polly-delicm' output which is an antipattern.
Very cool. This very nicely documents the situations in which delicm is
incorrect! Thank you!
Best,
Tobias
>
> Added:
> polly/trunk/test/DeLICM/nomap_alreadymapped.ll
> polly/trunk/test/DeLICM/nomap_escaping.ll
> polly/trunk/test/DeLICM/nomap_occupied.ll
> polly/trunk/test/DeLICM/nomap_readonly.ll
> polly/trunk/test/DeLICM/nomap_spuriouswrite.ll
> polly/trunk/test/DeLICM/nomap_storagesize.ll
> polly/trunk/test/DeLICM/nomap_writewrite.ll
>
> Added: polly/trunk/test/DeLICM/nomap_alreadymapped.ll
> URL:
> http://llvm.org/viewvc/llvm-project/polly/trunk/test/DeLICM/nomap_alreadymapped.ll?rev=296348&view=auto
> ==============================================================================
> --- polly/trunk/test/DeLICM/nomap_alreadymapped.ll (added)
> +++ polly/trunk/test/DeLICM/nomap_alreadymapped.ll Mon Feb 27 09:53:18
> 2017
> @@ -0,0 +1,79 @@
> +; RUN: opt %loadPolly -polly-delicm -analyze < %s | FileCheck %s
> +;
> +; void func(double *A) {
> +; for (int j = 0; j < 2; j += 1) { /* outer */
> +; double phi1 = 0.0, phi2 = 0.0;
> +; for (int i = 0; i < 4; i += 1) { /* reduction */
> +; phi1 += 4.2;
> +; phi2 += 29.0;
> +; }
> +; A[j] = phi1 + phi2;
> +; }
> +; }
> +;
> +; Check that we cannot map both, %phi1 and %phi2 to A[j] (conflict).
> +; Note that it is undefined which one will be mapped. We keep the test
> +; symmetric so it passes if either one is mapped.
> +;
> +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.cmp = icmp slt i32 %j, 2
> + br i1 %j.cmp, label %reduction.preheader, label %outer.exit
> +
> +
> + reduction.preheader:
> + br label %reduction.for
> +
> + reduction.for:
> + %i = phi i32 [0, %reduction.preheader], [%i.inc, %reduction.inc]
> + %phi1 = phi double [0.0, %reduction.preheader], [%add1,
> %reduction.inc]
> + %phi2 = phi double [0.0, %reduction.preheader], [%add2,
> %reduction.inc]
> + %i.cmp = icmp slt i32 %i, 4
> + br i1 %i.cmp, label %body, label %reduction.exit
> +
> +
> +
> + body:
> + %add1 = fadd double %phi1, 4.2
> + %add2 = fadd double %phi2, 29.0
> + br label %reduction.inc
> +
> +
> +
> + reduction.inc:
> + %i.inc = add nuw nsw i32 %i, 1
> + br label %reduction.for
> +
> + reduction.exit:
> + %A_idx = getelementptr inbounds double, double* %A, i32 %j
> + %sum = fadd double %phi1, %phi2
> + store double %sum, double* %A_idx
> + br label %outer.inc
> +
> +
> +
> +outer.inc:
> + %j.inc = add nuw nsw i32 %j, 1
> + br label %outer.for
> +
> +outer.exit:
> + br label %return
> +
> +return:
> + ret void
> +}
> +
> +
> +; CHECK: Statistics {
> +; CHECK: Compatible overwrites: 1
> +; CHECK: Overwrites mapped to: 1
> +; CHECK: Value scalars mapped: 2
> +; CHECK: PHI scalars mapped: 1
> +; CHECK: }
>
> Added: polly/trunk/test/DeLICM/nomap_escaping.ll
> URL:
> http://llvm.org/viewvc/llvm-project/polly/trunk/test/DeLICM/nomap_escaping.ll?rev=296348&view=auto
> ==============================================================================
> --- polly/trunk/test/DeLICM/nomap_escaping.ll (added)
> +++ polly/trunk/test/DeLICM/nomap_escaping.ll Mon Feb 27 09:53:18 2017
> @@ -0,0 +1,78 @@
> +; RUN: opt %loadPolly -polly-delicm -analyze < %s | FileCheck %s
> +;
> +; void func(double *A) {
> +; for (int j = 0; j < 2; j += 1) { /* outer */
> +; fsomeval = 21.0 + 21.0;
> +; double phi = 0.0;
> +; for (int i = 0; i < 4; i += 1) /* reduction */
> +; phi += 4.2;
> +; A[j] = fsomeval;
> +; }
> +; g(fsomeval);
> +; }
> +;
> +; Check that fsomeval is not mapped to A[j] because it is escaping the
> SCoP.
> +; Supporting this would require reloading the scalar from A[j], and/or
> +; identifying the last instance of fsomeval that escapes.
> +;
> +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.cmp = icmp slt i32 %j, 2
> + %fsomeval = fadd double 21.0, 21.0
> + br i1 %j.cmp, label %reduction.preheader, 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]
> + %i.cmp = icmp slt i32 %i, 4
> + br i1 %i.cmp, label %body, label %reduction.exit
> +
> +
> +
> + body:
> + %add = fadd double %phi, 4.2
> + br label %reduction.inc
> +
> +
> +
> + reduction.inc:
> + %i.inc = add nuw nsw i32 %i, 1
> + br label %reduction.for
> +
> + reduction.exit:
> + %A_idx = getelementptr inbounds double, double* %A, i32 %j
> + store double %fsomeval, double* %A_idx
> + br label %outer.inc
> +
> +
> +
> +outer.inc:
> + %j.inc = add nuw nsw i32 %j, 1
> + br label %outer.for
> +
> +outer.exit:
> + br label %return
> +
> +return:
> + call void @g(double %fsomeval)
> + ret void
> +}
> +
> +declare void @g(double)
> +
> +
> +; CHECK: Statistics {
> +; CHECK: Compatible overwrites: 1
> +; CHECK: }
> +; CHECK: No modification has been made
>
> Added: polly/trunk/test/DeLICM/nomap_occupied.ll
> URL:
> http://llvm.org/viewvc/llvm-project/polly/trunk/test/DeLICM/nomap_occupied.ll?rev=296348&view=auto
> ==============================================================================
> --- polly/trunk/test/DeLICM/nomap_occupied.ll (added)
> +++ polly/trunk/test/DeLICM/nomap_occupied.ll Mon Feb 27 09:53:18 2017
> @@ -0,0 +1,73 @@
> +; RUN: opt %loadPolly -polly-delicm -analyze < %s | FileCheck %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 */
> +; phi += 4.2;
> +; dummy = A[j];
> +; A[j] = phi;
> +; }
> +; }
> +;
> +; Check that A[j] is not used for mapping as it is still in use.
> +;
> +define void @func(double* noalias nonnull %A) {
> +entry:
> + %fsomeval = fadd double 21.0, 21.0
> + br label %outer.preheader
> +
> +outer.preheader:
> + br label %outer.for
> +
> +outer.for:
> + %j = phi i32 [0, %outer.preheader], [%j.inc, %outer.inc]
> + %j.cmp = icmp slt i32 %j, 2
> + br i1 %j.cmp, label %reduction.preheader, 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]
> + %i.cmp = icmp slt i32 %i, 4
> + br i1 %i.cmp, label %body, label %reduction.exit
> +
> +
> +
> + body:
> + %add = fadd double %phi, 4.2
> + br label %reduction.inc
> +
> +
> +
> + reduction.inc:
> + %i.inc = add nuw nsw i32 %i, 1
> + br label %reduction.for
> +
> + reduction.exit:
> + %A_idx = getelementptr inbounds double, double* %A, i32 %j
> + %dummy = load double, double* %A_idx
> + store double %phi, double* %A_idx
> + br label %outer.inc
> +
> +
> +
> +outer.inc:
> + %j.inc = add nuw nsw i32 %j, 1
> + br label %outer.for
> +
> +outer.exit:
> + br label %return
> +
> +return:
> + ret void
> +}
> +
> +
> +; CHECK: Statistics {
> +; CHECK: Compatible overwrites: 1
> +; CHECK: }
> +; CHECK: No modification has been made
>
> Added: polly/trunk/test/DeLICM/nomap_readonly.ll
> URL:
> http://llvm.org/viewvc/llvm-project/polly/trunk/test/DeLICM/nomap_readonly.ll?rev=296348&view=auto
> ==============================================================================
> --- polly/trunk/test/DeLICM/nomap_readonly.ll (added)
> +++ polly/trunk/test/DeLICM/nomap_readonly.ll Mon Feb 27 09:53:18 2017
> @@ -0,0 +1,73 @@
> +; RUN: opt %loadPolly -polly-delicm -analyze < %s | FileCheck %s
> +;
> +; void func(double *A) {
> +; fsomeval = 21.0 + 21.0;
> +; for (int j = 0; j < 2; j += 1) { /* outer */
> +; double phi = 0.0;
> +; for (int i = 0; i < 4; i += 1) /* reduction */
> +; phi += 4.2;
> +; A[j] = fsomeval;
> +; }
> +; }
> +;
> +; Check that fsomeval is not mapped to A[j] because it is read-only.
> +; There is no advantage in mapping values not modified within the SCoP.
> +;
> +define void @func(double* noalias nonnull %A) {
> +entry:
> + %fsomeval = fadd double 21.0, 21.0
> + br label %outer.preheader
> +
> +outer.preheader:
> + br label %outer.for
> +
> +outer.for:
> + %j = phi i32 [0, %outer.preheader], [%j.inc, %outer.inc]
> + %j.cmp = icmp slt i32 %j, 2
> + br i1 %j.cmp, label %reduction.preheader, 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]
> + %i.cmp = icmp slt i32 %i, 4
> + br i1 %i.cmp, label %body, label %reduction.exit
> +
> +
> +
> + body:
> + %add = fadd double %phi, 4.2
> + br label %reduction.inc
> +
> +
> +
> + reduction.inc:
> + %i.inc = add nuw nsw i32 %i, 1
> + br label %reduction.for
> +
> + reduction.exit:
> + %A_idx = getelementptr inbounds double, double* %A, i32 %j
> + store double %fsomeval, double* %A_idx
> + br label %outer.inc
> +
> +
> +
> +outer.inc:
> + %j.inc = add nuw nsw i32 %j, 1
> + br label %outer.for
> +
> +outer.exit:
> + br label %return
> +
> +return:
> + ret void
> +}
> +
> +
> +; CHECK: Statistics {
> +; CHECK: Compatible overwrites: 1
> +; CHECK: }
> +; CHECK: No modification has been made
>
> Added: polly/trunk/test/DeLICM/nomap_spuriouswrite.ll
> URL:
> http://llvm.org/viewvc/llvm-project/polly/trunk/test/DeLICM/nomap_spuriouswrite.ll?rev=296348&view=auto
> ==============================================================================
> --- polly/trunk/test/DeLICM/nomap_spuriouswrite.ll (added)
> +++ polly/trunk/test/DeLICM/nomap_spuriouswrite.ll Mon Feb 27 09:53:18
> 2017
> @@ -0,0 +1,84 @@
> +; RUN: opt %loadPolly -polly-delicm -analyze < %s | FileCheck %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 */
> +; phi += 4.2;
> +; if (phi < 0.0)
> +; A[j] = undef;
> +; A[j] = phi;
> +; }
> +; }
> +;
> +; The MAY_WRITE in reduction.exit.true avoids that anything can be
> mapped to
> +; A[j] because it would be overwritten by that MAY_WRITE just before the
> final
> +; MUST_WRITE. Also nothing can be map to the MAY_WRITE itself because it
> is a
> +; MAY_WRITE.
> +;
> +define void @func(double* noalias nonnull %A) {
> +entry:
> + %fsomeval = fadd double 21.0, 21.0
> + br label %outer.preheader
> +
> +outer.preheader:
> + br label %outer.for
> +
> +outer.for:
> + %j = phi i32 [0, %outer.preheader], [%j.inc, %outer.inc]
> + %j.cmp = icmp slt i32 %j, 2
> + br i1 %j.cmp, label %reduction.preheader, 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]
> + %i.cmp = icmp slt i32 %i, 4
> + br i1 %i.cmp, label %body, label %reduction.exit
> +
> +
> +
> + body:
> + %add = fadd double %phi, 4.2
> + br label %reduction.inc
> +
> +
> +
> + reduction.inc:
> + %i.inc = add nuw nsw i32 %i, 1
> + br label %reduction.for
> +
> + reduction.exit:
> + %A_idx = getelementptr inbounds double, double* %A, i32 %j
> + %phi.cmp = fcmp ogt double %phi, 0.0
> + br i1 %phi.cmp, label %reduction.exit.true, label
> %reduction.exit.unconditional
> +
> + reduction.exit.true:
> + store double undef, double* %A_idx
> + br label %reduction.exit.unconditional
> +
> + reduction.exit.unconditional:
> + store double %phi, double* %A_idx
> + br label %outer.inc
> +
> +
> +
> +outer.inc:
> + %j.inc = add nuw nsw i32 %j, 1
> + br label %outer.for
> +
> +outer.exit:
> + br label %return
> +
> +return:
> + ret void
> +}
> +
> +
> +; CHECK: Statistics {
> +; CHECK: Compatible overwrites: 1
> +; CHECK: }
> +; CHECK: No modification has been made
>
> Added: polly/trunk/test/DeLICM/nomap_storagesize.ll
> URL:
> http://llvm.org/viewvc/llvm-project/polly/trunk/test/DeLICM/nomap_storagesize.ll?rev=296348&view=auto
> ==============================================================================
> --- polly/trunk/test/DeLICM/nomap_storagesize.ll (added)
> +++ polly/trunk/test/DeLICM/nomap_storagesize.ll Mon Feb 27 09:53:18 2017
> @@ -0,0 +1,72 @@
> +; RUN: opt %loadPolly -polly-delicm -analyze < %s | FileCheck %s
> +;
> +; void func(float *A) {
> +; for (int j = 0; j < 2; j += 1) { /* outer */
> +; double phi = 0.0;
> +; for (int i = 0; i < 4; i += 1) /* reduction */
> +; phi += 4.2;
> +; A[j] = fsomeval;
> +; }
> +; }
> +;
> +; Check that %fphi is not mapped to A[j] because it is double-sized,
> +; but A[j] stores only floats.
> +;
> +define void @func(float* 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.cmp = icmp slt i32 %j, 2
> + br i1 %j.cmp, label %reduction.preheader, 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]
> + %i.cmp = icmp slt i32 %i, 4
> + br i1 %i.cmp, label %body, label %reduction.exit
> +
> +
> +
> + body:
> + %add = fadd double %phi, 4.2
> + br label %reduction.inc
> +
> +
> +
> + reduction.inc:
> + %i.inc = add nuw nsw i32 %i, 1
> + br label %reduction.for
> +
> + reduction.exit:
> + %A_idx = getelementptr inbounds float, float* %A, i32 %j
> + %fphi = fptrunc double %phi to float
> + store float %fphi, float* %A_idx
> + br label %outer.inc
> +
> +
> +
> +outer.inc:
> + %j.inc = add nuw nsw i32 %j, 1
> + br label %outer.for
> +
> +outer.exit:
> + br label %return
> +
> +return:
> + ret void
> +}
> +
> +
> +; CHECK: Statistics {
> +; CHECK: Compatible overwrites: 1
> +; CHECK: }
> +; CHECK: No modification has been made
>
> Added: polly/trunk/test/DeLICM/nomap_writewrite.ll
> URL:
> http://llvm.org/viewvc/llvm-project/polly/trunk/test/DeLICM/nomap_writewrite.ll?rev=296348&view=auto
> ==============================================================================
> --- polly/trunk/test/DeLICM/nomap_writewrite.ll (added)
> +++ polly/trunk/test/DeLICM/nomap_writewrite.ll Mon Feb 27 09:53:18 2017
> @@ -0,0 +1,88 @@
> +; RUN: opt %loadPolly -polly-delicm -analyze < %s | FileCheck %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 */
> +; if (phi < 0.0)
> +; A[j] = undef;
> +; phi += 4.2;
> +; A[j] = phi;
> +; }
> +; }
> +;
> +; The MAY_WRITE in reduction.for.true conflict with a write of %phi to
> +; A[j] if %phi would be mapped to it. Being a MAY_WRITE avoids being
> target
> +; of a mapping itself.
> +;
> +; TODO: There is actually no reason why these conflict. The MAY_WRITE is
> an
> +; explicit write, defined to occur always before all implicit writes as
> the
> +; write of %phi would be. There is currently no differentiation between
> +; implicit and explicit writes in Polly.
> +;
> +define void @func(double* noalias nonnull %A) {
> +entry:
> + %fsomeval = fadd double 21.0, 21.0
> + br label %outer.preheader
> +
> +outer.preheader:
> + br label %outer.for
> +
> +outer.for:
> + %j = phi i32 [0, %outer.preheader], [%j.inc, %outer.inc]
> + %j.cmp = icmp slt i32 %j, 2
> + br i1 %j.cmp, label %reduction.preheader, 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]
> + %A_idx = getelementptr inbounds double, double* %A, i32 %j
> + %phi.cmp = fcmp ogt double %phi, 0.0
> + br i1 %phi.cmp, label %reduction.for.true, label
> %reduction.for.unconditional
> +
> + reduction.for.true:
> + store double undef, double* %A_idx
> + br label %reduction.for.unconditional
> +
> + reduction.for.unconditional:
> + %i.cmp = icmp slt i32 %i, 4
> + br i1 %i.cmp, label %body, label %reduction.exit
> +
> +
> +
> + body:
> + %add = fadd double %phi, 4.2
> + br label %reduction.inc
> +
> +
> +
> + reduction.inc:
> + %i.inc = add nuw nsw i32 %i, 1
> + br label %reduction.for
> +
> + reduction.exit:
> + store double %phi, double* %A_idx
> + br label %outer.inc
> +
> +
> +
> +outer.inc:
> + %j.inc = add nuw nsw i32 %j, 1
> + br label %outer.for
> +
> +outer.exit:
> + br label %return
> +
> +return:
> + ret void
> +}
> +
> +
> +; CHECK: Statistics {
> +; CHECK: Compatible overwrites: 1
> +; CHECK: }
> +; CHECK: No modification has been made
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list