xref: /llvm-project/polly/test/DeLICM/reduction_looprotate_load.ll (revision b332499a94df11870dfc7598645c59656deb933d)
15c028081SMichael Kruse; RUN: opt %loadPolly -polly-stmt-granularity=bb -polly-flatten-schedule -polly-delicm-overapproximate-writes=true -polly-delicm-compute-known=true -polly-print-delicm -disable-output < %s | FileCheck %s
25ae08c0eSMichael Kruse;
35ae08c0eSMichael Kruse;    void func(int *A, double* StartPtr) {
45ae08c0eSMichael Kruse;      for (int j = 0; j < 2; j += 1) { /* outer */
55ae08c0eSMichael Kruse;        int phi = *StartPtr;
65ae08c0eSMichael Kruse;        for (int i = 0; i < 4; i += 1) /* reduction */
75ae08c0eSMichael Kruse;          phi += 4.2;
85ae08c0eSMichael Kruse;        A[j] = phi;
95ae08c0eSMichael Kruse;      }
105ae08c0eSMichael Kruse;    }
115ae08c0eSMichael Kruse;
12*b332499aSNikita Popovdefine void @func(ptr noalias nonnull %A, ptr noalias nonnull %StartPtr) {
135ae08c0eSMichael Kruseentry:
145ae08c0eSMichael Kruse  br label %outer.preheader
155ae08c0eSMichael Kruse
165ae08c0eSMichael Kruseouter.preheader:
175ae08c0eSMichael Kruse  br label %outer.for
185ae08c0eSMichael Kruse
195ae08c0eSMichael Kruseouter.for:
205ae08c0eSMichael Kruse  %j = phi i32 [0, %outer.preheader], [%j.inc, %outer.inc]
215ae08c0eSMichael Kruse  %j.cmp = icmp slt i32 %j, 2
225ae08c0eSMichael Kruse  br i1 %j.cmp, label %reduction.preheader, label %outer.exit
235ae08c0eSMichael Kruse
245ae08c0eSMichael Kruse
255ae08c0eSMichael Kruse    reduction.preheader:
26*b332499aSNikita Popov      %Start = load double, ptr %StartPtr
275ae08c0eSMichael Kruse      br label %reduction.for
285ae08c0eSMichael Kruse
295ae08c0eSMichael Kruse    reduction.for:
305ae08c0eSMichael Kruse      %i = phi i32 [0, %reduction.preheader], [%i.inc, %reduction.inc]
315ae08c0eSMichael Kruse      %phi = phi double [%Start, %reduction.preheader], [%add, %reduction.inc]
325ae08c0eSMichael Kruse      br label %body
335ae08c0eSMichael Kruse
345ae08c0eSMichael Kruse
355ae08c0eSMichael Kruse
365ae08c0eSMichael Kruse        body:
375ae08c0eSMichael Kruse          %add = fadd double %phi, 4.2
385ae08c0eSMichael Kruse          br label %reduction.inc
395ae08c0eSMichael Kruse
405ae08c0eSMichael Kruse
415ae08c0eSMichael Kruse
425ae08c0eSMichael Kruse    reduction.inc:
435ae08c0eSMichael Kruse      %i.inc = add nuw nsw i32 %i, 1
445ae08c0eSMichael Kruse      %i.cmp = icmp slt i32 %i.inc, 4
455ae08c0eSMichael Kruse      br i1 %i.cmp, label %reduction.for, label %reduction.exit
465ae08c0eSMichael Kruse
475ae08c0eSMichael Kruse    reduction.exit:
48*b332499aSNikita Popov      %A_idx = getelementptr inbounds double, ptr %A, i32 %j
49*b332499aSNikita Popov      store double %add, ptr %A_idx
505ae08c0eSMichael Kruse      br label %outer.inc
515ae08c0eSMichael Kruse
525ae08c0eSMichael Kruse
535ae08c0eSMichael Kruse
545ae08c0eSMichael Kruseouter.inc:
555ae08c0eSMichael Kruse  %j.inc = add nuw nsw i32 %j, 1
565ae08c0eSMichael Kruse  br label %outer.for
575ae08c0eSMichael Kruse
585ae08c0eSMichael Kruseouter.exit:
595ae08c0eSMichael Kruse  br label %return
605ae08c0eSMichael Kruse
615ae08c0eSMichael Krusereturn:
625ae08c0eSMichael Kruse  ret void
635ae08c0eSMichael Kruse}
645ae08c0eSMichael Kruse
655ae08c0eSMichael Kruse; CHECK:      After accesses {
665ae08c0eSMichael Kruse; CHECK-NEXT:     Stmt_reduction_preheader
675ae08c0eSMichael Kruse; CHECK-NEXT:             ReadAccess :=       [Reduction Type: NONE] [Scalar: 0]
685ae08c0eSMichael Kruse; CHECK-NEXT:                 { Stmt_reduction_preheader[i0] -> MemRef_StartPtr[0] };
695ae08c0eSMichael Kruse; CHECK-NEXT:             MustWriteAccess :=  [Reduction Type: NONE] [Scalar: 1]
705ae08c0eSMichael Kruse; CHECK-NEXT:                 { Stmt_reduction_preheader[i0] -> MemRef_phi__phi[] };
714556c9b8STobias Grosser; CHECK-NEXT:            new: { Stmt_reduction_preheader[i0] -> MemRef_A[i0] };
725ae08c0eSMichael Kruse; CHECK-NEXT:     Stmt_reduction_for
735ae08c0eSMichael Kruse; CHECK-NEXT:             ReadAccess :=       [Reduction Type: NONE] [Scalar: 1]
745ae08c0eSMichael Kruse; CHECK-NEXT:                 { Stmt_reduction_for[i0, i1] -> MemRef_phi__phi[] };
754556c9b8STobias Grosser; CHECK-NEXT:            new: { Stmt_reduction_for[i0, i1] -> MemRef_A[i0] };
765ae08c0eSMichael Kruse; CHECK-NEXT:             MustWriteAccess :=  [Reduction Type: NONE] [Scalar: 1]
775ae08c0eSMichael Kruse; CHECK-NEXT:                 { Stmt_reduction_for[i0, i1] -> MemRef_phi[] };
784556c9b8STobias Grosser; CHECK-NEXT:            new: { Stmt_reduction_for[i0, i1] -> MemRef_A[i0] };
795ae08c0eSMichael Kruse; CHECK-NEXT:     Stmt_body
805ae08c0eSMichael Kruse; CHECK-NEXT:             MustWriteAccess :=  [Reduction Type: NONE] [Scalar: 1]
815ae08c0eSMichael Kruse; CHECK-NEXT:                 { Stmt_body[i0, i1] -> MemRef_add[] };
824556c9b8STobias Grosser; CHECK-NEXT:            new: { Stmt_body[i0, i1] -> MemRef_A[i0] };
835ae08c0eSMichael Kruse; CHECK-NEXT:             ReadAccess :=       [Reduction Type: NONE] [Scalar: 1]
845ae08c0eSMichael Kruse; CHECK-NEXT:                 { Stmt_body[i0, i1] -> MemRef_phi[] };
854556c9b8STobias Grosser; CHECK-NEXT:            new: { Stmt_body[i0, i1] -> MemRef_A[i0] : 3i1 <= 22 - 14i0; Stmt_body[1, 3] -> MemRef_A[1] };
865ae08c0eSMichael Kruse; CHECK-NEXT:     Stmt_reduction_inc
875ae08c0eSMichael Kruse; CHECK-NEXT:             ReadAccess :=       [Reduction Type: NONE] [Scalar: 1]
885ae08c0eSMichael Kruse; CHECK-NEXT:                 { Stmt_reduction_inc[i0, i1] -> MemRef_add[] };
894556c9b8STobias Grosser; CHECK-NEXT:            new: { Stmt_reduction_inc[i0, i1] -> MemRef_A[i0] : 3i1 <= 22 - 14i0; Stmt_reduction_inc[1, 3] -> MemRef_A[1] };
905ae08c0eSMichael Kruse; CHECK-NEXT:             MustWriteAccess :=  [Reduction Type: NONE] [Scalar: 1]
915ae08c0eSMichael Kruse; CHECK-NEXT:                 { Stmt_reduction_inc[i0, i1] -> MemRef_phi__phi[] };
924556c9b8STobias Grosser; CHECK-NEXT:            new: { Stmt_reduction_inc[i0, i1] -> MemRef_A[i0] };
935ae08c0eSMichael Kruse; CHECK-NEXT:     Stmt_reduction_exit
945ae08c0eSMichael Kruse; CHECK-NEXT:             MustWriteAccess :=  [Reduction Type: NONE] [Scalar: 0]
955ae08c0eSMichael Kruse; CHECK-NEXT:                 { Stmt_reduction_exit[i0] -> MemRef_A[i0] };
965ae08c0eSMichael Kruse; CHECK-NEXT:             ReadAccess :=       [Reduction Type: NONE] [Scalar: 1]
975ae08c0eSMichael Kruse; CHECK-NEXT:                 { Stmt_reduction_exit[i0] -> MemRef_add[] };
984556c9b8STobias Grosser; CHECK-NEXT:            new: { Stmt_reduction_exit[i0] -> MemRef_A[i0] };
995ae08c0eSMichael Kruse; CHECK-NEXT: }
100