1; RUN: opt -basicaa %loadPolly -polly-dependences -analyze < %s | FileCheck %s
2;
3; Verify that only the inner reduction like accesses cause reduction dependences
4;
5; CHECK: Reduction dependences:
6; CHECK:   { Stmt_for_body3[i0, i1] -> Stmt_for_body3[i0, 1 + i1] : i0 <= 99 and i0 >= 0 and i1 <= 98 and i1 >= 0 }
7;
8; void f(int * restrict A, int * restrict sum) {
9;   int i, j, k;
10;   for (i = 0; i < 100; i++) {
11;     *sum *= 7;
12;     for (j = 0; j < 100; j++) {
13;       *sum += A[i+j];
14;       for (k = 0; k< 100; k++) {}
15;     }
16;   }
17; }
18target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-n32-S64"
19
20define void @f(i32* noalias %A, i32* noalias %sum) {
21entry:
22  br label %for.cond
23
24for.cond:                                         ; preds = %for.inc11, %entry
25  %i.0 = phi i32 [ 0, %entry ], [ %inc12, %for.inc11 ]
26  %exitcond2 = icmp ne i32 %i.0, 100
27  br i1 %exitcond2, label %for.body, label %for.end13
28
29for.body:                                         ; preds = %for.cond
30  %tmp = load i32, i32* %sum, align 4
31  %mul = mul nsw i32 %tmp, 7
32  store i32 %mul, i32* %sum, align 4
33  br label %for.cond1
34
35for.cond1:                                        ; preds = %for.inc8, %for.body
36  %j.0 = phi i32 [ 0, %for.body ], [ %inc9, %for.inc8 ]
37  %exitcond1 = icmp ne i32 %j.0, 100
38  br i1 %exitcond1, label %for.body3, label %for.end10
39
40for.body3:                                        ; preds = %for.cond1
41  %add = add nsw i32 %i.0, %j.0
42  %arrayidx = getelementptr inbounds i32, i32* %A, i32 %add
43  %tmp3 = load i32, i32* %arrayidx, align 4
44  %tmp4 = load i32, i32* %sum, align 4
45  %add4 = add nsw i32 %tmp4, %tmp3
46  store i32 %add4, i32* %sum, align 4
47  br label %for.cond5
48
49for.cond5:                                        ; preds = %for.inc, %for.body3
50  %k.0 = phi i32 [ 0, %for.body3 ], [ %inc, %for.inc ]
51  %exitcond = icmp ne i32 %k.0, 100
52  br i1 %exitcond, label %for.body7, label %for.end
53
54for.body7:                                        ; preds = %for.cond5
55  br label %for.inc
56
57for.inc:                                          ; preds = %for.body7
58  %inc = add nsw i32 %k.0, 1
59  br label %for.cond5
60
61for.end:                                          ; preds = %for.cond5
62  br label %for.inc8
63
64for.inc8:                                         ; preds = %for.end
65  %inc9 = add nsw i32 %j.0, 1
66  br label %for.cond1
67
68for.end10:                                        ; preds = %for.cond1
69  br label %for.inc11
70
71for.inc11:                                        ; preds = %for.end10
72  %inc12 = add nsw i32 %i.0, 1
73  br label %for.cond
74
75for.end13:                                        ; preds = %for.cond
76  ret void
77}
78