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 5target 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" 6target triple = "x86_64-apple-macosx10.6.0" 7 8 9;; for (int i = 0; i < n; i++) { 10;; A[i + 2] = i; 11;; *B++ = A[i]; 12 13define void @strong0(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp { 14; CHECK-LABEL: 'strong0' 15; CHECK-NEXT: Src: store i32 %1, ptr %arrayidx, align 4 --> Dst: store i32 %1, ptr %arrayidx, align 4 16; CHECK-NEXT: da analyze - none! 17; CHECK-NEXT: Src: store i32 %1, ptr %arrayidx, align 4 --> Dst: %2 = load i32, ptr %arrayidx3, align 4 18; CHECK-NEXT: da analyze - consistent flow [2]! 19; CHECK-NEXT: Src: store i32 %1, ptr %arrayidx, align 4 --> Dst: store i32 %2, ptr %B.addr.02, align 4 20; CHECK-NEXT: da analyze - confused! 21; CHECK-NEXT: Src: %2 = load i32, ptr %arrayidx3, align 4 --> Dst: %2 = load i32, ptr %arrayidx3, align 4 22; CHECK-NEXT: da analyze - none! 23; CHECK-NEXT: Src: %2 = load i32, ptr %arrayidx3, align 4 --> Dst: store i32 %2, ptr %B.addr.02, align 4 24; CHECK-NEXT: da analyze - confused! 25; CHECK-NEXT: Src: store i32 %2, ptr %B.addr.02, align 4 --> Dst: store i32 %2, ptr %B.addr.02, align 4 26; CHECK-NEXT: da analyze - none! 27; 28entry: 29 %cmp1 = icmp sgt i64 %n, 0 30 br i1 %cmp1, label %for.body.preheader, label %for.end 31 32for.body.preheader: ; preds = %entry 33 br label %for.body 34 35for.body: ; preds = %for.body.preheader, %for.body 36 %indvars.iv = phi i64 [ 0, %for.body.preheader ], [ %indvars.iv.next, %for.body ] 37 %B.addr.02 = phi ptr [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ] 38 %0 = add nsw i64 %indvars.iv, 2 39 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %0 40 %1 = trunc i64 %indvars.iv to i32 41 store i32 %1, ptr %arrayidx, align 4 42 %arrayidx3 = getelementptr inbounds i32, ptr %A, i64 %indvars.iv 43 %2 = load i32, ptr %arrayidx3, align 4 44 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.02, i64 1 45 store i32 %2, ptr %B.addr.02, align 4 46 %indvars.iv.next = add i64 %indvars.iv, 1 47 %exitcond = icmp ne i64 %indvars.iv.next, %n 48 br i1 %exitcond, label %for.body, label %for.end.loopexit 49 50for.end.loopexit: ; preds = %for.body 51 br label %for.end 52 53for.end: ; preds = %for.end.loopexit, %entry 54 ret void 55} 56 57 58;; for (long int i = 0; i < n; i++) { 59;; A[i + 2] = i; 60;; *B++ = A[i]; 61 62define void @strong1(ptr %A, ptr %B, i32 %n) nounwind uwtable ssp { 63; CHECK-LABEL: 'strong1' 64; CHECK-NEXT: Src: store i32 %conv2, ptr %arrayidx, align 4 --> Dst: store i32 %conv2, ptr %arrayidx, align 4 65; CHECK-NEXT: da analyze - none! 66; CHECK-NEXT: Src: store i32 %conv2, ptr %arrayidx, align 4 --> Dst: %1 = load i32, ptr %arrayidx3, align 4 67; CHECK-NEXT: da analyze - consistent flow [2]! 68; CHECK-NEXT: Src: store i32 %conv2, ptr %arrayidx, align 4 --> Dst: store i32 %1, ptr %B.addr.02, align 4 69; CHECK-NEXT: da analyze - confused! 70; CHECK-NEXT: Src: %1 = load i32, ptr %arrayidx3, align 4 --> Dst: %1 = load i32, ptr %arrayidx3, align 4 71; CHECK-NEXT: da analyze - none! 72; CHECK-NEXT: Src: %1 = load i32, ptr %arrayidx3, align 4 --> Dst: store i32 %1, ptr %B.addr.02, align 4 73; CHECK-NEXT: da analyze - confused! 74; CHECK-NEXT: Src: store i32 %1, ptr %B.addr.02, align 4 --> Dst: store i32 %1, ptr %B.addr.02, align 4 75; CHECK-NEXT: da analyze - none! 76; 77entry: 78 %cmp1 = icmp sgt i32 %n, 0 79 br i1 %cmp1, label %for.body.preheader, label %for.end 80 81for.body.preheader: ; preds = %entry 82 %0 = sext i32 %n to i64 83 br label %for.body 84 85for.body: ; preds = %for.body.preheader, %for.body 86 %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ] 87 %B.addr.02 = phi ptr [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ] 88 %conv2 = trunc i64 %i.03 to i32 89 %add = add nsw i64 %i.03, 2 90 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %add 91 store i32 %conv2, ptr %arrayidx, align 4 92 %arrayidx3 = getelementptr inbounds i32, ptr %A, i64 %i.03 93 %1 = load i32, ptr %arrayidx3, align 4 94 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.02, i64 1 95 store i32 %1, ptr %B.addr.02, align 4 96 %inc = add nsw i64 %i.03, 1 97 %exitcond = icmp ne i64 %inc, %0 98 br i1 %exitcond, label %for.body, label %for.end.loopexit 99 100for.end.loopexit: ; preds = %for.body 101 br label %for.end 102 103for.end: ; preds = %for.end.loopexit, %entry 104 ret void 105} 106 107 108;; for (long unsigned i = 0; i < n; i++) { 109;; A[i + 2] = i; 110;; *B++ = A[i]; 111 112define void @strong2(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp { 113; CHECK-LABEL: 'strong2' 114; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4 115; CHECK-NEXT: da analyze - none! 116; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4 117; CHECK-NEXT: da analyze - consistent flow [2]! 118; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4 119; CHECK-NEXT: da analyze - confused! 120; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4 121; CHECK-NEXT: da analyze - none! 122; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4 123; CHECK-NEXT: da analyze - confused! 124; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.02, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4 125; CHECK-NEXT: da analyze - none! 126; 127entry: 128 %cmp1 = icmp eq i64 %n, 0 129 br i1 %cmp1, label %for.end, label %for.body.preheader 130 131for.body.preheader: ; preds = %entry 132 br label %for.body 133 134for.body: ; preds = %for.body.preheader, %for.body 135 %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ] 136 %B.addr.02 = phi ptr [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ] 137 %conv = trunc i64 %i.03 to i32 138 %add = add i64 %i.03, 2 139 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %add 140 store i32 %conv, ptr %arrayidx, align 4 141 %arrayidx1 = getelementptr inbounds i32, ptr %A, i64 %i.03 142 %0 = load i32, ptr %arrayidx1, align 4 143 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.02, i64 1 144 store i32 %0, ptr %B.addr.02, align 4 145 %inc = add i64 %i.03, 1 146 %exitcond = icmp ne i64 %inc, %n 147 br i1 %exitcond, label %for.body, label %for.end.loopexit 148 149for.end.loopexit: ; preds = %for.body 150 br label %for.end 151 152for.end: ; preds = %for.end.loopexit, %entry 153 ret void 154} 155 156 157;; for (int i = 0; i < n; i++) { 158;; A[i + 2] = i; 159;; *B++ = A[i]; 160 161define void @strong3(ptr %A, ptr %B, i32 %n) nounwind uwtable ssp { 162; CHECK-LABEL: 'strong3' 163; CHECK-NEXT: Src: store i32 %1, ptr %arrayidx, align 4 --> Dst: store i32 %1, ptr %arrayidx, align 4 164; CHECK-NEXT: da analyze - none! 165; CHECK-NEXT: Src: store i32 %1, ptr %arrayidx, align 4 --> Dst: %2 = load i32, ptr %arrayidx2, align 4 166; CHECK-NEXT: da analyze - consistent flow [2]! 167; CHECK-NEXT: Src: store i32 %1, ptr %arrayidx, align 4 --> Dst: store i32 %2, ptr %B.addr.02, align 4 168; CHECK-NEXT: da analyze - confused! 169; CHECK-NEXT: Src: %2 = load i32, ptr %arrayidx2, align 4 --> Dst: %2 = load i32, ptr %arrayidx2, align 4 170; CHECK-NEXT: da analyze - none! 171; CHECK-NEXT: Src: %2 = load i32, ptr %arrayidx2, align 4 --> Dst: store i32 %2, ptr %B.addr.02, align 4 172; CHECK-NEXT: da analyze - confused! 173; CHECK-NEXT: Src: store i32 %2, ptr %B.addr.02, align 4 --> Dst: store i32 %2, ptr %B.addr.02, align 4 174; CHECK-NEXT: da analyze - none! 175; 176entry: 177 %cmp1 = icmp sgt i32 %n, 0 178 br i1 %cmp1, label %for.body.preheader, label %for.end 179 180for.body.preheader: ; preds = %entry 181 br label %for.body 182 183for.body: ; preds = %for.body.preheader, %for.body 184 %indvars.iv = phi i64 [ 0, %for.body.preheader ], [ %indvars.iv.next, %for.body ] 185 %B.addr.02 = phi ptr [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ] 186 %0 = add nsw i64 %indvars.iv, 2 187 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %0 188 %1 = trunc i64 %indvars.iv to i32 189 store i32 %1, ptr %arrayidx, align 4 190 %arrayidx2 = getelementptr inbounds i32, ptr %A, i64 %indvars.iv 191 %2 = load i32, ptr %arrayidx2, align 4 192 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.02, i64 1 193 store i32 %2, ptr %B.addr.02, align 4 194 %indvars.iv.next = add i64 %indvars.iv, 1 195 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 196 %exitcond = icmp ne i32 %lftr.wideiv, %n 197 br i1 %exitcond, label %for.body, label %for.end.loopexit 198 199for.end.loopexit: ; preds = %for.body 200 br label %for.end 201 202for.end: ; preds = %for.end.loopexit, %entry 203 ret void 204} 205 206 207;; for (long unsigned i = 0; i < 19; i++) { 208;; A[i + 19] = i; 209;; *B++ = A[i]; 210 211define void @strong4(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp { 212; CHECK-LABEL: 'strong4' 213; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4 214; CHECK-NEXT: da analyze - none! 215; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4 216; CHECK-NEXT: da analyze - none! 217; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 218; CHECK-NEXT: da analyze - confused! 219; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4 220; CHECK-NEXT: da analyze - none! 221; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 222; CHECK-NEXT: da analyze - confused! 223; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 224; CHECK-NEXT: da analyze - none! 225; 226entry: 227 br label %for.body 228 229for.body: ; preds = %entry, %for.body 230 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 231 %B.addr.01 = phi ptr [ %B, %entry ], [ %incdec.ptr, %for.body ] 232 %conv = trunc i64 %i.02 to i32 233 %add = add i64 %i.02, 19 234 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %add 235 store i32 %conv, ptr %arrayidx, align 4 236 %arrayidx1 = getelementptr inbounds i32, ptr %A, i64 %i.02 237 %0 = load i32, ptr %arrayidx1, align 4 238 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1 239 store i32 %0, ptr %B.addr.01, align 4 240 %inc = add i64 %i.02, 1 241 %exitcond = icmp ne i64 %inc, 19 242 br i1 %exitcond, label %for.body, label %for.end 243 244for.end: ; preds = %for.body 245 ret void 246} 247 248 249;; for (long unsigned i = 0; i < 20; i++) { 250;; A[i + 19] = i; 251;; *B++ = A[i]; 252 253define void @strong5(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp { 254; CHECK-LABEL: 'strong5' 255; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4 256; CHECK-NEXT: da analyze - none! 257; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4 258; CHECK-NEXT: da analyze - consistent flow [19]! 259; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 260; CHECK-NEXT: da analyze - confused! 261; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4 262; CHECK-NEXT: da analyze - none! 263; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 264; CHECK-NEXT: da analyze - confused! 265; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 266; CHECK-NEXT: da analyze - none! 267; 268entry: 269 br label %for.body 270 271for.body: ; preds = %entry, %for.body 272 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 273 %B.addr.01 = phi ptr [ %B, %entry ], [ %incdec.ptr, %for.body ] 274 %conv = trunc i64 %i.02 to i32 275 %add = add i64 %i.02, 19 276 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %add 277 store i32 %conv, ptr %arrayidx, align 4 278 %arrayidx1 = getelementptr inbounds i32, ptr %A, i64 %i.02 279 %0 = load i32, ptr %arrayidx1, align 4 280 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1 281 store i32 %0, ptr %B.addr.01, align 4 282 %inc = add i64 %i.02, 1 283 %exitcond = icmp ne i64 %inc, 20 284 br i1 %exitcond, label %for.body, label %for.end 285 286for.end: ; preds = %for.body 287 ret void 288} 289 290 291;; for (long unsigned i = 0; i < 20; i++) { 292;; A[2*i + 6] = i; 293;; *B++ = A[2*i]; 294 295define void @strong6(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp { 296; CHECK-LABEL: 'strong6' 297; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4 298; CHECK-NEXT: da analyze - none! 299; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4 300; CHECK-NEXT: da analyze - consistent flow [3]! 301; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 302; CHECK-NEXT: da analyze - confused! 303; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4 304; CHECK-NEXT: da analyze - none! 305; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 306; CHECK-NEXT: da analyze - confused! 307; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 308; CHECK-NEXT: da analyze - none! 309; 310entry: 311 br label %for.body 312 313for.body: ; preds = %entry, %for.body 314 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 315 %B.addr.01 = phi ptr [ %B, %entry ], [ %incdec.ptr, %for.body ] 316 %conv = trunc i64 %i.02 to i32 317 %mul = shl i64 %i.02, 1 318 %add = add i64 %mul, 6 319 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %add 320 store i32 %conv, ptr %arrayidx, align 4 321 %mul1 = shl i64 %i.02, 1 322 %arrayidx2 = getelementptr inbounds i32, ptr %A, i64 %mul1 323 %0 = load i32, ptr %arrayidx2, align 4 324 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1 325 store i32 %0, ptr %B.addr.01, align 4 326 %inc = add i64 %i.02, 1 327 %exitcond = icmp ne i64 %inc, 20 328 br i1 %exitcond, label %for.body, label %for.end 329 330for.end: ; preds = %for.body 331 ret void 332} 333 334 335;; for (long unsigned i = 0; i < 20; i++) { 336;; A[2*i + 7] = i; 337;; *B++ = A[2*i]; 338 339define void @strong7(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp { 340; CHECK-LABEL: 'strong7' 341; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4 342; CHECK-NEXT: da analyze - none! 343; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4 344; CHECK-NEXT: da analyze - none! 345; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 346; CHECK-NEXT: da analyze - confused! 347; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4 348; CHECK-NEXT: da analyze - none! 349; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 350; CHECK-NEXT: da analyze - confused! 351; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 352; CHECK-NEXT: da analyze - none! 353; 354entry: 355 br label %for.body 356 357for.body: ; preds = %entry, %for.body 358 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 359 %B.addr.01 = phi ptr [ %B, %entry ], [ %incdec.ptr, %for.body ] 360 %conv = trunc i64 %i.02 to i32 361 %mul = shl i64 %i.02, 1 362 %add = add i64 %mul, 7 363 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %add 364 store i32 %conv, ptr %arrayidx, align 4 365 %mul1 = shl i64 %i.02, 1 366 %arrayidx2 = getelementptr inbounds i32, ptr %A, i64 %mul1 367 %0 = load i32, ptr %arrayidx2, align 4 368 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1 369 store i32 %0, ptr %B.addr.01, align 4 370 %inc = add i64 %i.02, 1 371 %exitcond = icmp ne i64 %inc, 20 372 br i1 %exitcond, label %for.body, label %for.end 373 374for.end: ; preds = %for.body 375 ret void 376} 377 378 379;; for (long unsigned i = 0; i < 20; i++) { 380;; A[i + n] = i; 381;; *B++ = A[i]; 382 383define void @strong8(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp { 384; CHECK-LABEL: 'strong8' 385; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4 386; CHECK-NEXT: da analyze - none! 387; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4 388; CHECK-NEXT: da analyze - flow [*|<]! 389; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 390; CHECK-NEXT: da analyze - confused! 391; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4 392; CHECK-NEXT: da analyze - none! 393; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 394; CHECK-NEXT: da analyze - confused! 395; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 396; CHECK-NEXT: da analyze - none! 397; 398entry: 399 br label %for.body 400 401for.body: ; preds = %entry, %for.body 402 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 403 %B.addr.01 = phi ptr [ %B, %entry ], [ %incdec.ptr, %for.body ] 404 %conv = trunc i64 %i.02 to i32 405 %add = add i64 %i.02, %n 406 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %add 407 store i32 %conv, ptr %arrayidx, align 4 408 %arrayidx1 = getelementptr inbounds i32, ptr %A, i64 %i.02 409 %0 = load i32, ptr %arrayidx1, align 4 410 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1 411 store i32 %0, ptr %B.addr.01, align 4 412 %inc = add i64 %i.02, 1 413 %exitcond = icmp ne i64 %inc, 20 414 br i1 %exitcond, label %for.body, label %for.end 415 416for.end: ; preds = %for.body 417 ret void 418} 419 420 421;; for (long unsigned i = 0; i < n; i++) { 422;; A[i + n] = i; 423;; *B++ = A[i + 2*n]; 424 425define void @strong9(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp { 426; CHECK-LABEL: 'strong9' 427; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4 428; CHECK-NEXT: da analyze - none! 429; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4 430; CHECK-NEXT: da analyze - none! 431; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4 432; CHECK-NEXT: da analyze - confused! 433; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4 434; CHECK-NEXT: da analyze - none! 435; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4 436; CHECK-NEXT: da analyze - confused! 437; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.02, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4 438; CHECK-NEXT: da analyze - none! 439; 440entry: 441 %cmp1 = icmp eq i64 %n, 0 442 br i1 %cmp1, label %for.end, label %for.body.preheader 443 444for.body.preheader: ; preds = %entry 445 br label %for.body 446 447for.body: ; preds = %for.body.preheader, %for.body 448 %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ] 449 %B.addr.02 = phi ptr [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ] 450 %conv = trunc i64 %i.03 to i32 451 %add = add i64 %i.03, %n 452 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %add 453 store i32 %conv, ptr %arrayidx, align 4 454 %mul = shl i64 %n, 1 455 %add1 = add i64 %i.03, %mul 456 %arrayidx2 = getelementptr inbounds i32, ptr %A, i64 %add1 457 %0 = load i32, ptr %arrayidx2, align 4 458 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.02, i64 1 459 store i32 %0, ptr %B.addr.02, align 4 460 %inc = add i64 %i.03, 1 461 %exitcond = icmp ne i64 %inc, %n 462 br i1 %exitcond, label %for.body, label %for.end.loopexit 463 464for.end.loopexit: ; preds = %for.body 465 br label %for.end 466 467for.end: ; preds = %for.end.loopexit, %entry 468 ret void 469} 470 471 472;; for (long unsigned i = 0; i < 1000; i++) { 473;; A[n*i + 5] = i; 474;; *B++ = A[n*i + 5]; 475 476define void @strong10(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp { 477; CHECK-LABEL: 'strong10' 478; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4 479; CHECK-NEXT: da analyze - none! 480; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx3, align 4 481; CHECK-NEXT: da analyze - consistent flow [0|<]! 482; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 483; CHECK-NEXT: da analyze - confused! 484; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx3, align 4 --> Dst: %0 = load i32, ptr %arrayidx3, align 4 485; CHECK-NEXT: da analyze - none! 486; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx3, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 487; CHECK-NEXT: da analyze - confused! 488; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 489; CHECK-NEXT: da analyze - none! 490; 491entry: 492 br label %for.body 493 494for.body: ; preds = %entry, %for.body 495 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 496 %B.addr.01 = phi ptr [ %B, %entry ], [ %incdec.ptr, %for.body ] 497 %conv = trunc i64 %i.02 to i32 498 %mul = mul i64 %i.02, %n 499 %add = add i64 %mul, 5 500 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %add 501 store i32 %conv, ptr %arrayidx, align 4 502 %mul1 = mul i64 %i.02, %n 503 %add2 = add i64 %mul1, 5 504 %arrayidx3 = getelementptr inbounds i32, ptr %A, i64 %add2 505 %0 = load i32, ptr %arrayidx3, align 4 506 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1 507 store i32 %0, ptr %B.addr.01, align 4 508 %inc = add i64 %i.02, 1 509 %exitcond = icmp ne i64 %inc, 1000 510 br i1 %exitcond, label %for.body, label %for.end 511 512for.end: ; preds = %for.body 513 ret void 514} 515