Skip to content

Commit e80ffc1

Browse files
committed
[DA] Add test where WeakCrossingSIV misses dependency due to overflow
1 parent 06b81a6 commit e80ffc1

File tree

1 file changed

+224
-0
lines changed

1 file changed

+224
-0
lines changed

llvm/test/Analysis/DependenceAnalysis/WeakCrossingSIV.ll

Lines changed: 224 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 5
22
; RUN: opt < %s -disable-output "-passes=print<da>" -aa-pipeline=basic-aa 2>&1 \
33
; RUN: | FileCheck %s
4+
; RUN: opt < %s -disable-output "-passes=print<da>" -da-run-siv-routines-only 2>&1 \
5+
; RUN: | FileCheck %s --check-prefix=CHECK-SIV-ONLY
46

57
; ModuleID = 'WeakCrossingSIV.bc'
68
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
@@ -26,6 +28,20 @@ define void @weakcrossing0(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {
2628
; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.02, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
2729
; CHECK-NEXT: da analyze - none!
2830
;
31+
; CHECK-SIV-ONLY-LABEL: 'weakcrossing0'
32+
; CHECK-SIV-ONLY-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
33+
; CHECK-SIV-ONLY-NEXT: da analyze - none!
34+
; CHECK-SIV-ONLY-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4
35+
; CHECK-SIV-ONLY-NEXT: da analyze - flow [0|<]!
36+
; CHECK-SIV-ONLY-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
37+
; CHECK-SIV-ONLY-NEXT: da analyze - confused!
38+
; CHECK-SIV-ONLY-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4
39+
; CHECK-SIV-ONLY-NEXT: da analyze - none!
40+
; CHECK-SIV-ONLY-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
41+
; CHECK-SIV-ONLY-NEXT: da analyze - confused!
42+
; CHECK-SIV-ONLY-NEXT: Src: store i32 %0, ptr %B.addr.02, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
43+
; CHECK-SIV-ONLY-NEXT: da analyze - none!
44+
;
2945
entry:
3046
%cmp1 = icmp eq i64 %n, 0
3147
br i1 %cmp1, label %for.end, label %for.body.preheader
@@ -79,6 +95,21 @@ define void @weakcrossing1(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {
7995
; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.02, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
8096
; CHECK-NEXT: da analyze - none!
8197
;
98+
; CHECK-SIV-ONLY-LABEL: 'weakcrossing1'
99+
; CHECK-SIV-ONLY-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
100+
; CHECK-SIV-ONLY-NEXT: da analyze - none!
101+
; CHECK-SIV-ONLY-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4
102+
; CHECK-SIV-ONLY-NEXT: da analyze - flow [<>] splitable!
103+
; CHECK-SIV-ONLY-NEXT: da analyze - split level = 1, iteration = 0!
104+
; CHECK-SIV-ONLY-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
105+
; CHECK-SIV-ONLY-NEXT: da analyze - confused!
106+
; CHECK-SIV-ONLY-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4
107+
; CHECK-SIV-ONLY-NEXT: da analyze - none!
108+
; CHECK-SIV-ONLY-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
109+
; CHECK-SIV-ONLY-NEXT: da analyze - confused!
110+
; CHECK-SIV-ONLY-NEXT: Src: store i32 %0, ptr %B.addr.02, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
111+
; CHECK-SIV-ONLY-NEXT: da analyze - none!
112+
;
82113
entry:
83114
%cmp1 = icmp eq i64 %n, 0
84115
br i1 %cmp1, label %for.end, label %for.body.preheader
@@ -130,6 +161,20 @@ define void @weakcrossing2(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {
130161
; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
131162
; CHECK-NEXT: da analyze - none!
132163
;
164+
; CHECK-SIV-ONLY-LABEL: 'weakcrossing2'
165+
; CHECK-SIV-ONLY-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
166+
; CHECK-SIV-ONLY-NEXT: da analyze - none!
167+
; CHECK-SIV-ONLY-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4
168+
; CHECK-SIV-ONLY-NEXT: da analyze - none!
169+
; CHECK-SIV-ONLY-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
170+
; CHECK-SIV-ONLY-NEXT: da analyze - confused!
171+
; CHECK-SIV-ONLY-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4
172+
; CHECK-SIV-ONLY-NEXT: da analyze - none!
173+
; CHECK-SIV-ONLY-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
174+
; CHECK-SIV-ONLY-NEXT: da analyze - confused!
175+
; CHECK-SIV-ONLY-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
176+
; CHECK-SIV-ONLY-NEXT: da analyze - none!
177+
;
133178
entry:
134179
br label %for.body
135180

@@ -172,6 +217,20 @@ define void @weakcrossing3(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {
172217
; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
173218
; CHECK-NEXT: da analyze - none!
174219
;
220+
; CHECK-SIV-ONLY-LABEL: 'weakcrossing3'
221+
; CHECK-SIV-ONLY-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
222+
; CHECK-SIV-ONLY-NEXT: da analyze - none!
223+
; CHECK-SIV-ONLY-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4
224+
; CHECK-SIV-ONLY-NEXT: da analyze - flow [0|<]!
225+
; CHECK-SIV-ONLY-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
226+
; CHECK-SIV-ONLY-NEXT: da analyze - confused!
227+
; CHECK-SIV-ONLY-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4
228+
; CHECK-SIV-ONLY-NEXT: da analyze - none!
229+
; CHECK-SIV-ONLY-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
230+
; CHECK-SIV-ONLY-NEXT: da analyze - confused!
231+
; CHECK-SIV-ONLY-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
232+
; CHECK-SIV-ONLY-NEXT: da analyze - none!
233+
;
175234
entry:
176235
br label %for.body
177236

@@ -214,6 +273,20 @@ define void @weakcrossing4(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {
214273
; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
215274
; CHECK-NEXT: da analyze - none!
216275
;
276+
; CHECK-SIV-ONLY-LABEL: 'weakcrossing4'
277+
; CHECK-SIV-ONLY-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
278+
; CHECK-SIV-ONLY-NEXT: da analyze - none!
279+
; CHECK-SIV-ONLY-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4
280+
; CHECK-SIV-ONLY-NEXT: da analyze - none!
281+
; CHECK-SIV-ONLY-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
282+
; CHECK-SIV-ONLY-NEXT: da analyze - confused!
283+
; CHECK-SIV-ONLY-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4
284+
; CHECK-SIV-ONLY-NEXT: da analyze - none!
285+
; CHECK-SIV-ONLY-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
286+
; CHECK-SIV-ONLY-NEXT: da analyze - confused!
287+
; CHECK-SIV-ONLY-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
288+
; CHECK-SIV-ONLY-NEXT: da analyze - none!
289+
;
217290
entry:
218291
br label %for.body
219292

@@ -256,6 +329,20 @@ define void @weakcrossing5(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {
256329
; CHECK-NEXT: Src: store i32 %1, ptr %B.addr.02, align 4 --> Dst: store i32 %1, ptr %B.addr.02, align 4
257330
; CHECK-NEXT: da analyze - none!
258331
;
332+
; CHECK-SIV-ONLY-LABEL: 'weakcrossing5'
333+
; CHECK-SIV-ONLY-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
334+
; CHECK-SIV-ONLY-NEXT: da analyze - none!
335+
; CHECK-SIV-ONLY-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %1 = load i32, ptr %arrayidx2, align 4
336+
; CHECK-SIV-ONLY-NEXT: da analyze - none!
337+
; CHECK-SIV-ONLY-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %1, ptr %B.addr.02, align 4
338+
; CHECK-SIV-ONLY-NEXT: da analyze - confused!
339+
; CHECK-SIV-ONLY-NEXT: Src: %1 = load i32, ptr %arrayidx2, align 4 --> Dst: %1 = load i32, ptr %arrayidx2, align 4
340+
; CHECK-SIV-ONLY-NEXT: da analyze - none!
341+
; CHECK-SIV-ONLY-NEXT: Src: %1 = load i32, ptr %arrayidx2, align 4 --> Dst: store i32 %1, ptr %B.addr.02, align 4
342+
; CHECK-SIV-ONLY-NEXT: da analyze - confused!
343+
; CHECK-SIV-ONLY-NEXT: Src: store i32 %1, ptr %B.addr.02, align 4 --> Dst: store i32 %1, ptr %B.addr.02, align 4
344+
; CHECK-SIV-ONLY-NEXT: da analyze - none!
345+
;
259346
entry:
260347
%cmp1 = icmp eq i64 %n, 0
261348
br i1 %cmp1, label %for.end, label %for.body.preheader
@@ -308,6 +395,21 @@ define void @weakcrossing6(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {
308395
; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
309396
; CHECK-NEXT: da analyze - none!
310397
;
398+
; CHECK-SIV-ONLY-LABEL: 'weakcrossing6'
399+
; CHECK-SIV-ONLY-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
400+
; CHECK-SIV-ONLY-NEXT: da analyze - none!
401+
; CHECK-SIV-ONLY-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4
402+
; CHECK-SIV-ONLY-NEXT: da analyze - flow [<>] splitable!
403+
; CHECK-SIV-ONLY-NEXT: da analyze - split level = 1, iteration = 2!
404+
; CHECK-SIV-ONLY-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
405+
; CHECK-SIV-ONLY-NEXT: da analyze - confused!
406+
; CHECK-SIV-ONLY-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4
407+
; CHECK-SIV-ONLY-NEXT: da analyze - none!
408+
; CHECK-SIV-ONLY-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
409+
; CHECK-SIV-ONLY-NEXT: da analyze - confused!
410+
; CHECK-SIV-ONLY-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
411+
; CHECK-SIV-ONLY-NEXT: da analyze - none!
412+
;
311413
entry:
312414
br label %for.body
313415

@@ -329,3 +431,125 @@ for.body: ; preds = %entry, %for.body
329431
for.end: ; preds = %for.body
330432
ret void
331433
}
434+
435+
;; max_i = INT64_MAX/3 // 3074457345618258602
436+
;; for (long long i = 0; i <= max_i; i++) {
437+
;; A[-3*i + INT64_MAX] = 0;
438+
;; if (i)
439+
;; A[3*i - 2] = 1;
440+
;; }
441+
;;
442+
;; FIXME: There is a loop-carried dependency between
443+
;; `A[-3*i + INT64_MAX]` and `A[3*i - 2]`. For example,
444+
;;
445+
;; memory location | -3*i + INT64_MAX | 3*i - 2
446+
;; ------------------|------------------|-----------
447+
;; A[1] | i = max_i | i = 1
448+
;; A[INT64_MAX - 3] | i = 1 | i = max_i
449+
;;
450+
;; Actually,
451+
;; * 1 = -3*max_i + INT64_MAX = 3*1 - 2
452+
;; * 9223372036854775804 = -3*1 + INT64_MAX = 3*max_i - 2
453+
;;
454+
455+
define void @weakcrossing7(ptr %A) {
456+
; CHECK-LABEL: 'weakcrossing7'
457+
; CHECK-NEXT: Src: store i8 0, ptr %idx.0, align 1 --> Dst: store i8 0, ptr %idx.0, align 1
458+
; CHECK-NEXT: da analyze - none!
459+
; CHECK-NEXT: Src: store i8 0, ptr %idx.0, align 1 --> Dst: store i8 1, ptr %idx.1, align 1
460+
; CHECK-NEXT: da analyze - none!
461+
; CHECK-NEXT: Src: store i8 1, ptr %idx.1, align 1 --> Dst: store i8 1, ptr %idx.1, align 1
462+
; CHECK-NEXT: da analyze - none!
463+
;
464+
; CHECK-SIV-ONLY-LABEL: 'weakcrossing7'
465+
; CHECK-SIV-ONLY-NEXT: Src: store i8 0, ptr %idx.0, align 1 --> Dst: store i8 0, ptr %idx.0, align 1
466+
; CHECK-SIV-ONLY-NEXT: da analyze - none!
467+
; CHECK-SIV-ONLY-NEXT: Src: store i8 0, ptr %idx.0, align 1 --> Dst: store i8 1, ptr %idx.1, align 1
468+
; CHECK-SIV-ONLY-NEXT: da analyze - none!
469+
; CHECK-SIV-ONLY-NEXT: Src: store i8 1, ptr %idx.1, align 1 --> Dst: store i8 1, ptr %idx.1, align 1
470+
; CHECK-SIV-ONLY-NEXT: da analyze - none!
471+
;
472+
entry:
473+
br label %loop.header
474+
475+
loop.header:
476+
%i = phi i64 [ 0, %entry ], [ %i.inc, %loop.latch ]
477+
%subscript.0 = phi i64 [ 9223372036854775807, %entry ], [ %subscript.0.next, %loop.latch ]
478+
%subscript.1 = phi i64 [ -2, %entry ], [ %subscript.1.next, %loop.latch ]
479+
%idx.0 = getelementptr inbounds i8, ptr %A, i64 %subscript.0
480+
store i8 0, ptr %idx.0
481+
%cond.store = icmp ne i64 %i, 0
482+
br i1 %cond.store, label %if.store, label %loop.latch
483+
484+
if.store:
485+
%idx.1 = getelementptr inbounds i8, ptr %A, i64 %subscript.1
486+
store i8 1, ptr %idx.1
487+
br label %loop.latch
488+
489+
loop.latch:
490+
%i.inc = add nuw nsw i64 %i, 1
491+
%subscript.0.next = add nsw i64 %subscript.0, -3
492+
%subscript.1.next = add nsw i64 %subscript.1, 3
493+
%exitcond = icmp sgt i64 %i.inc, 3074457345618258602
494+
br i1 %exitcond, label %exit, label %loop.header
495+
496+
exit:
497+
ret void
498+
}
499+
500+
;; A generalized version of @weakcrossing7.
501+
;;
502+
;; for (long long i = 0; i <= n / 3; i++) {
503+
;; A[-3*i + n] = 0;
504+
;; if (i)
505+
;; A[3*i - 2] = 1;
506+
;; }
507+
508+
define void @weakcrossing8(ptr %A, i64 %n) {
509+
; CHECK-LABEL: 'weakcrossing8'
510+
; CHECK-NEXT: Src: store i8 0, ptr %idx.0, align 1 --> Dst: store i8 0, ptr %idx.0, align 1
511+
; CHECK-NEXT: da analyze - none!
512+
; CHECK-NEXT: Src: store i8 0, ptr %idx.0, align 1 --> Dst: store i8 1, ptr %idx.1, align 1
513+
; CHECK-NEXT: da analyze - output [*|<] splitable!
514+
; CHECK-NEXT: da analyze - split level = 1, iteration = ((0 smax (2 + %n)) /u 6)!
515+
; CHECK-NEXT: Src: store i8 1, ptr %idx.1, align 1 --> Dst: store i8 1, ptr %idx.1, align 1
516+
; CHECK-NEXT: da analyze - none!
517+
;
518+
; CHECK-SIV-ONLY-LABEL: 'weakcrossing8'
519+
; CHECK-SIV-ONLY-NEXT: Src: store i8 0, ptr %idx.0, align 1 --> Dst: store i8 0, ptr %idx.0, align 1
520+
; CHECK-SIV-ONLY-NEXT: da analyze - none!
521+
; CHECK-SIV-ONLY-NEXT: Src: store i8 0, ptr %idx.0, align 1 --> Dst: store i8 1, ptr %idx.1, align 1
522+
; CHECK-SIV-ONLY-NEXT: da analyze - output [*|<] splitable!
523+
; CHECK-SIV-ONLY-NEXT: da analyze - split level = 1, iteration = ((0 smax (2 + %n)) /u 6)!
524+
; CHECK-SIV-ONLY-NEXT: Src: store i8 1, ptr %idx.1, align 1 --> Dst: store i8 1, ptr %idx.1, align 1
525+
; CHECK-SIV-ONLY-NEXT: da analyze - none!
526+
;
527+
entry:
528+
%bound = sdiv i64 %n, 3
529+
%guard = icmp sgt i64 %n, 0
530+
br i1 %guard, label %loop.header, label %exit
531+
532+
loop.header:
533+
%i = phi i64 [ 0, %entry ], [ %i.inc, %loop.latch ]
534+
%subscript.0 = phi i64 [ %n, %entry ], [ %subscript.0.next, %loop.latch ]
535+
%subscript.1 = phi i64 [ -2, %entry ], [ %subscript.1.next, %loop.latch ]
536+
%idx.0 = getelementptr inbounds i8, ptr %A, i64 %subscript.0
537+
store i8 0, ptr %idx.0
538+
%cond.store = icmp ne i64 %i, 0
539+
br i1 %cond.store, label %if.store, label %loop.latch
540+
541+
if.store:
542+
%idx.1 = getelementptr inbounds i8, ptr %A, i64 %subscript.1
543+
store i8 1, ptr %idx.1
544+
br label %loop.latch
545+
546+
loop.latch:
547+
%i.inc = add nuw nsw i64 %i, 1
548+
%subscript.0.next = add nsw i64 %subscript.0, -3
549+
%subscript.1.next = add nsw i64 %subscript.1, 3
550+
%exitcond = icmp sgt i64 %i.inc, %bound
551+
br i1 %exitcond, label %exit, label %loop.header
552+
553+
exit:
554+
ret void
555+
}

0 commit comments

Comments
 (0)