8
8
define float @bug41488_test1 (float %f ) {
9
9
; CHECK-LABEL: 'bug41488_test1'
10
10
; CHECK-NEXT: Src: %0 = load float, ptr %p, align 4 --> Dst: %0 = load float, ptr %p, align 4
11
- ; CHECK-NEXT: da analyze - input [*] !
11
+ ; CHECK-NEXT: da analyze - confused !
12
12
; CHECK-NEXT: Src: %0 = load float, ptr %p, align 4 --> Dst: store float %f, ptr %q, align 4
13
13
; CHECK-NEXT: da analyze - confused!
14
14
; CHECK-NEXT: Src: store float %f, ptr %q, align 4 --> Dst: store float %f, ptr %q, align 4
15
- ; CHECK-NEXT: da analyze - output [*] !
15
+ ; CHECK-NEXT: da analyze - confused !
16
16
;
17
17
entry:
18
18
%g = alloca float , align 4
@@ -34,11 +34,11 @@ for.cond.cleanup:
34
34
define void @bug41488_test2 (i32 %n ) {
35
35
; CHECK-LABEL: 'bug41488_test2'
36
36
; CHECK-NEXT: Src: %0 = load float, ptr %p, align 4 --> Dst: %0 = load float, ptr %p, align 4
37
- ; CHECK-NEXT: da analyze - input [*] !
37
+ ; CHECK-NEXT: da analyze - confused !
38
38
; CHECK-NEXT: Src: %0 = load float, ptr %p, align 4 --> Dst: store float 0.000000e+00, ptr %q, align 4
39
39
; CHECK-NEXT: da analyze - confused!
40
40
; CHECK-NEXT: Src: store float 0.000000e+00, ptr %q, align 4 --> Dst: store float 0.000000e+00, ptr %q, align 4
41
- ; CHECK-NEXT: da analyze - output [*] !
41
+ ; CHECK-NEXT: da analyze - confused !
42
42
;
43
43
entry:
44
44
%g = alloca float , align 4
@@ -68,7 +68,7 @@ define void @bug53942_foo(i32 noundef %n, ptr noalias nocapture noundef writeonl
68
68
; CHECK-NEXT: Src: %.pre = load double, ptr %B, align 8 --> Dst: store double %.pre, ptr %arrayidx2, align 8
69
69
; CHECK-NEXT: da analyze - confused!
70
70
; CHECK-NEXT: Src: store double %.pre, ptr %arrayidx2, align 8 --> Dst: store double %.pre, ptr %arrayidx2, align 8
71
- ; CHECK-NEXT: da analyze - output [*] !
71
+ ; CHECK-NEXT: da analyze - confused !
72
72
;
73
73
entry:
74
74
%cmp8 = icmp sgt i32 %n , 1
@@ -99,11 +99,11 @@ for.body: ; preds = %for.body.preheader,
99
99
define void @bug53942_bar (i32 noundef %n , ptr noalias noundef %A , ptr noalias noundef %B ) {
100
100
; CHECK-LABEL: 'bug53942_bar'
101
101
; CHECK-NEXT: Src: %0 = load double, ptr %arrayidx, align 8 --> Dst: %0 = load double, ptr %arrayidx, align 8
102
- ; CHECK-NEXT: da analyze - input [*] !
102
+ ; CHECK-NEXT: da analyze - confused !
103
103
; CHECK-NEXT: Src: %0 = load double, ptr %arrayidx, align 8 --> Dst: store double %0, ptr %arrayidx8, align 8
104
104
; CHECK-NEXT: da analyze - confused!
105
105
; CHECK-NEXT: Src: store double %0, ptr %arrayidx8, align 8 --> Dst: store double %0, ptr %arrayidx8, align 8
106
- ; CHECK-NEXT: da analyze - output [*] !
106
+ ; CHECK-NEXT: da analyze - confused !
107
107
;
108
108
entry:
109
109
br label %for.cond
@@ -166,14 +166,14 @@ for.end: ; preds = %for.cond.cleanup
166
166
; (j % 2 == 0 ? A[i][j] : A[i][j+1]) = 1;
167
167
; }
168
168
;
169
- ; FIXME: There are loop-carried dependencies between the store instruction. For
169
+ ; There are loop-carried dependencies between the store instruction. For
170
170
; example, the value of %ptr0 when (i, j) = (0, 1) is %A+8, which is the same
171
171
; as when (i, j) = (0, 2).
172
172
173
173
define void @non_invariant_baseptr_with_identical_obj (ptr %A ) {
174
174
; CHECK-LABEL: 'non_invariant_baseptr_with_identical_obj'
175
175
; CHECK-NEXT: Src: store i32 1, ptr %idx, align 4 --> Dst: store i32 1, ptr %idx, align 4
176
- ; CHECK-NEXT: da analyze - none !
176
+ ; CHECK-NEXT: da analyze - confused !
177
177
;
178
178
entry:
179
179
br label %loop.i.header
@@ -216,13 +216,13 @@ exit:
216
216
; Similar to the above case, but ptr0 is loop-invariant with respsect to the
217
217
; k-loop.
218
218
;
219
- ; FIXME: Same as the above case, there are loop-carried dependencies between
220
- ; the store.
219
+ ; Same as the above case, there are loop-carried dependencies between the
220
+ ; store.
221
221
222
222
define void @non_invariant_baseptr_with_identical_obj2 (ptr %A ) {
223
223
; CHECK-LABEL: 'non_invariant_baseptr_with_identical_obj2'
224
224
; CHECK-NEXT: Src: store i32 1, ptr %idx, align 4 --> Dst: store i32 1, ptr %idx, align 4
225
- ; CHECK-NEXT: da analyze - none !
225
+ ; CHECK-NEXT: da analyze - confused !
226
226
;
227
227
entry:
228
228
br label %loop.i.header
@@ -259,3 +259,58 @@ loop.i.latch:
259
259
exit:
260
260
ret void
261
261
}
262
+
263
+ ; Pseudo-code that is approximately semantically equivalent to the below IR:
264
+ ;
265
+ ; void f(int A[][32]) {
266
+ ; for (int i = 0; i < 100; i++)
267
+ ; for (int j = 0; j < 15; j++) {
268
+ ; int offset = (j % 2 == 0) ? 1 : 0;
269
+ ; A[i][2 * j + offset + 0] = 1;
270
+ ; A[i][2 * j + offset + 1] = 1;
271
+ ; }
272
+ ; }
273
+ ;
274
+ ; There are loop-carried dependencies between the two stores. For example,
275
+ ; A[0][2] is accessed from both the former one when (i, j) = (0, 1) and the
276
+ ; latter one when (i, j) = (0, 0).
277
+ ;
278
+ define void @non_invariant_baseptr_with_identical_obj3 (ptr %A ) {
279
+ ; CHECK-LABEL: 'non_invariant_baseptr_with_identical_obj3'
280
+ ; CHECK-NEXT: Src: store i32 1, ptr %idx0, align 4 --> Dst: store i32 1, ptr %idx0, align 4
281
+ ; CHECK-NEXT: da analyze - confused!
282
+ ; CHECK-NEXT: Src: store i32 1, ptr %idx0, align 4 --> Dst: store i32 1, ptr %idx1, align 4
283
+ ; CHECK-NEXT: da analyze - confused!
284
+ ; CHECK-NEXT: Src: store i32 1, ptr %idx1, align 4 --> Dst: store i32 1, ptr %idx1, align 4
285
+ ; CHECK-NEXT: da analyze - confused!
286
+ ;
287
+ entry:
288
+ br label %loop.i.header
289
+
290
+ loop.i.header:
291
+ %i = phi i32 [ 0 , %entry ], [ %i.inc , %loop.i.latch ]
292
+ %A1 = getelementptr i32 , ptr %A , i32 1
293
+ br label %loop.j
294
+
295
+ loop.j:
296
+ %j = phi i32 [ 0 , %loop.i.header ], [ %j.inc , %loop.j ]
297
+ %ptr0 = phi ptr [ %A1 , %loop.i.header ], [ %ptr1 , %loop.j ]
298
+ %ptr1 = phi ptr [ %A , %loop.i.header ], [ %ptr0 , %loop.j ]
299
+ %j2_0 = shl i32 %j , 1
300
+ %j2_1 = add i32 %j2_0 , 1
301
+ %idx0 = getelementptr [32 x i32 ], ptr %ptr0 , i32 %i , i32 %j2_0
302
+ %idx1 = getelementptr [32 x i32 ], ptr %ptr0 , i32 %i , i32 %j2_1
303
+ store i32 1 , ptr %idx0
304
+ store i32 1 , ptr %idx1
305
+ %j.inc = add i32 %j , 1
306
+ %cmp.j = icmp slt i32 %j.inc , 15
307
+ br i1 %cmp.j , label %loop.j , label %loop.i.latch
308
+
309
+ loop.i.latch:
310
+ %i.inc = add i32 %i , 1
311
+ %cmp.i = icmp slt i32 %i.inc , 100
312
+ br i1 %cmp.i , label %loop.i.header , label %exit
313
+
314
+ exit:
315
+ ret void
316
+ }
0 commit comments