c4f61d2346
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. llvm-svn: 296348
85 lines
2 KiB
LLVM
85 lines
2 KiB
LLVM
; 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
|