1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -analyze -basicaa -da | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker; ModuleID = 'WeakZeroSrcSIV.bc' 4*9880d681SAndroid Build Coastguard Workertarget 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" 5*9880d681SAndroid Build Coastguard Workertarget triple = "x86_64-apple-macosx10.6.0" 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Worker;; for (long unsigned i = 0; i < 30; i++) { 9*9880d681SAndroid Build Coastguard Worker;; A[10] = i; 10*9880d681SAndroid Build Coastguard Worker;; *B++ = A[2*i + 10]; 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Workerdefine void @weakzerosrc0(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { 13*9880d681SAndroid Build Coastguard Workerentry: 14*9880d681SAndroid Build Coastguard Worker br label %for.body 15*9880d681SAndroid Build Coastguard Worker 16*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - consistent output [S]! 17*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - flow [p<=|<]! 18*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - confused! 19*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - none! 20*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - confused! 21*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - none! 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = %entry, %for.body 24*9880d681SAndroid Build Coastguard Worker %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 25*9880d681SAndroid Build Coastguard Worker %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] 26*9880d681SAndroid Build Coastguard Worker %conv = trunc i64 %i.02 to i32 27*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i32, i32* %A, i64 10 28*9880d681SAndroid Build Coastguard Worker store i32 %conv, i32* %arrayidx, align 4 29*9880d681SAndroid Build Coastguard Worker %mul = shl i64 %i.02, 1 30*9880d681SAndroid Build Coastguard Worker %add = add i64 %mul, 10 31*9880d681SAndroid Build Coastguard Worker %arrayidx1 = getelementptr inbounds i32, i32* %A, i64 %add 32*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %arrayidx1, align 4 33*9880d681SAndroid Build Coastguard Worker %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1 34*9880d681SAndroid Build Coastguard Worker store i32 %0, i32* %B.addr.01, align 4 35*9880d681SAndroid Build Coastguard Worker %inc = add i64 %i.02, 1 36*9880d681SAndroid Build Coastguard Worker %exitcond = icmp ne i64 %inc, 30 37*9880d681SAndroid Build Coastguard Worker br i1 %exitcond, label %for.body, label %for.end 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Workerfor.end: ; preds = %for.body 40*9880d681SAndroid Build Coastguard Worker ret void 41*9880d681SAndroid Build Coastguard Worker} 42*9880d681SAndroid Build Coastguard Worker 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Worker;; for (long unsigned i = 0; i < n; i++) { 45*9880d681SAndroid Build Coastguard Worker;; A[10] = i; 46*9880d681SAndroid Build Coastguard Worker;; *B++ = A[n*i + 10]; 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Workerdefine void @weakzerosrc1(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { 49*9880d681SAndroid Build Coastguard Workerentry: 50*9880d681SAndroid Build Coastguard Worker %cmp1 = icmp eq i64 %n, 0 51*9880d681SAndroid Build Coastguard Worker br i1 %cmp1, label %for.end, label %for.body.preheader 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - consistent output [S]! 54*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - flow [p<=|<]! 55*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - confused! 56*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - none! 57*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - confused! 58*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - none! 59*9880d681SAndroid Build Coastguard Worker 60*9880d681SAndroid Build Coastguard Workerfor.body.preheader: ; preds = %entry 61*9880d681SAndroid Build Coastguard Worker br label %for.body 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = %for.body.preheader, %for.body 64*9880d681SAndroid Build Coastguard Worker %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ] 65*9880d681SAndroid Build Coastguard Worker %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ] 66*9880d681SAndroid Build Coastguard Worker %conv = trunc i64 %i.03 to i32 67*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i32, i32* %A, i64 10 68*9880d681SAndroid Build Coastguard Worker store i32 %conv, i32* %arrayidx, align 4 69*9880d681SAndroid Build Coastguard Worker %mul = mul i64 %i.03, %n 70*9880d681SAndroid Build Coastguard Worker %add = add i64 %mul, 10 71*9880d681SAndroid Build Coastguard Worker %arrayidx1 = getelementptr inbounds i32, i32* %A, i64 %add 72*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %arrayidx1, align 4 73*9880d681SAndroid Build Coastguard Worker %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.02, i64 1 74*9880d681SAndroid Build Coastguard Worker store i32 %0, i32* %B.addr.02, align 4 75*9880d681SAndroid Build Coastguard Worker %inc = add i64 %i.03, 1 76*9880d681SAndroid Build Coastguard Worker %exitcond = icmp ne i64 %inc, %n 77*9880d681SAndroid Build Coastguard Worker br i1 %exitcond, label %for.body, label %for.end.loopexit 78*9880d681SAndroid Build Coastguard Worker 79*9880d681SAndroid Build Coastguard Workerfor.end.loopexit: ; preds = %for.body 80*9880d681SAndroid Build Coastguard Worker br label %for.end 81*9880d681SAndroid Build Coastguard Worker 82*9880d681SAndroid Build Coastguard Workerfor.end: ; preds = %for.end.loopexit, %entry 83*9880d681SAndroid Build Coastguard Worker ret void 84*9880d681SAndroid Build Coastguard Worker} 85*9880d681SAndroid Build Coastguard Worker 86*9880d681SAndroid Build Coastguard Worker 87*9880d681SAndroid Build Coastguard Worker;; for (long unsigned i = 0; i < 5; i++) { 88*9880d681SAndroid Build Coastguard Worker;; A[10] = i; 89*9880d681SAndroid Build Coastguard Worker;; *B++ = A[2*i]; 90*9880d681SAndroid Build Coastguard Worker 91*9880d681SAndroid Build Coastguard Workerdefine void @weakzerosrc2(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { 92*9880d681SAndroid Build Coastguard Workerentry: 93*9880d681SAndroid Build Coastguard Worker br label %for.body 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - consistent output [S]! 96*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - none! 97*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - confused! 98*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - none! 99*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - confused! 100*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - none! 101*9880d681SAndroid Build Coastguard Worker 102*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = %entry, %for.body 103*9880d681SAndroid Build Coastguard Worker %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 104*9880d681SAndroid Build Coastguard Worker %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] 105*9880d681SAndroid Build Coastguard Worker %conv = trunc i64 %i.02 to i32 106*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i32, i32* %A, i64 10 107*9880d681SAndroid Build Coastguard Worker store i32 %conv, i32* %arrayidx, align 4 108*9880d681SAndroid Build Coastguard Worker %mul = shl i64 %i.02, 1 109*9880d681SAndroid Build Coastguard Worker %arrayidx1 = getelementptr inbounds i32, i32* %A, i64 %mul 110*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %arrayidx1, align 4 111*9880d681SAndroid Build Coastguard Worker %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1 112*9880d681SAndroid Build Coastguard Worker store i32 %0, i32* %B.addr.01, align 4 113*9880d681SAndroid Build Coastguard Worker %inc = add i64 %i.02, 1 114*9880d681SAndroid Build Coastguard Worker %exitcond = icmp ne i64 %inc, 5 115*9880d681SAndroid Build Coastguard Worker br i1 %exitcond, label %for.body, label %for.end 116*9880d681SAndroid Build Coastguard Worker 117*9880d681SAndroid Build Coastguard Workerfor.end: ; preds = %for.body 118*9880d681SAndroid Build Coastguard Worker ret void 119*9880d681SAndroid Build Coastguard Worker} 120*9880d681SAndroid Build Coastguard Worker 121*9880d681SAndroid Build Coastguard Worker 122*9880d681SAndroid Build Coastguard Worker;; for (long unsigned i = 0; i < 6; i++) { 123*9880d681SAndroid Build Coastguard Worker;; A[10] = i; 124*9880d681SAndroid Build Coastguard Worker;; *B++ = A[2*i]; 125*9880d681SAndroid Build Coastguard Worker 126*9880d681SAndroid Build Coastguard Workerdefine void @weakzerosrc3(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { 127*9880d681SAndroid Build Coastguard Workerentry: 128*9880d681SAndroid Build Coastguard Worker br label %for.body 129*9880d681SAndroid Build Coastguard Worker 130*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - consistent output [S]! 131*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - flow [=>p|<]! 132*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - confused! 133*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - none! 134*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - confused! 135*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - none! 136*9880d681SAndroid Build Coastguard Worker 137*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = %entry, %for.body 138*9880d681SAndroid Build Coastguard Worker %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 139*9880d681SAndroid Build Coastguard Worker %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] 140*9880d681SAndroid Build Coastguard Worker %conv = trunc i64 %i.02 to i32 141*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i32, i32* %A, i64 10 142*9880d681SAndroid Build Coastguard Worker store i32 %conv, i32* %arrayidx, align 4 143*9880d681SAndroid Build Coastguard Worker %mul = shl i64 %i.02, 1 144*9880d681SAndroid Build Coastguard Worker %arrayidx1 = getelementptr inbounds i32, i32* %A, i64 %mul 145*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %arrayidx1, align 4 146*9880d681SAndroid Build Coastguard Worker %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1 147*9880d681SAndroid Build Coastguard Worker store i32 %0, i32* %B.addr.01, align 4 148*9880d681SAndroid Build Coastguard Worker %inc = add i64 %i.02, 1 149*9880d681SAndroid Build Coastguard Worker %exitcond = icmp ne i64 %inc, 6 150*9880d681SAndroid Build Coastguard Worker br i1 %exitcond, label %for.body, label %for.end 151*9880d681SAndroid Build Coastguard Worker 152*9880d681SAndroid Build Coastguard Workerfor.end: ; preds = %for.body 153*9880d681SAndroid Build Coastguard Worker ret void 154*9880d681SAndroid Build Coastguard Worker} 155*9880d681SAndroid Build Coastguard Worker 156*9880d681SAndroid Build Coastguard Worker 157*9880d681SAndroid Build Coastguard Worker;; for (long unsigned i = 0; i < 7; i++) { 158*9880d681SAndroid Build Coastguard Worker;; A[10] = i; 159*9880d681SAndroid Build Coastguard Worker;; *B++ = A[2*i]; 160*9880d681SAndroid Build Coastguard Worker 161*9880d681SAndroid Build Coastguard Workerdefine void @weakzerosrc4(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { 162*9880d681SAndroid Build Coastguard Workerentry: 163*9880d681SAndroid Build Coastguard Worker br label %for.body 164*9880d681SAndroid Build Coastguard Worker 165*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - consistent output [S]! 166*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - flow [*|<]! 167*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - confused! 168*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - none! 169*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - confused! 170*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - none! 171*9880d681SAndroid Build Coastguard Worker 172*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = %entry, %for.body 173*9880d681SAndroid Build Coastguard Worker %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 174*9880d681SAndroid Build Coastguard Worker %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] 175*9880d681SAndroid Build Coastguard Worker %conv = trunc i64 %i.02 to i32 176*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i32, i32* %A, i64 10 177*9880d681SAndroid Build Coastguard Worker store i32 %conv, i32* %arrayidx, align 4 178*9880d681SAndroid Build Coastguard Worker %mul = shl i64 %i.02, 1 179*9880d681SAndroid Build Coastguard Worker %arrayidx1 = getelementptr inbounds i32, i32* %A, i64 %mul 180*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %arrayidx1, align 4 181*9880d681SAndroid Build Coastguard Worker %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1 182*9880d681SAndroid Build Coastguard Worker store i32 %0, i32* %B.addr.01, align 4 183*9880d681SAndroid Build Coastguard Worker %inc = add i64 %i.02, 1 184*9880d681SAndroid Build Coastguard Worker %exitcond = icmp ne i64 %inc, 7 185*9880d681SAndroid Build Coastguard Worker br i1 %exitcond, label %for.body, label %for.end 186*9880d681SAndroid Build Coastguard Worker 187*9880d681SAndroid Build Coastguard Workerfor.end: ; preds = %for.body 188*9880d681SAndroid Build Coastguard Worker ret void 189*9880d681SAndroid Build Coastguard Worker} 190*9880d681SAndroid Build Coastguard Worker 191*9880d681SAndroid Build Coastguard Worker 192*9880d681SAndroid Build Coastguard Worker;; for (long unsigned i = 0; i < 7; i++) { 193*9880d681SAndroid Build Coastguard Worker;; A[-10] = i; 194*9880d681SAndroid Build Coastguard Worker;; *B++ = A[2*i]; 195*9880d681SAndroid Build Coastguard Worker 196*9880d681SAndroid Build Coastguard Workerdefine void @weakzerosrc5(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { 197*9880d681SAndroid Build Coastguard Workerentry: 198*9880d681SAndroid Build Coastguard Worker br label %for.body 199*9880d681SAndroid Build Coastguard Worker 200*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - consistent output [S]! 201*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - none! 202*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - confused! 203*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - none! 204*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - confused! 205*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - none! 206*9880d681SAndroid Build Coastguard Worker 207*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = %entry, %for.body 208*9880d681SAndroid Build Coastguard Worker %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 209*9880d681SAndroid Build Coastguard Worker %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] 210*9880d681SAndroid Build Coastguard Worker %conv = trunc i64 %i.02 to i32 211*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i32, i32* %A, i64 -10 212*9880d681SAndroid Build Coastguard Worker store i32 %conv, i32* %arrayidx, align 4 213*9880d681SAndroid Build Coastguard Worker %mul = shl i64 %i.02, 1 214*9880d681SAndroid Build Coastguard Worker %arrayidx1 = getelementptr inbounds i32, i32* %A, i64 %mul 215*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %arrayidx1, align 4 216*9880d681SAndroid Build Coastguard Worker %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1 217*9880d681SAndroid Build Coastguard Worker store i32 %0, i32* %B.addr.01, align 4 218*9880d681SAndroid Build Coastguard Worker %inc = add i64 %i.02, 1 219*9880d681SAndroid Build Coastguard Worker %exitcond = icmp ne i64 %inc, 7 220*9880d681SAndroid Build Coastguard Worker br i1 %exitcond, label %for.body, label %for.end 221*9880d681SAndroid Build Coastguard Worker 222*9880d681SAndroid Build Coastguard Workerfor.end: ; preds = %for.body 223*9880d681SAndroid Build Coastguard Worker ret void 224*9880d681SAndroid Build Coastguard Worker} 225*9880d681SAndroid Build Coastguard Worker 226*9880d681SAndroid Build Coastguard Worker 227*9880d681SAndroid Build Coastguard Worker;; for (long unsigned i = 0; i < n; i++) { 228*9880d681SAndroid Build Coastguard Worker;; A[10] = i; 229*9880d681SAndroid Build Coastguard Worker;; *B++ = A[3*i]; 230*9880d681SAndroid Build Coastguard Worker 231*9880d681SAndroid Build Coastguard Workerdefine void @weakzerosrc6(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { 232*9880d681SAndroid Build Coastguard Workerentry: 233*9880d681SAndroid Build Coastguard Worker %cmp1 = icmp eq i64 %n, 0 234*9880d681SAndroid Build Coastguard Worker br i1 %cmp1, label %for.end, label %for.body.preheader 235*9880d681SAndroid Build Coastguard Worker 236*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - consistent output [S]! 237*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - none! 238*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - confused! 239*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - none! 240*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - confused! 241*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - none! 242*9880d681SAndroid Build Coastguard Worker 243*9880d681SAndroid Build Coastguard Workerfor.body.preheader: ; preds = %entry 244*9880d681SAndroid Build Coastguard Worker br label %for.body 245*9880d681SAndroid Build Coastguard Worker 246*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = %for.body.preheader, %for.body 247*9880d681SAndroid Build Coastguard Worker %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ] 248*9880d681SAndroid Build Coastguard Worker %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ] 249*9880d681SAndroid Build Coastguard Worker %conv = trunc i64 %i.03 to i32 250*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i32, i32* %A, i64 10 251*9880d681SAndroid Build Coastguard Worker store i32 %conv, i32* %arrayidx, align 4 252*9880d681SAndroid Build Coastguard Worker %mul = mul i64 %i.03, 3 253*9880d681SAndroid Build Coastguard Worker %arrayidx1 = getelementptr inbounds i32, i32* %A, i64 %mul 254*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %arrayidx1, align 4 255*9880d681SAndroid Build Coastguard Worker %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.02, i64 1 256*9880d681SAndroid Build Coastguard Worker store i32 %0, i32* %B.addr.02, align 4 257*9880d681SAndroid Build Coastguard Worker %inc = add i64 %i.03, 1 258*9880d681SAndroid Build Coastguard Worker %exitcond = icmp ne i64 %inc, %n 259*9880d681SAndroid Build Coastguard Worker br i1 %exitcond, label %for.body, label %for.end.loopexit 260*9880d681SAndroid Build Coastguard Worker 261*9880d681SAndroid Build Coastguard Workerfor.end.loopexit: ; preds = %for.body 262*9880d681SAndroid Build Coastguard Worker br label %for.end 263*9880d681SAndroid Build Coastguard Worker 264*9880d681SAndroid Build Coastguard Workerfor.end: ; preds = %for.end.loopexit, %entry 265*9880d681SAndroid Build Coastguard Worker ret void 266*9880d681SAndroid Build Coastguard Worker} 267