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