@@ -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