1*70af4f57SMichael Kruse; RUN: opt %loadPolly -polly-optree -analyze < %s | FileCheck %s -match-full-lines 2*70af4f57SMichael Kruse; 3*70af4f57SMichael Krusedefine void @func(i32 %n, double* noalias nonnull %A, double* noalias nonnull %B, double* noalias nonnull %C) { 4*70af4f57SMichael Kruseentry: 5*70af4f57SMichael Kruse br label %for 6*70af4f57SMichael Kruse 7*70af4f57SMichael Krusefor: 8*70af4f57SMichael Kruse %j = phi i32 [0, %entry], [%j.inc, %inc] 9*70af4f57SMichael Kruse %j.cmp = icmp slt i32 %j, %n 10*70af4f57SMichael Kruse br i1 %j.cmp, label %bodyA, label %exit 11*70af4f57SMichael Kruse 12*70af4f57SMichael Kruse bodyA: 13*70af4f57SMichael Kruse %B_idx = getelementptr inbounds double, double* %B, i32 %j 14*70af4f57SMichael Kruse %val = load double, double* %B_idx 15*70af4f57SMichael Kruse br label %bodyB 16*70af4f57SMichael Kruse 17*70af4f57SMichael Kruse bodyB: 18*70af4f57SMichael Kruse store double 0.0, double* %B_idx 19*70af4f57SMichael Kruse %C_idx = getelementptr inbounds double, double* %C, i32 %j 20*70af4f57SMichael Kruse store double %val, double* %C_idx 21*70af4f57SMichael Kruse br label %bodyC 22*70af4f57SMichael Kruse 23*70af4f57SMichael Kruse bodyC: 24*70af4f57SMichael Kruse %A_idx = getelementptr inbounds double, double* %A, i32 %j 25*70af4f57SMichael Kruse store double %val, double* %A_idx 26*70af4f57SMichael Kruse br label %inc 27*70af4f57SMichael Kruse 28*70af4f57SMichael Kruseinc: 29*70af4f57SMichael Kruse %j.inc = add nuw nsw i32 %j, 1 30*70af4f57SMichael Kruse br label %for 31*70af4f57SMichael Kruse 32*70af4f57SMichael Kruseexit: 33*70af4f57SMichael Kruse br label %return 34*70af4f57SMichael Kruse 35*70af4f57SMichael Krusereturn: 36*70af4f57SMichael Kruse ret void 37*70af4f57SMichael Kruse} 38*70af4f57SMichael Kruse 39*70af4f57SMichael Kruse 40*70af4f57SMichael Kruse; CHECK: Statistics { 41*70af4f57SMichael Kruse; CHECK: Known loads forwarded: 2 42*70af4f57SMichael Kruse; CHECK: Operand trees forwarded: 2 43*70af4f57SMichael Kruse; CHECK: Statements with forwarded operand trees: 2 44*70af4f57SMichael Kruse; CHECK: } 45*70af4f57SMichael Kruse 46*70af4f57SMichael Kruse; CHECK-NEXT: After statements { 47*70af4f57SMichael Kruse; CHECK-NEXT: Stmt_bodyA 48*70af4f57SMichael Kruse; CHECK-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 0] 49*70af4f57SMichael Kruse; CHECK-NEXT: [n] -> { Stmt_bodyA[i0] -> MemRef_B[i0] }; 50*70af4f57SMichael Kruse; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 1] 51*70af4f57SMichael Kruse; CHECK-NEXT: [n] -> { Stmt_bodyA[i0] -> MemRef_val[] }; 52*70af4f57SMichael Kruse; CHECK-NEXT: Instructions { 53*70af4f57SMichael Kruse; CHECK-NEXT: %val = load double, double* %B_idx 54*70af4f57SMichael Kruse; CHECK-NEXT: } 55*70af4f57SMichael Kruse; CHECK-NEXT: Stmt_bodyB 56*70af4f57SMichael Kruse; CHECK-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 0] 57*70af4f57SMichael Kruse; CHECK-NEXT: null; 58*70af4f57SMichael Kruse; CHECK-NEXT: new: [n] -> { Stmt_bodyB[i0] -> MemRef_B[i0] }; 59*70af4f57SMichael Kruse; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 0] 60*70af4f57SMichael Kruse; CHECK-NEXT: [n] -> { Stmt_bodyB[i0] -> MemRef_B[i0] }; 61*70af4f57SMichael Kruse; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 0] 62*70af4f57SMichael Kruse; CHECK-NEXT: [n] -> { Stmt_bodyB[i0] -> MemRef_C[i0] }; 63*70af4f57SMichael Kruse; CHECK-NEXT: Instructions { 64*70af4f57SMichael Kruse; CHECK-NEXT: %val = load double, double* %B_idx 65*70af4f57SMichael Kruse; CHECK-NEXT: store double 0.000000e+00, double* %B_idx 66*70af4f57SMichael Kruse; CHECK-NEXT: store double %val, double* %C_idx 67*70af4f57SMichael Kruse; CHECK-NEXT: } 68*70af4f57SMichael Kruse; CHECK-NEXT: Stmt_bodyC 69*70af4f57SMichael Kruse; CHECK-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 0] 70*70af4f57SMichael Kruse; CHECK-NEXT: null; 71*70af4f57SMichael Kruse; CHECK-NEXT: new: [n] -> { Stmt_bodyC[i0] -> MemRef_C[i0] }; 72*70af4f57SMichael Kruse; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 0] 73*70af4f57SMichael Kruse; CHECK-NEXT: [n] -> { Stmt_bodyC[i0] -> MemRef_A[i0] }; 74*70af4f57SMichael Kruse; CHECK-NEXT: Instructions { 75*70af4f57SMichael Kruse; CHECK-NEXT: %val = load double, double* %B_idx 76*70af4f57SMichael Kruse; CHECK-NEXT: store double %val, double* %A_idx 77*70af4f57SMichael Kruse; CHECK-NEXT: } 78*70af4f57SMichael Kruse; CHECK-NEXT: } 79