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