1*46f9cddfSSebastian Pop; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 5 2c9677f6dSBardia Mahjour; RUN: opt < %s -disable-output "-passes=print<da>" -aa-pipeline=basic-aa 2>&1 | FileCheck %s 3c9677f6dSBardia Mahjour 4c9677f6dSBardia Mahjour;; void test1(long n, double *A) { 5c9677f6dSBardia Mahjour;; long i; 6c9677f6dSBardia Mahjour;; for (i = 0; i*n <= n*n; ++i) { 7c9677f6dSBardia Mahjour;; A[i] = i; 8c9677f6dSBardia Mahjour;; } 9c9677f6dSBardia Mahjour;; A[i] = i; 10c9677f6dSBardia Mahjour;; } 11c9677f6dSBardia Mahjour 12c9677f6dSBardia Mahjourdefine void @test1(i64 noundef %n, ptr nocapture noundef writeonly %A) { 13*46f9cddfSSebastian Pop; CHECK-LABEL: 'test1' 14*46f9cddfSSebastian Pop; CHECK-NEXT: Src: store double %conv, ptr %arrayidx, align 8 --> Dst: store double %conv, ptr %arrayidx, align 8 15*46f9cddfSSebastian Pop; CHECK-NEXT: da analyze - none! 16*46f9cddfSSebastian Pop; CHECK-NEXT: Src: store double %conv, ptr %arrayidx, align 8 --> Dst: store double %conv2, ptr %arrayidx3, align 8 17*46f9cddfSSebastian Pop; CHECK-NEXT: da analyze - output [|<]! 18*46f9cddfSSebastian Pop; CHECK-NEXT: Src: store double %conv2, ptr %arrayidx3, align 8 --> Dst: store double %conv2, ptr %arrayidx3, align 8 19*46f9cddfSSebastian Pop; CHECK-NEXT: da analyze - none! 20*46f9cddfSSebastian Pop; 21c9677f6dSBardia Mahjourentry: 22c9677f6dSBardia Mahjour %mul1 = mul nsw i64 %n, %n 23c9677f6dSBardia Mahjour br label %for.body 24c9677f6dSBardia Mahjour 25c9677f6dSBardia Mahjourfor.body: ; preds = %entry, %for.body 26c9677f6dSBardia Mahjour %i.012 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 27c9677f6dSBardia Mahjour %conv = sitofp i64 %i.012 to double 28c9677f6dSBardia Mahjour %arrayidx = getelementptr inbounds double, ptr %A, i64 %i.012 29c9677f6dSBardia Mahjour store double %conv, ptr %arrayidx, align 8 30c9677f6dSBardia Mahjour %inc = add nuw nsw i64 %i.012, 1 31c9677f6dSBardia Mahjour %mul = mul nsw i64 %inc, %n 32c9677f6dSBardia Mahjour %cmp.not = icmp sgt i64 %mul, %mul1 33c9677f6dSBardia Mahjour br i1 %cmp.not, label %for.end, label %for.body 34c9677f6dSBardia Mahjour 35c9677f6dSBardia Mahjourfor.end: ; preds = %for.body 36c9677f6dSBardia Mahjour %conv2 = sitofp i64 %inc to double 37c9677f6dSBardia Mahjour %arrayidx3 = getelementptr inbounds double, ptr %A, i64 %inc 38c9677f6dSBardia Mahjour store double %conv2, ptr %arrayidx3, align 8 39c9677f6dSBardia Mahjour ret void 40c9677f6dSBardia Mahjour} 41c9677f6dSBardia Mahjour 42c9677f6dSBardia Mahjour 43c9677f6dSBardia Mahjour;; int test2(unsigned n, float A[][n+1], float B[n+1]) { 44c9677f6dSBardia Mahjour;; for (int i = 0; i <= n; i++) { 45c9677f6dSBardia Mahjour;; long j = 0; 46c9677f6dSBardia Mahjour;; for (; j <= n; ++j) { 47c9677f6dSBardia Mahjour;; B[j] = j; 48c9677f6dSBardia Mahjour;; } 49c9677f6dSBardia Mahjour;; A[i][j] = 123; 50c9677f6dSBardia Mahjour;; for (int k = 0; k <= n; k++) { 51c9677f6dSBardia Mahjour;; A[i][k] = k; 52c9677f6dSBardia Mahjour;; } 53c9677f6dSBardia Mahjour;; } 54c9677f6dSBardia Mahjour;; 55c9677f6dSBardia Mahjour;; Make sure we can detect depnendence between A[i][j] and A[i][k] conservatively and without crashing. 56c9677f6dSBardia Mahjour 57c9677f6dSBardia Mahjourdefine dso_local void @test2(i32 noundef zeroext %n, ptr noundef %A, ptr noalias noundef %B) #0 { 58*46f9cddfSSebastian Pop; CHECK-LABEL: 'test2' 59*46f9cddfSSebastian Pop; CHECK-NEXT: Src: store i32 %conv5, ptr %arrayidx, align 4 --> Dst: store i32 %conv5, ptr %arrayidx, align 4 60*46f9cddfSSebastian Pop; CHECK-NEXT: da analyze - consistent output [S 0]! 61*46f9cddfSSebastian Pop; CHECK-NEXT: Src: store i32 %conv5, ptr %arrayidx, align 4 --> Dst: store float 1.230000e+02, ptr %arrayidx7, align 4 62*46f9cddfSSebastian Pop; CHECK-NEXT: da analyze - none! 63*46f9cddfSSebastian Pop; CHECK-NEXT: Src: store i32 %conv5, ptr %arrayidx, align 4 --> Dst: store float %conv13, ptr %arrayidx17, align 4 64*46f9cddfSSebastian Pop; CHECK-NEXT: da analyze - none! 65*46f9cddfSSebastian Pop; CHECK-NEXT: Src: store float 1.230000e+02, ptr %arrayidx7, align 4 --> Dst: store float 1.230000e+02, ptr %arrayidx7, align 4 66*46f9cddfSSebastian Pop; CHECK-NEXT: da analyze - output [*]! 67*46f9cddfSSebastian Pop; CHECK-NEXT: Src: store float 1.230000e+02, ptr %arrayidx7, align 4 --> Dst: store float %conv13, ptr %arrayidx17, align 4 68*46f9cddfSSebastian Pop; CHECK-NEXT: da analyze - output [*|<]! 69*46f9cddfSSebastian Pop; CHECK-NEXT: Src: store float %conv13, ptr %arrayidx17, align 4 --> Dst: store float %conv13, ptr %arrayidx17, align 4 70*46f9cddfSSebastian Pop; CHECK-NEXT: da analyze - none! 71*46f9cddfSSebastian Pop; 72c9677f6dSBardia Mahjourentry: 73c9677f6dSBardia Mahjour %add = add i32 %n, 1 74c9677f6dSBardia Mahjour %0 = zext i32 %add to i64 75c9677f6dSBardia Mahjour %1 = zext i32 %n to i64 76c9677f6dSBardia Mahjour %2 = add nuw nsw i64 %1, 1 77c9677f6dSBardia Mahjour %wide.trip.count9 = zext i32 %add to i64 78c9677f6dSBardia Mahjour br label %for.i 79c9677f6dSBardia Mahjour 80c9677f6dSBardia Mahjourfor.i: ; preds = %entry, %for.inc21 81c9677f6dSBardia Mahjour %indvars.iv6 = phi i64 [ 0, %entry ], [ %indvars.iv.next7, %for.inc21 ] 82c9677f6dSBardia Mahjour br label %for.j 83c9677f6dSBardia Mahjour 84c9677f6dSBardia Mahjourfor.j: ; preds = %for.i, %for.j 85c9677f6dSBardia Mahjour %j.01 = phi i64 [ 0, %for.i ], [ %inc, %for.j ] 86c9677f6dSBardia Mahjour %conv5 = trunc i64 %j.01 to i32 87c9677f6dSBardia Mahjour %arrayidx = getelementptr inbounds i32, ptr %B, i64 %j.01 88c9677f6dSBardia Mahjour store i32 %conv5, ptr %arrayidx, align 4 89c9677f6dSBardia Mahjour %inc = add nuw nsw i64 %j.01, 1 90c9677f6dSBardia Mahjour %exitcond = icmp ne i64 %inc, %2 91c9677f6dSBardia Mahjour br i1 %exitcond, label %for.j, label %for.end 92c9677f6dSBardia Mahjour 93c9677f6dSBardia Mahjourfor.end: ; preds = %for.j 94c9677f6dSBardia Mahjour %inc.lcssa = phi i64 [ %inc, %for.j ] 95c9677f6dSBardia Mahjour %3 = mul nuw nsw i64 %indvars.iv6, %0 96c9677f6dSBardia Mahjour %arrayidx6 = getelementptr inbounds float, ptr %A, i64 %3 97c9677f6dSBardia Mahjour %arrayidx7 = getelementptr inbounds float, ptr %arrayidx6, i64 %inc.lcssa 98c9677f6dSBardia Mahjour store float 1.230000e+02, ptr %arrayidx7, align 4 99c9677f6dSBardia Mahjour %wide.trip.count = zext i32 %add to i64 100c9677f6dSBardia Mahjour br label %for.k 101c9677f6dSBardia Mahjour 102c9677f6dSBardia Mahjourfor.k: ; preds = %for.end, %for.k 103c9677f6dSBardia Mahjour %indvars.iv = phi i64 [ 0, %for.end ], [ %indvars.iv.next, %for.k ] 104c9677f6dSBardia Mahjour %4 = trunc i64 %indvars.iv to i32 105c9677f6dSBardia Mahjour %conv13 = sitofp i32 %4 to float 106c9677f6dSBardia Mahjour %5 = mul nuw nsw i64 %indvars.iv6, %0 107c9677f6dSBardia Mahjour %arrayidx15 = getelementptr inbounds float, ptr %A, i64 %5 108c9677f6dSBardia Mahjour %arrayidx17 = getelementptr inbounds float, ptr %arrayidx15, i64 %indvars.iv 109c9677f6dSBardia Mahjour store float %conv13, ptr %arrayidx17, align 4 110c9677f6dSBardia Mahjour %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 111c9677f6dSBardia Mahjour %exitcond5 = icmp ne i64 %indvars.iv.next, %wide.trip.count 112c9677f6dSBardia Mahjour br i1 %exitcond5, label %for.k, label %for.inc21 113c9677f6dSBardia Mahjour 114c9677f6dSBardia Mahjourfor.inc21: ; preds = %for.k 115c9677f6dSBardia Mahjour %indvars.iv.next7 = add nuw nsw i64 %indvars.iv6, 1 116c9677f6dSBardia Mahjour %exitcond10 = icmp ne i64 %indvars.iv.next7, %wide.trip.count9 117c9677f6dSBardia Mahjour br i1 %exitcond10, label %for.i, label %for.end23 118c9677f6dSBardia Mahjour 119c9677f6dSBardia Mahjourfor.end23: ; preds = %for.inc21 120c9677f6dSBardia Mahjour ret void 121c9677f6dSBardia Mahjour} 122c9677f6dSBardia Mahjour 123c9677f6dSBardia Mahjour 124c9677f6dSBardia Mahjour;; void test3(int n, double *restrict A, double *restrict B) { 125c9677f6dSBardia Mahjour;; for (int i = 0; i < n; ++i) { 126c9677f6dSBardia Mahjour;; int s = 0; 127c9677f6dSBardia Mahjour;; for (; s * s < n * n; ++s) { 128c9677f6dSBardia Mahjour;; } 129c9677f6dSBardia Mahjour;; for (int k = 0; k < n; ++k) 130c9677f6dSBardia Mahjour;; A[s] = 0; // Invariant in innermost loop 131c9677f6dSBardia Mahjour;; 132c9677f6dSBardia Mahjour;; A[i] = 1; 133c9677f6dSBardia Mahjour;; } 134c9677f6dSBardia Mahjour;; } 135c9677f6dSBardia Mahjour;; 136c9677f6dSBardia Mahjour;; Make sure we can detect depnendence between A[i] and A[s] conservatively and without crashing. 137c9677f6dSBardia Mahjour 138c9677f6dSBardia Mahjourdefine void @test3(i32 noundef %n, ptr noalias noundef %A, ptr noalias noundef %B) { 139*46f9cddfSSebastian Pop; CHECK-LABEL: 'test3' 140*46f9cddfSSebastian Pop; CHECK-NEXT: Src: store double 0.000000e+00, ptr %arrayidx, align 8 --> Dst: store double 0.000000e+00, ptr %arrayidx, align 8 141*46f9cddfSSebastian Pop; CHECK-NEXT: da analyze - output [* S]! 142*46f9cddfSSebastian Pop; CHECK-NEXT: Src: store double 0.000000e+00, ptr %arrayidx, align 8 --> Dst: store double 1.000000e+00, ptr %arrayidx21, align 8 143*46f9cddfSSebastian Pop; CHECK-NEXT: da analyze - output [*|<]! 144*46f9cddfSSebastian Pop; CHECK-NEXT: Src: store double 1.000000e+00, ptr %arrayidx21, align 8 --> Dst: store double 1.000000e+00, ptr %arrayidx21, align 8 145*46f9cddfSSebastian Pop; CHECK-NEXT: da analyze - none! 146*46f9cddfSSebastian Pop; 147c9677f6dSBardia Mahjourentry: 148c9677f6dSBardia Mahjour br label %for.i 149c9677f6dSBardia Mahjour 150c9677f6dSBardia Mahjourfor.i: ; preds = %for.end19, %entry 151c9677f6dSBardia Mahjour %i.0 = phi i32 [ 0, %entry ], [ %inc23, %for.end19 ] 152c9677f6dSBardia Mahjour %cmp = icmp slt i32 %i.0, %n 153c9677f6dSBardia Mahjour br i1 %cmp, label %for.s, label %for.end24 154c9677f6dSBardia Mahjour 155c9677f6dSBardia Mahjourfor.s: ; preds = %for.i, %for.inc 156c9677f6dSBardia Mahjour %s.0 = phi i32 [ %inc, %for.inc ], [ 0, %for.i ] 157c9677f6dSBardia Mahjour %mul = mul nsw i32 %s.0, %s.0 158c9677f6dSBardia Mahjour %mul2 = mul nsw i32 %n, %n 159c9677f6dSBardia Mahjour %cmp3 = icmp slt i32 %mul, %mul2 160c9677f6dSBardia Mahjour br i1 %cmp3, label %for.inc, label %for.k 161c9677f6dSBardia Mahjour 162c9677f6dSBardia Mahjourfor.inc: ; preds = %for.s 163c9677f6dSBardia Mahjour %inc = add nsw i32 %s.0, 1 164c9677f6dSBardia Mahjour br label %for.s 165c9677f6dSBardia Mahjour 166c9677f6dSBardia Mahjourfor.k: ; preds = %for.s, %for.body.k 167c9677f6dSBardia Mahjour %k.0 = phi i32 [ %inc10, %for.body.k ], [ 0, %for.s ] 168c9677f6dSBardia Mahjour %cmp6 = icmp slt i32 %k.0, %n 169c9677f6dSBardia Mahjour br i1 %cmp6, label %for.body.k, label %for.end19 170c9677f6dSBardia Mahjour 171c9677f6dSBardia Mahjourfor.body.k: ; preds = %for.k 172c9677f6dSBardia Mahjour %idxprom = sext i32 %s.0 to i64 173c9677f6dSBardia Mahjour %arrayidx = getelementptr inbounds double, ptr %A, i64 %idxprom 174c9677f6dSBardia Mahjour store double 0.000000e+00, ptr %arrayidx, align 8 175c9677f6dSBardia Mahjour %inc10 = add nsw i32 %k.0, 1 176c9677f6dSBardia Mahjour br label %for.k 177c9677f6dSBardia Mahjour 178c9677f6dSBardia Mahjourfor.end19: ; preds = %for.k 179c9677f6dSBardia Mahjour %idxprom20 = sext i32 %i.0 to i64 180c9677f6dSBardia Mahjour %arrayidx21 = getelementptr inbounds double, ptr %A, i64 %idxprom20 181c9677f6dSBardia Mahjour store double 1.000000e+00, ptr %arrayidx21, align 8 182c9677f6dSBardia Mahjour %inc23 = add nsw i32 %i.0, 1 183c9677f6dSBardia Mahjour br label %for.i 184c9677f6dSBardia Mahjour 185c9677f6dSBardia Mahjourfor.end24: ; preds = %for.i 186c9677f6dSBardia Mahjour ret void 187c9677f6dSBardia Mahjour} 188