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