1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 5 2; RUN: opt < %s -disable-output "-passes=print<da>" -aa-pipeline=basic-aa 2>&1 \ 3; RUN: | FileCheck %s 4 5; ModuleID = 'WeakZeroSrcSIV.bc' 6target 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" 7target triple = "x86_64-apple-macosx10.6.0" 8 9 10;; for (int i = 0; i < N; i++) { 11;; A[0] = 1; 12;; A[i] = 2; 13 14define void @dstzero(ptr nocapture %A, i32 %N) { 15; CHECK-LABEL: 'dstzero' 16; CHECK-NEXT: Src: store i32 0, ptr %A, align 4 --> Dst: store i32 0, ptr %A, align 4 17; CHECK-NEXT: da analyze - consistent output [S]! 18; CHECK-NEXT: Src: store i32 0, ptr %A, align 4 --> Dst: store i32 1, ptr %arrayidx1, align 4 19; CHECK-NEXT: da analyze - output [p=>|<]! 20; CHECK-NEXT: Src: store i32 1, ptr %arrayidx1, align 4 --> Dst: store i32 1, ptr %arrayidx1, align 4 21; CHECK-NEXT: da analyze - none! 22; 23entry: 24 %cmp6 = icmp sgt i32 %N, 0 25 br i1 %cmp6, label %for.body, label %for.cond.cleanup 26 27for.body: ; preds = %entry, %for.body 28 %i.07 = phi i32 [ %add, %for.body ], [ 0, %entry ] 29 store i32 0, ptr %A, align 4 30 %arrayidx1 = getelementptr inbounds i32, ptr %A, i32 %i.07 31 store i32 1, ptr %arrayidx1, align 4 32 %add = add nuw nsw i32 %i.07, 1 33 %exitcond = icmp eq i32 %add, %N 34 br i1 %exitcond, label %for.cond.cleanup, label %for.body 35 36for.cond.cleanup: ; preds = %for.body, %entry 37 ret void 38} 39 40 41;; for (long unsigned i = 0; i < 30; i++) { 42;; A[10] = i; 43;; *B++ = A[2*i + 10]; 44 45define void @weakzerosrc0(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp { 46; CHECK-LABEL: 'weakzerosrc0' 47; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4 48; CHECK-NEXT: da analyze - consistent output [S]! 49; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4 50; CHECK-NEXT: da analyze - flow [p=>|<]! 51; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 52; CHECK-NEXT: da analyze - confused! 53; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4 54; CHECK-NEXT: da analyze - none! 55; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 56; CHECK-NEXT: da analyze - confused! 57; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 58; CHECK-NEXT: da analyze - none! 59; 60entry: 61 br label %for.body 62 63for.body: ; preds = %entry, %for.body 64 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 65 %B.addr.01 = phi ptr [ %B, %entry ], [ %incdec.ptr, %for.body ] 66 %conv = trunc i64 %i.02 to i32 67 %arrayidx = getelementptr inbounds i32, ptr %A, i64 10 68 store i32 %conv, ptr %arrayidx, align 4 69 %mul = shl i64 %i.02, 1 70 %add = add i64 %mul, 10 71 %arrayidx1 = getelementptr inbounds i32, ptr %A, i64 %add 72 %0 = load i32, ptr %arrayidx1, align 4 73 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1 74 store i32 %0, ptr %B.addr.01, align 4 75 %inc = add i64 %i.02, 1 76 %exitcond = icmp ne i64 %inc, 30 77 br i1 %exitcond, label %for.body, label %for.end 78 79for.end: ; preds = %for.body 80 ret void 81} 82 83 84;; for (long unsigned i = 0; i < n; i++) { 85;; A[10] = i; 86;; *B++ = A[n*i + 10]; 87 88define void @weakzerosrc1(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp { 89; CHECK-LABEL: 'weakzerosrc1' 90; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4 91; CHECK-NEXT: da analyze - consistent output [S]! 92; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4 93; CHECK-NEXT: da analyze - flow [p=>|<]! 94; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4 95; CHECK-NEXT: da analyze - confused! 96; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4 97; CHECK-NEXT: da analyze - none! 98; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4 99; CHECK-NEXT: da analyze - confused! 100; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.02, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4 101; CHECK-NEXT: da analyze - none! 102; 103entry: 104 %cmp1 = icmp eq i64 %n, 0 105 br i1 %cmp1, label %for.end, label %for.body.preheader 106 107for.body.preheader: ; preds = %entry 108 br label %for.body 109 110for.body: ; preds = %for.body.preheader, %for.body 111 %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ] 112 %B.addr.02 = phi ptr [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ] 113 %conv = trunc i64 %i.03 to i32 114 %arrayidx = getelementptr inbounds i32, ptr %A, i64 10 115 store i32 %conv, ptr %arrayidx, align 4 116 %mul = mul i64 %i.03, %n 117 %add = add i64 %mul, 10 118 %arrayidx1 = getelementptr inbounds i32, ptr %A, i64 %add 119 %0 = load i32, ptr %arrayidx1, align 4 120 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.02, i64 1 121 store i32 %0, ptr %B.addr.02, align 4 122 %inc = add i64 %i.03, 1 123 %exitcond = icmp ne i64 %inc, %n 124 br i1 %exitcond, label %for.body, label %for.end.loopexit 125 126for.end.loopexit: ; preds = %for.body 127 br label %for.end 128 129for.end: ; preds = %for.end.loopexit, %entry 130 ret void 131} 132 133 134;; for (long unsigned i = 0; i < 5; i++) { 135;; A[10] = i; 136;; *B++ = A[2*i]; 137 138define void @weakzerosrc2(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp { 139; CHECK-LABEL: 'weakzerosrc2' 140; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4 141; CHECK-NEXT: da analyze - consistent output [S]! 142; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4 143; CHECK-NEXT: da analyze - none! 144; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 145; CHECK-NEXT: da analyze - confused! 146; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4 147; CHECK-NEXT: da analyze - none! 148; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 149; CHECK-NEXT: da analyze - confused! 150; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 151; CHECK-NEXT: da analyze - none! 152; 153entry: 154 br label %for.body 155 156for.body: ; preds = %entry, %for.body 157 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 158 %B.addr.01 = phi ptr [ %B, %entry ], [ %incdec.ptr, %for.body ] 159 %conv = trunc i64 %i.02 to i32 160 %arrayidx = getelementptr inbounds i32, ptr %A, i64 10 161 store i32 %conv, ptr %arrayidx, align 4 162 %mul = shl i64 %i.02, 1 163 %arrayidx1 = getelementptr inbounds i32, ptr %A, i64 %mul 164 %0 = load i32, ptr %arrayidx1, align 4 165 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1 166 store i32 %0, ptr %B.addr.01, align 4 167 %inc = add i64 %i.02, 1 168 %exitcond = icmp ne i64 %inc, 5 169 br i1 %exitcond, label %for.body, label %for.end 170 171for.end: ; preds = %for.body 172 ret void 173} 174 175 176;; for (long unsigned i = 0; i < 6; i++) { 177;; A[10] = i; 178;; *B++ = A[2*i]; 179 180define void @weakzerosrc3(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp { 181; CHECK-LABEL: 'weakzerosrc3' 182; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4 183; CHECK-NEXT: da analyze - consistent output [S]! 184; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4 185; CHECK-NEXT: da analyze - flow [<=p|<]! 186; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 187; CHECK-NEXT: da analyze - confused! 188; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4 189; CHECK-NEXT: da analyze - none! 190; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 191; CHECK-NEXT: da analyze - confused! 192; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 193; CHECK-NEXT: da analyze - none! 194; 195entry: 196 br label %for.body 197 198for.body: ; preds = %entry, %for.body 199 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 200 %B.addr.01 = phi ptr [ %B, %entry ], [ %incdec.ptr, %for.body ] 201 %conv = trunc i64 %i.02 to i32 202 %arrayidx = getelementptr inbounds i32, ptr %A, i64 10 203 store i32 %conv, ptr %arrayidx, align 4 204 %mul = shl i64 %i.02, 1 205 %arrayidx1 = getelementptr inbounds i32, ptr %A, i64 %mul 206 %0 = load i32, ptr %arrayidx1, align 4 207 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1 208 store i32 %0, ptr %B.addr.01, align 4 209 %inc = add i64 %i.02, 1 210 %exitcond = icmp ne i64 %inc, 6 211 br i1 %exitcond, label %for.body, label %for.end 212 213for.end: ; preds = %for.body 214 ret void 215} 216 217 218;; for (long unsigned i = 0; i < 7; i++) { 219;; A[10] = i; 220;; *B++ = A[2*i]; 221 222define void @weakzerosrc4(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp { 223; CHECK-LABEL: 'weakzerosrc4' 224; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4 225; CHECK-NEXT: da analyze - consistent output [S]! 226; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4 227; CHECK-NEXT: da analyze - flow [*|<]! 228; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 229; CHECK-NEXT: da analyze - confused! 230; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4 231; CHECK-NEXT: da analyze - none! 232; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 233; CHECK-NEXT: da analyze - confused! 234; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 235; CHECK-NEXT: da analyze - none! 236; 237entry: 238 br label %for.body 239 240for.body: ; preds = %entry, %for.body 241 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 242 %B.addr.01 = phi ptr [ %B, %entry ], [ %incdec.ptr, %for.body ] 243 %conv = trunc i64 %i.02 to i32 244 %arrayidx = getelementptr inbounds i32, ptr %A, i64 10 245 store i32 %conv, ptr %arrayidx, align 4 246 %mul = shl i64 %i.02, 1 247 %arrayidx1 = getelementptr inbounds i32, ptr %A, i64 %mul 248 %0 = load i32, ptr %arrayidx1, align 4 249 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1 250 store i32 %0, ptr %B.addr.01, align 4 251 %inc = add i64 %i.02, 1 252 %exitcond = icmp ne i64 %inc, 7 253 br i1 %exitcond, label %for.body, label %for.end 254 255for.end: ; preds = %for.body 256 ret void 257} 258 259 260;; for (long unsigned i = 0; i < 7; i++) { 261;; A[-10] = i; 262;; *B++ = A[2*i]; 263 264define void @weakzerosrc5(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp { 265; CHECK-LABEL: 'weakzerosrc5' 266; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4 267; CHECK-NEXT: da analyze - consistent output [S]! 268; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4 269; CHECK-NEXT: da analyze - none! 270; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 271; CHECK-NEXT: da analyze - confused! 272; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4 273; CHECK-NEXT: da analyze - none! 274; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 275; CHECK-NEXT: da analyze - confused! 276; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 277; CHECK-NEXT: da analyze - none! 278; 279entry: 280 br label %for.body 281 282for.body: ; preds = %entry, %for.body 283 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 284 %B.addr.01 = phi ptr [ %B, %entry ], [ %incdec.ptr, %for.body ] 285 %conv = trunc i64 %i.02 to i32 286 %arrayidx = getelementptr inbounds i32, ptr %A, i64 -10 287 store i32 %conv, ptr %arrayidx, align 4 288 %mul = shl i64 %i.02, 1 289 %arrayidx1 = getelementptr inbounds i32, ptr %A, i64 %mul 290 %0 = load i32, ptr %arrayidx1, align 4 291 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1 292 store i32 %0, ptr %B.addr.01, align 4 293 %inc = add i64 %i.02, 1 294 %exitcond = icmp ne i64 %inc, 7 295 br i1 %exitcond, label %for.body, label %for.end 296 297for.end: ; preds = %for.body 298 ret void 299} 300 301 302;; for (long unsigned i = 0; i < n; i++) { 303;; A[10] = i; 304;; *B++ = A[3*i]; 305 306define void @weakzerosrc6(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp { 307; CHECK-LABEL: 'weakzerosrc6' 308; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4 309; CHECK-NEXT: da analyze - consistent output [S]! 310; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4 311; CHECK-NEXT: da analyze - none! 312; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4 313; CHECK-NEXT: da analyze - confused! 314; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4 315; CHECK-NEXT: da analyze - none! 316; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4 317; CHECK-NEXT: da analyze - confused! 318; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.02, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4 319; CHECK-NEXT: da analyze - none! 320; 321entry: 322 %cmp1 = icmp eq i64 %n, 0 323 br i1 %cmp1, label %for.end, label %for.body.preheader 324 325for.body.preheader: ; preds = %entry 326 br label %for.body 327 328for.body: ; preds = %for.body.preheader, %for.body 329 %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ] 330 %B.addr.02 = phi ptr [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ] 331 %conv = trunc i64 %i.03 to i32 332 %arrayidx = getelementptr inbounds i32, ptr %A, i64 10 333 store i32 %conv, ptr %arrayidx, align 4 334 %mul = mul i64 %i.03, 3 335 %arrayidx1 = getelementptr inbounds i32, ptr %A, i64 %mul 336 %0 = load i32, ptr %arrayidx1, align 4 337 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.02, i64 1 338 store i32 %0, ptr %B.addr.02, align 4 339 %inc = add i64 %i.03, 1 340 %exitcond = icmp ne i64 %inc, %n 341 br i1 %exitcond, label %for.body, label %for.end.loopexit 342 343for.end.loopexit: ; preds = %for.body 344 br label %for.end 345 346for.end: ; preds = %for.end.loopexit, %entry 347 ret void 348} 349