xref: /llvm-project/llvm/test/Analysis/DependenceAnalysis/MismatchingNestLevels.ll (revision 46f9cddfd7e40998422d1e34a3f1193210ee2fb8)
1*46f9cddfSSebastian Pop; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 5
2c9677f6dSBardia Mahjour; RUN: opt < %s -disable-output "-passes=print<da>" -aa-pipeline=basic-aa 2>&1 | FileCheck %s
3c9677f6dSBardia Mahjour
4c9677f6dSBardia Mahjour;; void test1(long n, double *A) {
5c9677f6dSBardia Mahjour;;     long  i;
6c9677f6dSBardia Mahjour;;     for (i = 0; i*n <= n*n; ++i) {
7c9677f6dSBardia Mahjour;;         A[i] = i;
8c9677f6dSBardia Mahjour;;     }
9c9677f6dSBardia Mahjour;;     A[i] = i;
10c9677f6dSBardia Mahjour;; }
11c9677f6dSBardia Mahjour
12c9677f6dSBardia Mahjourdefine void @test1(i64 noundef %n, ptr nocapture noundef writeonly %A) {
13*46f9cddfSSebastian Pop; CHECK-LABEL: 'test1'
14*46f9cddfSSebastian Pop; CHECK-NEXT:  Src: store double %conv, ptr %arrayidx, align 8 --> Dst: store double %conv, ptr %arrayidx, align 8
15*46f9cddfSSebastian Pop; CHECK-NEXT:    da analyze - none!
16*46f9cddfSSebastian Pop; CHECK-NEXT:  Src: store double %conv, ptr %arrayidx, align 8 --> Dst: store double %conv2, ptr %arrayidx3, align 8
17*46f9cddfSSebastian Pop; CHECK-NEXT:    da analyze - output [|<]!
18*46f9cddfSSebastian Pop; CHECK-NEXT:  Src: store double %conv2, ptr %arrayidx3, align 8 --> Dst: store double %conv2, ptr %arrayidx3, align 8
19*46f9cddfSSebastian Pop; CHECK-NEXT:    da analyze - none!
20*46f9cddfSSebastian Pop;
21c9677f6dSBardia Mahjourentry:
22c9677f6dSBardia Mahjour  %mul1 = mul nsw i64 %n, %n
23c9677f6dSBardia Mahjour  br label %for.body
24c9677f6dSBardia Mahjour
25c9677f6dSBardia Mahjourfor.body:                                         ; preds = %entry, %for.body
26c9677f6dSBardia Mahjour  %i.012 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
27c9677f6dSBardia Mahjour  %conv = sitofp i64 %i.012 to double
28c9677f6dSBardia Mahjour  %arrayidx = getelementptr inbounds double, ptr %A, i64 %i.012
29c9677f6dSBardia Mahjour  store double %conv, ptr %arrayidx, align 8
30c9677f6dSBardia Mahjour  %inc = add nuw nsw i64 %i.012, 1
31c9677f6dSBardia Mahjour  %mul = mul nsw i64 %inc, %n
32c9677f6dSBardia Mahjour  %cmp.not = icmp sgt i64 %mul, %mul1
33c9677f6dSBardia Mahjour  br i1 %cmp.not, label %for.end, label %for.body
34c9677f6dSBardia Mahjour
35c9677f6dSBardia Mahjourfor.end:                                          ; preds = %for.body
36c9677f6dSBardia Mahjour  %conv2 = sitofp i64 %inc to double
37c9677f6dSBardia Mahjour  %arrayidx3 = getelementptr inbounds double, ptr %A, i64 %inc
38c9677f6dSBardia Mahjour  store double %conv2, ptr %arrayidx3, align 8
39c9677f6dSBardia Mahjour  ret void
40c9677f6dSBardia Mahjour}
41c9677f6dSBardia Mahjour
42c9677f6dSBardia Mahjour
43c9677f6dSBardia Mahjour;; int test2(unsigned n, float A[][n+1], float B[n+1]) {
44c9677f6dSBardia Mahjour;;  for (int i = 0; i <= n; i++) {
45c9677f6dSBardia Mahjour;;    long j = 0;
46c9677f6dSBardia Mahjour;;    for (; j <= n; ++j) {
47c9677f6dSBardia Mahjour;;      B[j] = j;
48c9677f6dSBardia Mahjour;;    }
49c9677f6dSBardia Mahjour;;    A[i][j] = 123;
50c9677f6dSBardia Mahjour;;    for (int k = 0; k <= n; k++) {
51c9677f6dSBardia Mahjour;;      A[i][k] = k;
52c9677f6dSBardia Mahjour;;    }
53c9677f6dSBardia Mahjour;;  }
54c9677f6dSBardia Mahjour;;
55c9677f6dSBardia Mahjour;; Make sure we can detect depnendence between A[i][j] and A[i][k] conservatively and without crashing.
56c9677f6dSBardia Mahjour
57c9677f6dSBardia Mahjourdefine dso_local void @test2(i32 noundef zeroext %n, ptr noundef %A, ptr noalias noundef %B) #0 {
58*46f9cddfSSebastian Pop; CHECK-LABEL: 'test2'
59*46f9cddfSSebastian Pop; CHECK-NEXT:  Src: store i32 %conv5, ptr %arrayidx, align 4 --> Dst: store i32 %conv5, ptr %arrayidx, align 4
60*46f9cddfSSebastian Pop; CHECK-NEXT:    da analyze - consistent output [S 0]!
61*46f9cddfSSebastian Pop; CHECK-NEXT:  Src: store i32 %conv5, ptr %arrayidx, align 4 --> Dst: store float 1.230000e+02, ptr %arrayidx7, align 4
62*46f9cddfSSebastian Pop; CHECK-NEXT:    da analyze - none!
63*46f9cddfSSebastian Pop; CHECK-NEXT:  Src: store i32 %conv5, ptr %arrayidx, align 4 --> Dst: store float %conv13, ptr %arrayidx17, align 4
64*46f9cddfSSebastian Pop; CHECK-NEXT:    da analyze - none!
65*46f9cddfSSebastian Pop; CHECK-NEXT:  Src: store float 1.230000e+02, ptr %arrayidx7, align 4 --> Dst: store float 1.230000e+02, ptr %arrayidx7, align 4
66*46f9cddfSSebastian Pop; CHECK-NEXT:    da analyze - output [*]!
67*46f9cddfSSebastian Pop; CHECK-NEXT:  Src: store float 1.230000e+02, ptr %arrayidx7, align 4 --> Dst: store float %conv13, ptr %arrayidx17, align 4
68*46f9cddfSSebastian Pop; CHECK-NEXT:    da analyze - output [*|<]!
69*46f9cddfSSebastian Pop; CHECK-NEXT:  Src: store float %conv13, ptr %arrayidx17, align 4 --> Dst: store float %conv13, ptr %arrayidx17, align 4
70*46f9cddfSSebastian Pop; CHECK-NEXT:    da analyze - none!
71*46f9cddfSSebastian Pop;
72c9677f6dSBardia Mahjourentry:
73c9677f6dSBardia Mahjour  %add = add i32 %n, 1
74c9677f6dSBardia Mahjour  %0 = zext i32 %add to i64
75c9677f6dSBardia Mahjour  %1 = zext i32 %n to i64
76c9677f6dSBardia Mahjour  %2 = add nuw nsw i64 %1, 1
77c9677f6dSBardia Mahjour  %wide.trip.count9 = zext i32 %add to i64
78c9677f6dSBardia Mahjour  br label %for.i
79c9677f6dSBardia Mahjour
80c9677f6dSBardia Mahjourfor.i:                                         ; preds = %entry, %for.inc21
81c9677f6dSBardia Mahjour  %indvars.iv6 = phi i64 [ 0, %entry ], [ %indvars.iv.next7, %for.inc21 ]
82c9677f6dSBardia Mahjour  br label %for.j
83c9677f6dSBardia Mahjour
84c9677f6dSBardia Mahjourfor.j:                                        ; preds = %for.i, %for.j
85c9677f6dSBardia Mahjour  %j.01 = phi i64 [ 0, %for.i ], [ %inc, %for.j ]
86c9677f6dSBardia Mahjour  %conv5 = trunc i64 %j.01 to i32
87c9677f6dSBardia Mahjour  %arrayidx = getelementptr inbounds i32, ptr %B, i64 %j.01
88c9677f6dSBardia Mahjour  store i32 %conv5, ptr %arrayidx, align 4
89c9677f6dSBardia Mahjour  %inc = add nuw nsw i64 %j.01, 1
90c9677f6dSBardia Mahjour  %exitcond = icmp ne i64 %inc, %2
91c9677f6dSBardia Mahjour  br i1 %exitcond, label %for.j, label %for.end
92c9677f6dSBardia Mahjour
93c9677f6dSBardia Mahjourfor.end:                                          ; preds = %for.j
94c9677f6dSBardia Mahjour  %inc.lcssa = phi i64 [ %inc, %for.j ]
95c9677f6dSBardia Mahjour  %3 = mul nuw nsw i64 %indvars.iv6, %0
96c9677f6dSBardia Mahjour  %arrayidx6 = getelementptr inbounds float, ptr %A, i64 %3
97c9677f6dSBardia Mahjour  %arrayidx7 = getelementptr inbounds float, ptr %arrayidx6, i64 %inc.lcssa
98c9677f6dSBardia Mahjour  store float 1.230000e+02, ptr %arrayidx7, align 4
99c9677f6dSBardia Mahjour  %wide.trip.count = zext i32 %add to i64
100c9677f6dSBardia Mahjour  br label %for.k
101c9677f6dSBardia Mahjour
102c9677f6dSBardia Mahjourfor.k:                                       ; preds = %for.end, %for.k
103c9677f6dSBardia Mahjour  %indvars.iv = phi i64 [ 0, %for.end ], [ %indvars.iv.next, %for.k ]
104c9677f6dSBardia Mahjour  %4 = trunc i64 %indvars.iv to i32
105c9677f6dSBardia Mahjour  %conv13 = sitofp i32 %4 to float
106c9677f6dSBardia Mahjour  %5 = mul nuw nsw i64 %indvars.iv6, %0
107c9677f6dSBardia Mahjour  %arrayidx15 = getelementptr inbounds float, ptr %A, i64 %5
108c9677f6dSBardia Mahjour  %arrayidx17 = getelementptr inbounds float, ptr %arrayidx15, i64 %indvars.iv
109c9677f6dSBardia Mahjour  store float %conv13, ptr %arrayidx17, align 4
110c9677f6dSBardia Mahjour  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
111c9677f6dSBardia Mahjour  %exitcond5 = icmp ne i64 %indvars.iv.next, %wide.trip.count
112c9677f6dSBardia Mahjour  br i1 %exitcond5, label %for.k, label %for.inc21
113c9677f6dSBardia Mahjour
114c9677f6dSBardia Mahjourfor.inc21:                                        ; preds = %for.k
115c9677f6dSBardia Mahjour  %indvars.iv.next7 = add nuw nsw i64 %indvars.iv6, 1
116c9677f6dSBardia Mahjour  %exitcond10 = icmp ne i64 %indvars.iv.next7, %wide.trip.count9
117c9677f6dSBardia Mahjour  br i1 %exitcond10, label %for.i, label %for.end23
118c9677f6dSBardia Mahjour
119c9677f6dSBardia Mahjourfor.end23:                                        ; preds = %for.inc21
120c9677f6dSBardia Mahjour  ret void
121c9677f6dSBardia Mahjour}
122c9677f6dSBardia Mahjour
123c9677f6dSBardia Mahjour
124c9677f6dSBardia Mahjour;; void test3(int n, double *restrict A, double *restrict B) {
125c9677f6dSBardia Mahjour;;   for (int i = 0; i < n; ++i) {
126c9677f6dSBardia Mahjour;;     int s = 0;
127c9677f6dSBardia Mahjour;;     for (; s * s < n * n; ++s) {
128c9677f6dSBardia Mahjour;;     }
129c9677f6dSBardia Mahjour;;     for (int k = 0; k < n; ++k)
130c9677f6dSBardia Mahjour;;       A[s] = 0; // Invariant in innermost loop
131c9677f6dSBardia Mahjour;;
132c9677f6dSBardia Mahjour;;     A[i] = 1;
133c9677f6dSBardia Mahjour;;   }
134c9677f6dSBardia Mahjour;; }
135c9677f6dSBardia Mahjour;;
136c9677f6dSBardia Mahjour;; Make sure we can detect depnendence between A[i] and A[s] conservatively and without crashing.
137c9677f6dSBardia Mahjour
138c9677f6dSBardia Mahjourdefine void @test3(i32 noundef %n, ptr noalias noundef %A, ptr noalias noundef %B) {
139*46f9cddfSSebastian Pop; CHECK-LABEL: 'test3'
140*46f9cddfSSebastian Pop; CHECK-NEXT:  Src: store double 0.000000e+00, ptr %arrayidx, align 8 --> Dst: store double 0.000000e+00, ptr %arrayidx, align 8
141*46f9cddfSSebastian Pop; CHECK-NEXT:    da analyze - output [* S]!
142*46f9cddfSSebastian Pop; CHECK-NEXT:  Src: store double 0.000000e+00, ptr %arrayidx, align 8 --> Dst: store double 1.000000e+00, ptr %arrayidx21, align 8
143*46f9cddfSSebastian Pop; CHECK-NEXT:    da analyze - output [*|<]!
144*46f9cddfSSebastian Pop; CHECK-NEXT:  Src: store double 1.000000e+00, ptr %arrayidx21, align 8 --> Dst: store double 1.000000e+00, ptr %arrayidx21, align 8
145*46f9cddfSSebastian Pop; CHECK-NEXT:    da analyze - none!
146*46f9cddfSSebastian Pop;
147c9677f6dSBardia Mahjourentry:
148c9677f6dSBardia Mahjour  br label %for.i
149c9677f6dSBardia Mahjour
150c9677f6dSBardia Mahjourfor.i:                                         ; preds = %for.end19, %entry
151c9677f6dSBardia Mahjour  %i.0 = phi i32 [ 0, %entry ], [ %inc23, %for.end19 ]
152c9677f6dSBardia Mahjour  %cmp = icmp slt i32 %i.0, %n
153c9677f6dSBardia Mahjour  br i1 %cmp, label %for.s, label %for.end24
154c9677f6dSBardia Mahjour
155c9677f6dSBardia Mahjourfor.s:                                        ; preds = %for.i, %for.inc
156c9677f6dSBardia Mahjour  %s.0 = phi i32 [ %inc, %for.inc ], [ 0, %for.i ]
157c9677f6dSBardia Mahjour  %mul = mul nsw i32 %s.0, %s.0
158c9677f6dSBardia Mahjour  %mul2 = mul nsw i32 %n, %n
159c9677f6dSBardia Mahjour  %cmp3 = icmp slt i32 %mul, %mul2
160c9677f6dSBardia Mahjour  br i1 %cmp3, label %for.inc, label %for.k
161c9677f6dSBardia Mahjour
162c9677f6dSBardia Mahjourfor.inc:                                          ; preds = %for.s
163c9677f6dSBardia Mahjour  %inc = add nsw i32 %s.0, 1
164c9677f6dSBardia Mahjour  br label %for.s
165c9677f6dSBardia Mahjour
166c9677f6dSBardia Mahjourfor.k:                                        ; preds = %for.s, %for.body.k
167c9677f6dSBardia Mahjour  %k.0 = phi i32 [ %inc10, %for.body.k ], [ 0, %for.s ]
168c9677f6dSBardia Mahjour  %cmp6 = icmp slt i32 %k.0, %n
169c9677f6dSBardia Mahjour  br i1 %cmp6, label %for.body.k, label %for.end19
170c9677f6dSBardia Mahjour
171c9677f6dSBardia Mahjourfor.body.k:                                        ; preds = %for.k
172c9677f6dSBardia Mahjour  %idxprom = sext i32 %s.0 to i64
173c9677f6dSBardia Mahjour  %arrayidx = getelementptr inbounds double, ptr %A, i64 %idxprom
174c9677f6dSBardia Mahjour  store double 0.000000e+00, ptr %arrayidx, align 8
175c9677f6dSBardia Mahjour  %inc10 = add nsw i32 %k.0, 1
176c9677f6dSBardia Mahjour  br label %for.k
177c9677f6dSBardia Mahjour
178c9677f6dSBardia Mahjourfor.end19:                                        ; preds = %for.k
179c9677f6dSBardia Mahjour  %idxprom20 = sext i32 %i.0 to i64
180c9677f6dSBardia Mahjour  %arrayidx21 = getelementptr inbounds double, ptr %A, i64 %idxprom20
181c9677f6dSBardia Mahjour  store double 1.000000e+00, ptr %arrayidx21, align 8
182c9677f6dSBardia Mahjour  %inc23 = add nsw i32 %i.0, 1
183c9677f6dSBardia Mahjour  br label %for.i
184c9677f6dSBardia Mahjour
185c9677f6dSBardia Mahjourfor.end24:                                        ; preds = %for.i
186c9677f6dSBardia Mahjour  ret void
187c9677f6dSBardia Mahjour}
188