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'
68target 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+ ;
2945entry:
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+ ;
82113entry:
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+ ;
133178entry:
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+ ;
175234entry:
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+ ;
217290entry:
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+ ;
259346entry:
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+ ;
311413entry:
312414 br label %for.body
313415
@@ -329,3 +431,125 @@ for.body: ; preds = %entry, %for.body
329431for.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