diff options
-rw-r--r-- | polly/lib/Transform/DeLICM.cpp | 14 | ||||
-rw-r--r-- | polly/test/DeLICM/skip_maywrite.ll | 74 | ||||
-rw-r--r-- | polly/test/DeLICM/skip_notinloop.ll | 45 | ||||
-rw-r--r-- | polly/test/DeLICM/skip_scalaraccess.ll | 64 |
4 files changed, 197 insertions, 0 deletions
diff --git a/polly/lib/Transform/DeLICM.cpp b/polly/lib/Transform/DeLICM.cpp index 45c91437c13..6d39d25d812 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 00000000000..e3ab2877592 --- /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 00000000000..0dd9054d2f5 --- /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 00000000000..93919adee13 --- /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 |