From d8d32bb3d1bd5e68aaa7f4eb0642e3832f11674f Mon Sep 17 00:00:00 2001 From: Michael Kruse Date: Thu, 23 Feb 2017 10:25:20 +0000 Subject: [PATCH] [DeLICM] Regression test for skipping map targets. Add optimization-remarks-missed for when mapping targets have been skipped and add regression tests for them. llvm-svn: 295953 --- polly/lib/Transform/DeLICM.cpp | 14 +++++ polly/test/DeLICM/skip_maywrite.ll | 74 ++++++++++++++++++++++++++ polly/test/DeLICM/skip_notinloop.ll | 45 ++++++++++++++++ polly/test/DeLICM/skip_scalaraccess.ll | 64 ++++++++++++++++++++++ 4 files changed, 197 insertions(+) create mode 100644 polly/test/DeLICM/skip_maywrite.ll create mode 100644 polly/test/DeLICM/skip_notinloop.ll create mode 100644 polly/test/DeLICM/skip_scalaraccess.ll diff --git a/polly/lib/Transform/DeLICM.cpp b/polly/lib/Transform/DeLICM.cpp index 45c91437c13d..6d39d25d8125 100644 --- a/polly/lib/Transform/DeLICM.cpp +++ b/polly/lib/Transform/DeLICM.cpp @@ -1607,18 +1607,32 @@ public: if (MA->isMayWrite()) { DEBUG(dbgs() << "Access " << MA << " pruned because it is a MAY_WRITE\n"); + OptimizationRemarkMissed R(DEBUG_TYPE, "TargetMayWrite", + MA->getAccessInstruction()); + R << "Skipped possible mapping target because it is not an " + "unconditional overwrite"; + S->getFunction().getContext().diagnose(R); continue; } if (Stmt.getNumIterators() == 0) { DEBUG(dbgs() << "Access " << MA << " pruned because it is not in a loop\n"); + OptimizationRemarkMissed R(DEBUG_TYPE, "WriteNotInLoop", + MA->getAccessInstruction()); + R << "skipped possible mapping target because it is not in a loop"; + S->getFunction().getContext().diagnose(R); continue; } if (isScalarAccess(MA)) { DEBUG(dbgs() << "Access " << MA << " pruned because it writes only a single element\n"); + OptimizationRemarkMissed R(DEBUG_TYPE, "ScalarWrite", + MA->getAccessInstruction()); + R << "skipped possible mapping target because the memory location " + "written to does not depend on its outer loop"; + S->getFunction().getContext().diagnose(R); continue; } diff --git a/polly/test/DeLICM/skip_maywrite.ll b/polly/test/DeLICM/skip_maywrite.ll new file mode 100644 index 000000000000..e3ab2877592a --- /dev/null +++ b/polly/test/DeLICM/skip_maywrite.ll @@ -0,0 +1,74 @@ +; RUN: opt %loadPolly -polly-delicm -analyze -pass-remarks-missed=polly-delicm < %s 2>&1 | FileCheck %s +; +; void func(double *A) { +; for (int j = 0; j < 2; j += 1) { /* outer */ +; memset(A[j], 0, sizeof(double)); +; double phi = 0.0; +; for (int i = 0; i < 4; i += 1) /* reduction */ +; phi += 4.2; +; if (phi >= 0.0) +; 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.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: + %phi.cmp = fcmp ogt double %phi, 0.0 + br i1 %phi.cmp , label %reduction.exit_true, label %reduction.exit_false + + reduction.exit_true: + %A_idx = getelementptr inbounds double, double* %A, i32 %j + store double %phi, double* %A_idx + br label %outer.inc + + reduction.exit_false: + 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: Skipped possible mapping target because it is not an unconditional overwrite diff --git a/polly/test/DeLICM/skip_notinloop.ll b/polly/test/DeLICM/skip_notinloop.ll new file mode 100644 index 000000000000..0dd9054d2f55 --- /dev/null +++ b/polly/test/DeLICM/skip_notinloop.ll @@ -0,0 +1,45 @@ +; RUN: opt %loadPolly -polly-delicm -analyze -pass-remarks-missed=polly-delicm < %s 2>&1 | FileCheck %s +; +; void func(double *A) { +; double phi = 0.0; +; for (int i = 0; i < 4; i += 1) /* reduction */ +; phi += 4.2; +; A[0] = phi; +; } +; +define void @func(double* noalias nonnull %A) { +entry: + br label %reduction.preheader + + 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: + store double %phi, double* %A + br label %return + + +return: + ret void +} + + +; CHECK: skipped possible mapping target because it is not in a loop diff --git a/polly/test/DeLICM/skip_scalaraccess.ll b/polly/test/DeLICM/skip_scalaraccess.ll new file mode 100644 index 000000000000..93919adee135 --- /dev/null +++ b/polly/test/DeLICM/skip_scalaraccess.ll @@ -0,0 +1,64 @@ +; RUN: opt %loadPolly -polly-delicm -analyze -pass-remarks-missed=polly-delicm < %s 2>&1 | 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; +; A[0] = 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.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: + store double %phi, double* %A + 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: skipped possible mapping target because the memory location written to does not depend on its outer loop