125 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 62; RUN: opt < %s -disable-output "-passes=print<da>" 2>&1 | FileCheck %s3; RUN: opt < %s -disable-output "-passes=print<da>" -da-enable-dependence-test=exact-siv 2>&1 \4; RUN: | FileCheck %s --check-prefix=CHECK-EXACT-SIV5 6;; max_i = INT64_MAX/6 // 15372286728091293017;; for (long long i = 0; i <= max_i; i++) {8;; A[-6*i + INT64_MAX] = 0;9;; if (i)10;; A[3*i - 2] = 1;11;; }12;;13;; FIXME: DependencyAnalsysis currently detects no dependency between14;; `A[-6*i + INT64_MAX]` and `A[3*i - 2]`, but it does exist. For example,15;;16;; | memory location | -6*i + INT64_MAX | 3*i - 217;; |------------------------|------------------------|-----------18;; | A[1] | i = max_i | i = 119;; | A[4611686018427387901] | i = 768614336404564651 | i = max_i20;;21;; Actually,22;; * 1 = -6*max_i + INT64_MAX = 3*1 - 223;; * 4611686018427387901 = -6*768614336404564651 + INT64_MAX = 3*max_i - 224;;25 26define void @exactsiv_const_ovfl(ptr %A) {27; CHECK-LABEL: 'exactsiv_const_ovfl'28; CHECK-NEXT: Src: store i8 0, ptr %idx.0, align 1 --> Dst: store i8 0, ptr %idx.0, align 129; CHECK-NEXT: da analyze - none!30; CHECK-NEXT: Src: store i8 0, ptr %idx.0, align 1 --> Dst: store i8 1, ptr %idx.1, align 131; CHECK-NEXT: da analyze - none!32; CHECK-NEXT: Src: store i8 1, ptr %idx.1, align 1 --> Dst: store i8 1, ptr %idx.1, align 133; CHECK-NEXT: da analyze - none!34;35; CHECK-EXACT-SIV-LABEL: 'exactsiv_const_ovfl'36; CHECK-EXACT-SIV-NEXT: Src: store i8 0, ptr %idx.0, align 1 --> Dst: store i8 0, ptr %idx.0, align 137; CHECK-EXACT-SIV-NEXT: da analyze - consistent output [*]!38; CHECK-EXACT-SIV-NEXT: Src: store i8 0, ptr %idx.0, align 1 --> Dst: store i8 1, ptr %idx.1, align 139; CHECK-EXACT-SIV-NEXT: da analyze - output [*|<]!40; CHECK-EXACT-SIV-NEXT: Src: store i8 1, ptr %idx.1, align 1 --> Dst: store i8 1, ptr %idx.1, align 141; CHECK-EXACT-SIV-NEXT: da analyze - consistent output [*]!42;43entry:44 br label %loop.header45 46loop.header:47 %i = phi i64 [ 0, %entry ], [ %i.inc, %loop.latch ]48 %subscript.0 = phi i64 [ 9223372036854775807, %entry ], [ %subscript.0.next, %loop.latch ]49 %subscript.1 = phi i64 [ -2, %entry ], [ %subscript.1.next, %loop.latch ]50 %idx.0 = getelementptr inbounds i8, ptr %A, i64 %subscript.051 store i8 0, ptr %idx.052 %cond.store = icmp ne i64 %i, 053 br i1 %cond.store, label %if.store, label %loop.latch54 55if.store:56 %idx.1 = getelementptr inbounds i8, ptr %A, i64 %subscript.157 store i8 1, ptr %idx.158 br label %loop.latch59 60loop.latch:61 %i.inc = add nuw nsw i64 %i, 162 %subscript.0.next = add nsw i64 %subscript.0, -663 %subscript.1.next = add nsw i64 %subscript.1, 364 %exitcond = icmp sgt i64 %i.inc, 153722867280912930165 br i1 %exitcond, label %exit, label %loop.header66 67exit:68 ret void69}70 71;; A generalized version of the above case.72;;73;; for (long long i = 0; i <= n / 6; i++) {74;; A[-6*i + n] = 0;75;; if (i)76;; A[3*i - 2] = 1;77;; }78 79define void @exactsiv_param_ovfl(ptr %A, i64 %n) {80; CHECK-LABEL: 'exactsiv_param_ovfl'81; CHECK-NEXT: Src: store i8 0, ptr %idx.0, align 1 --> Dst: store i8 0, ptr %idx.0, align 182; CHECK-NEXT: da analyze - none!83; CHECK-NEXT: Src: store i8 0, ptr %idx.0, align 1 --> Dst: store i8 1, ptr %idx.1, align 184; CHECK-NEXT: da analyze - output [*|<]!85; CHECK-NEXT: Src: store i8 1, ptr %idx.1, align 1 --> Dst: store i8 1, ptr %idx.1, align 186; CHECK-NEXT: da analyze - none!87;88; CHECK-EXACT-SIV-LABEL: 'exactsiv_param_ovfl'89; CHECK-EXACT-SIV-NEXT: Src: store i8 0, ptr %idx.0, align 1 --> Dst: store i8 0, ptr %idx.0, align 190; CHECK-EXACT-SIV-NEXT: da analyze - consistent output [*]!91; CHECK-EXACT-SIV-NEXT: Src: store i8 0, ptr %idx.0, align 1 --> Dst: store i8 1, ptr %idx.1, align 192; CHECK-EXACT-SIV-NEXT: da analyze - output [*|<]!93; CHECK-EXACT-SIV-NEXT: Src: store i8 1, ptr %idx.1, align 1 --> Dst: store i8 1, ptr %idx.1, align 194; CHECK-EXACT-SIV-NEXT: da analyze - consistent output [*]!95;96entry:97 %bound = sdiv i64 %n, 698 %guard = icmp sgt i64 %n, 099 br i1 %guard, label %loop.header, label %exit100 101loop.header:102 %i = phi i64 [ 0, %entry ], [ %i.inc, %loop.latch ]103 %subscript.0 = phi i64 [ %n, %entry ], [ %subscript.0.next, %loop.latch ]104 %subscript.1 = phi i64 [ -2, %entry ], [ %subscript.1.next, %loop.latch ]105 %idx.0 = getelementptr inbounds i8, ptr %A, i64 %subscript.0106 store i8 0, ptr %idx.0107 %cond.store = icmp ne i64 %i, 0108 br i1 %cond.store, label %if.store, label %loop.latch109 110if.store:111 %idx.1 = getelementptr inbounds i8, ptr %A, i64 %subscript.1112 store i8 1, ptr %idx.1113 br label %loop.latch114 115loop.latch:116 %i.inc = add nuw nsw i64 %i, 1117 %subscript.0.next = add nsw i64 %subscript.0, -6118 %subscript.1.next = add nsw i64 %subscript.1, 3119 %exitcond = icmp sgt i64 %i.inc, %bound120 br i1 %exitcond, label %exit, label %loop.header121 122exit:123 ret void124}125