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 = 'ExactRDIV.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 (long int i = 0; i < 10; i++) 11;; A[4*i + 10] = i; 12;; for (long int j = 0; j < 10; j++) 13;; *B++ = A[2*j + 1]; 14 15define void @rdiv0(ptr %A, ptr %B) nounwind uwtable ssp { 16; CHECK-LABEL: 'rdiv0' 17; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4 18; CHECK-NEXT: da analyze - none! 19; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx7, align 4 20; CHECK-NEXT: da analyze - none! 21; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 22; CHECK-NEXT: da analyze - confused! 23; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx7, align 4 --> Dst: %0 = load i32, ptr %arrayidx7, align 4 24; CHECK-NEXT: da analyze - none! 25; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx7, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 26; CHECK-NEXT: da analyze - confused! 27; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 28; CHECK-NEXT: da analyze - none! 29; 30entry: 31 br label %for.body 32 33for.body: ; preds = %entry, %for.body 34 %i.03 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 35 %conv = trunc i64 %i.03 to i32 36 %mul = shl nsw i64 %i.03, 2 37 %add = add nsw i64 %mul, 10 38 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %add 39 store i32 %conv, ptr %arrayidx, align 4 40 %inc = add nsw i64 %i.03, 1 41 %exitcond5 = icmp ne i64 %inc, 10 42 br i1 %exitcond5, label %for.body, label %for.body4.preheader 43 44for.body4.preheader: ; preds = %for.body 45 br label %for.body4 46 47for.body4: ; preds = %for.body4.preheader, %for.body4 48 %j.02 = phi i64 [ %inc9, %for.body4 ], [ 0, %for.body4.preheader ] 49 %B.addr.01 = phi ptr [ %incdec.ptr, %for.body4 ], [ %B, %for.body4.preheader ] 50 %mul5 = shl nsw i64 %j.02, 1 51 %add64 = or disjoint i64 %mul5, 1 52 %arrayidx7 = getelementptr inbounds i32, ptr %A, i64 %add64 53 %0 = load i32, ptr %arrayidx7, align 4 54 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1 55 store i32 %0, ptr %B.addr.01, align 4 56 %inc9 = add nsw i64 %j.02, 1 57 %exitcond = icmp ne i64 %inc9, 10 58 br i1 %exitcond, label %for.body4, label %for.end10 59 60for.end10: ; preds = %for.body4 61 ret void 62} 63 64 65;; for (long int i = 0; i < 5; i++) 66;; A[11*i - 45] = i; 67;; for (long int j = 0; j < 10; j++) 68;; *B++ = A[j]; 69 70define void @rdiv1(ptr %A, ptr %B) nounwind uwtable ssp { 71; CHECK-LABEL: 'rdiv1' 72; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4 73; CHECK-NEXT: da analyze - none! 74; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx5, align 4 75; CHECK-NEXT: da analyze - none! 76; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 77; CHECK-NEXT: da analyze - confused! 78; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx5, align 4 --> Dst: %0 = load i32, ptr %arrayidx5, align 4 79; CHECK-NEXT: da analyze - none! 80; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx5, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 81; CHECK-NEXT: da analyze - confused! 82; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 83; CHECK-NEXT: da analyze - none! 84; 85entry: 86 br label %for.body 87 88for.body: ; preds = %entry, %for.body 89 %i.03 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 90 %conv = trunc i64 %i.03 to i32 91 %mul = mul nsw i64 %i.03, 11 92 %sub = add nsw i64 %mul, -45 93 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %sub 94 store i32 %conv, ptr %arrayidx, align 4 95 %inc = add nsw i64 %i.03, 1 96 %exitcond4 = icmp ne i64 %inc, 5 97 br i1 %exitcond4, label %for.body, label %for.body4.preheader 98 99for.body4.preheader: ; preds = %for.body 100 br label %for.body4 101 102for.body4: ; preds = %for.body4.preheader, %for.body4 103 %j.02 = phi i64 [ %inc7, %for.body4 ], [ 0, %for.body4.preheader ] 104 %B.addr.01 = phi ptr [ %incdec.ptr, %for.body4 ], [ %B, %for.body4.preheader ] 105 %arrayidx5 = getelementptr inbounds i32, ptr %A, i64 %j.02 106 %0 = load i32, ptr %arrayidx5, align 4 107 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1 108 store i32 %0, ptr %B.addr.01, align 4 109 %inc7 = add nsw i64 %j.02, 1 110 %exitcond = icmp ne i64 %inc7, 10 111 br i1 %exitcond, label %for.body4, label %for.end8 112 113for.end8: ; preds = %for.body4 114 ret void 115} 116 117 118;; for (long int i = 0; i <= 5; i++) 119;; A[11*i - 45] = i; 120;; for (long int j = 0; j < 10; j++) 121;; *B++ = A[j]; 122 123define void @rdiv2(ptr %A, ptr %B) nounwind uwtable ssp { 124; CHECK-LABEL: 'rdiv2' 125; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4 126; CHECK-NEXT: da analyze - none! 127; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx5, align 4 128; CHECK-NEXT: da analyze - none! 129; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 130; CHECK-NEXT: da analyze - confused! 131; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx5, align 4 --> Dst: %0 = load i32, ptr %arrayidx5, align 4 132; CHECK-NEXT: da analyze - none! 133; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx5, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 134; CHECK-NEXT: da analyze - confused! 135; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 136; CHECK-NEXT: da analyze - none! 137; 138entry: 139 br label %for.body 140 141for.body: ; preds = %entry, %for.body 142 %i.03 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 143 %conv = trunc i64 %i.03 to i32 144 %mul = mul nsw i64 %i.03, 11 145 %sub = add nsw i64 %mul, -45 146 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %sub 147 store i32 %conv, ptr %arrayidx, align 4 148 %inc = add nsw i64 %i.03, 1 149 %exitcond4 = icmp ne i64 %inc, 6 150 br i1 %exitcond4, label %for.body, label %for.body4.preheader 151 152for.body4.preheader: ; preds = %for.body 153 br label %for.body4 154 155for.body4: ; preds = %for.body4.preheader, %for.body4 156 %j.02 = phi i64 [ %inc7, %for.body4 ], [ 0, %for.body4.preheader ] 157 %B.addr.01 = phi ptr [ %incdec.ptr, %for.body4 ], [ %B, %for.body4.preheader ] 158 %arrayidx5 = getelementptr inbounds i32, ptr %A, i64 %j.02 159 %0 = load i32, ptr %arrayidx5, align 4 160 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1 161 store i32 %0, ptr %B.addr.01, align 4 162 %inc7 = add nsw i64 %j.02, 1 163 %exitcond = icmp ne i64 %inc7, 10 164 br i1 %exitcond, label %for.body4, label %for.end8 165 166for.end8: ; preds = %for.body4 167 ret void 168} 169 170 171;; for (long int i = 0; i < 5; i++) 172;; A[11*i - 45] = i; 173;; for (long int j = 0; j <= 10; j++) 174;; *B++ = A[j]; 175 176define void @rdiv3(ptr %A, ptr %B) nounwind uwtable ssp { 177; CHECK-LABEL: 'rdiv3' 178; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4 179; CHECK-NEXT: da analyze - none! 180; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx5, align 4 181; CHECK-NEXT: da analyze - none! 182; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 183; CHECK-NEXT: da analyze - confused! 184; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx5, align 4 --> Dst: %0 = load i32, ptr %arrayidx5, align 4 185; CHECK-NEXT: da analyze - none! 186; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx5, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 187; CHECK-NEXT: da analyze - confused! 188; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 189; CHECK-NEXT: da analyze - none! 190; 191entry: 192 br label %for.body 193 194for.body: ; preds = %entry, %for.body 195 %i.03 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 196 %conv = trunc i64 %i.03 to i32 197 %mul = mul nsw i64 %i.03, 11 198 %sub = add nsw i64 %mul, -45 199 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %sub 200 store i32 %conv, ptr %arrayidx, align 4 201 %inc = add nsw i64 %i.03, 1 202 %exitcond4 = icmp ne i64 %inc, 5 203 br i1 %exitcond4, label %for.body, label %for.body4.preheader 204 205for.body4.preheader: ; preds = %for.body 206 br label %for.body4 207 208for.body4: ; preds = %for.body4.preheader, %for.body4 209 %j.02 = phi i64 [ %inc7, %for.body4 ], [ 0, %for.body4.preheader ] 210 %B.addr.01 = phi ptr [ %incdec.ptr, %for.body4 ], [ %B, %for.body4.preheader ] 211 %arrayidx5 = getelementptr inbounds i32, ptr %A, i64 %j.02 212 %0 = load i32, ptr %arrayidx5, align 4 213 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1 214 store i32 %0, ptr %B.addr.01, align 4 215 %inc7 = add nsw i64 %j.02, 1 216 %exitcond = icmp ne i64 %inc7, 11 217 br i1 %exitcond, label %for.body4, label %for.end8 218 219for.end8: ; preds = %for.body4 220 ret void 221} 222 223 224;; for (long int i = 0; i <= 5; i++) 225;; A[11*i - 45] = i; 226;; for (long int j = 0; j <= 10; j++) 227;; *B++ = A[j]; 228 229define void @rdiv4(ptr %A, ptr %B) nounwind uwtable ssp { 230; CHECK-LABEL: 'rdiv4' 231; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4 232; CHECK-NEXT: da analyze - none! 233; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx5, align 4 234; CHECK-NEXT: da analyze - flow [|<]! 235; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 236; CHECK-NEXT: da analyze - confused! 237; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx5, align 4 --> Dst: %0 = load i32, ptr %arrayidx5, align 4 238; CHECK-NEXT: da analyze - none! 239; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx5, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 240; CHECK-NEXT: da analyze - confused! 241; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 242; CHECK-NEXT: da analyze - none! 243; 244entry: 245 br label %for.body 246 247for.body: ; preds = %entry, %for.body 248 %i.03 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 249 %conv = trunc i64 %i.03 to i32 250 %mul = mul nsw i64 %i.03, 11 251 %sub = add nsw i64 %mul, -45 252 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %sub 253 store i32 %conv, ptr %arrayidx, align 4 254 %inc = add nsw i64 %i.03, 1 255 %exitcond4 = icmp ne i64 %inc, 6 256 br i1 %exitcond4, label %for.body, label %for.body4.preheader 257 258for.body4.preheader: ; preds = %for.body 259 br label %for.body4 260 261for.body4: ; preds = %for.body4.preheader, %for.body4 262 %j.02 = phi i64 [ %inc7, %for.body4 ], [ 0, %for.body4.preheader ] 263 %B.addr.01 = phi ptr [ %incdec.ptr, %for.body4 ], [ %B, %for.body4.preheader ] 264 %arrayidx5 = getelementptr inbounds i32, ptr %A, i64 %j.02 265 %0 = load i32, ptr %arrayidx5, align 4 266 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1 267 store i32 %0, ptr %B.addr.01, align 4 268 %inc7 = add nsw i64 %j.02, 1 269 %exitcond = icmp ne i64 %inc7, 11 270 br i1 %exitcond, label %for.body4, label %for.end8 271 272for.end8: ; preds = %for.body4 273 ret void 274} 275 276 277;; for (long int i = 0; i < 5; i++) 278;; A[-11*i + 45] = i; 279;; for (long int j = 0; j < 10; j++) 280;; *B++ = A[-j]; 281 282define void @rdiv5(ptr %A, ptr %B) nounwind uwtable ssp { 283; CHECK-LABEL: 'rdiv5' 284; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4 285; CHECK-NEXT: da analyze - none! 286; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx5, align 4 287; CHECK-NEXT: da analyze - none! 288; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 289; CHECK-NEXT: da analyze - confused! 290; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx5, align 4 --> Dst: %0 = load i32, ptr %arrayidx5, align 4 291; CHECK-NEXT: da analyze - none! 292; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx5, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 293; CHECK-NEXT: da analyze - confused! 294; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 295; CHECK-NEXT: da analyze - none! 296; 297entry: 298 br label %for.body 299 300for.body: ; preds = %entry, %for.body 301 %i.03 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 302 %conv = trunc i64 %i.03 to i32 303 %mul = mul nsw i64 %i.03, -11 304 %add = add nsw i64 %mul, 45 305 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %add 306 store i32 %conv, ptr %arrayidx, align 4 307 %inc = add nsw i64 %i.03, 1 308 %exitcond4 = icmp ne i64 %inc, 5 309 br i1 %exitcond4, label %for.body, label %for.body4.preheader 310 311for.body4.preheader: ; preds = %for.body 312 br label %for.body4 313 314for.body4: ; preds = %for.body4.preheader, %for.body4 315 %j.02 = phi i64 [ %inc7, %for.body4 ], [ 0, %for.body4.preheader ] 316 %B.addr.01 = phi ptr [ %incdec.ptr, %for.body4 ], [ %B, %for.body4.preheader ] 317 %sub = sub nsw i64 0, %j.02 318 %arrayidx5 = getelementptr inbounds i32, ptr %A, i64 %sub 319 %0 = load i32, ptr %arrayidx5, align 4 320 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1 321 store i32 %0, ptr %B.addr.01, align 4 322 %inc7 = add nsw i64 %j.02, 1 323 %exitcond = icmp ne i64 %inc7, 10 324 br i1 %exitcond, label %for.body4, label %for.end8 325 326for.end8: ; preds = %for.body4 327 ret void 328} 329 330 331;; for (long int i = 0; i <= 5; i++) 332;; A[-11*i + 45] = i; 333;; for (long int j = 0; j < 10; j++) 334;; *B++ = A[-j]; 335 336define void @rdiv6(ptr %A, ptr %B) nounwind uwtable ssp { 337; CHECK-LABEL: 'rdiv6' 338; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4 339; CHECK-NEXT: da analyze - none! 340; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx5, align 4 341; CHECK-NEXT: da analyze - none! 342; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 343; CHECK-NEXT: da analyze - confused! 344; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx5, align 4 --> Dst: %0 = load i32, ptr %arrayidx5, align 4 345; CHECK-NEXT: da analyze - none! 346; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx5, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 347; CHECK-NEXT: da analyze - confused! 348; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 349; CHECK-NEXT: da analyze - none! 350; 351entry: 352 br label %for.body 353 354for.body: ; preds = %entry, %for.body 355 %i.03 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 356 %conv = trunc i64 %i.03 to i32 357 %mul = mul nsw i64 %i.03, -11 358 %add = add nsw i64 %mul, 45 359 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %add 360 store i32 %conv, ptr %arrayidx, align 4 361 %inc = add nsw i64 %i.03, 1 362 %exitcond4 = icmp ne i64 %inc, 6 363 br i1 %exitcond4, label %for.body, label %for.body4.preheader 364 365for.body4.preheader: ; preds = %for.body 366 br label %for.body4 367 368for.body4: ; preds = %for.body4.preheader, %for.body4 369 %j.02 = phi i64 [ %inc7, %for.body4 ], [ 0, %for.body4.preheader ] 370 %B.addr.01 = phi ptr [ %incdec.ptr, %for.body4 ], [ %B, %for.body4.preheader ] 371 %sub = sub nsw i64 0, %j.02 372 %arrayidx5 = getelementptr inbounds i32, ptr %A, i64 %sub 373 %0 = load i32, ptr %arrayidx5, align 4 374 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1 375 store i32 %0, ptr %B.addr.01, align 4 376 %inc7 = add nsw i64 %j.02, 1 377 %exitcond = icmp ne i64 %inc7, 10 378 br i1 %exitcond, label %for.body4, label %for.end8 379 380for.end8: ; preds = %for.body4 381 ret void 382} 383 384 385;; for (long int i = 0; i < 5; i++) 386;; A[-11*i + 45] = i; 387;; for (long int j = 0; j <= 10; j++) 388;; *B++ = A[-j]; 389 390define void @rdiv7(ptr %A, ptr %B) nounwind uwtable ssp { 391; CHECK-LABEL: 'rdiv7' 392; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4 393; CHECK-NEXT: da analyze - none! 394; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx5, align 4 395; CHECK-NEXT: da analyze - none! 396; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 397; CHECK-NEXT: da analyze - confused! 398; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx5, align 4 --> Dst: %0 = load i32, ptr %arrayidx5, align 4 399; CHECK-NEXT: da analyze - none! 400; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx5, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 401; CHECK-NEXT: da analyze - confused! 402; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 403; CHECK-NEXT: da analyze - none! 404; 405entry: 406 br label %for.body 407 408for.body: ; preds = %entry, %for.body 409 %i.03 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 410 %conv = trunc i64 %i.03 to i32 411 %mul = mul nsw i64 %i.03, -11 412 %add = add nsw i64 %mul, 45 413 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %add 414 store i32 %conv, ptr %arrayidx, align 4 415 %inc = add nsw i64 %i.03, 1 416 %exitcond4 = icmp ne i64 %inc, 5 417 br i1 %exitcond4, label %for.body, label %for.body4.preheader 418 419for.body4.preheader: ; preds = %for.body 420 br label %for.body4 421 422for.body4: ; preds = %for.body4.preheader, %for.body4 423 %j.02 = phi i64 [ %inc7, %for.body4 ], [ 0, %for.body4.preheader ] 424 %B.addr.01 = phi ptr [ %incdec.ptr, %for.body4 ], [ %B, %for.body4.preheader ] 425 %sub = sub nsw i64 0, %j.02 426 %arrayidx5 = getelementptr inbounds i32, ptr %A, i64 %sub 427 %0 = load i32, ptr %arrayidx5, align 4 428 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1 429 store i32 %0, ptr %B.addr.01, align 4 430 %inc7 = add nsw i64 %j.02, 1 431 %exitcond = icmp ne i64 %inc7, 11 432 br i1 %exitcond, label %for.body4, label %for.end8 433 434for.end8: ; preds = %for.body4 435 ret void 436} 437 438 439;; for (long int i = 0; i <= 5; i++) 440;; A[-11*i + 45] = i; 441;; for (long int j = 0; j <= 10; j++) 442;; *B++ = A[-j]; 443 444define void @rdiv8(ptr %A, ptr %B) nounwind uwtable ssp { 445; CHECK-LABEL: 'rdiv8' 446; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4 447; CHECK-NEXT: da analyze - none! 448; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx5, align 4 449; CHECK-NEXT: da analyze - flow [|<]! 450; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 451; CHECK-NEXT: da analyze - confused! 452; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx5, align 4 --> Dst: %0 = load i32, ptr %arrayidx5, align 4 453; CHECK-NEXT: da analyze - none! 454; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx5, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 455; CHECK-NEXT: da analyze - confused! 456; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 457; CHECK-NEXT: da analyze - none! 458; 459entry: 460 br label %for.body 461 462for.body: ; preds = %entry, %for.body 463 %i.03 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 464 %conv = trunc i64 %i.03 to i32 465 %mul = mul nsw i64 %i.03, -11 466 %add = add nsw i64 %mul, 45 467 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %add 468 store i32 %conv, ptr %arrayidx, align 4 469 %inc = add nsw i64 %i.03, 1 470 %exitcond4 = icmp ne i64 %inc, 6 471 br i1 %exitcond4, label %for.body, label %for.body4.preheader 472 473for.body4.preheader: ; preds = %for.body 474 br label %for.body4 475 476for.body4: ; preds = %for.body4.preheader, %for.body4 477 %j.02 = phi i64 [ %inc7, %for.body4 ], [ 0, %for.body4.preheader ] 478 %B.addr.01 = phi ptr [ %incdec.ptr, %for.body4 ], [ %B, %for.body4.preheader ] 479 %sub = sub nsw i64 0, %j.02 480 %arrayidx5 = getelementptr inbounds i32, ptr %A, i64 %sub 481 %0 = load i32, ptr %arrayidx5, align 4 482 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1 483 store i32 %0, ptr %B.addr.01, align 4 484 %inc7 = add nsw i64 %j.02, 1 485 %exitcond = icmp ne i64 %inc7, 11 486 br i1 %exitcond, label %for.body4, label %for.end8 487 488for.end8: ; preds = %for.body4 489 ret void 490} 491 492 493;; for (long int i = 0; i < 5; i++) 494;; for (long int j = 0; j < 10; j++) { 495;; A[11*i - j] = i; 496;; *B++ = A[45]; 497 498define void @rdiv9(ptr %A, ptr %B) nounwind uwtable ssp { 499; CHECK-LABEL: 'rdiv9' 500; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4 501; CHECK-NEXT: da analyze - none! 502; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx4, align 4 503; CHECK-NEXT: da analyze - none! 504; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4 505; CHECK-NEXT: da analyze - confused! 506; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx4, align 4 --> Dst: %0 = load i32, ptr %arrayidx4, align 4 507; CHECK-NEXT: da analyze - consistent input [S S]! 508; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx4, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4 509; CHECK-NEXT: da analyze - confused! 510; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.11, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4 511; CHECK-NEXT: da analyze - none! 512; 513entry: 514 br label %for.cond1.preheader 515 516for.cond1.preheader: ; preds = %entry, %for.inc5 517 %B.addr.04 = phi ptr [ %B, %entry ], [ %scevgep, %for.inc5 ] 518 %i.03 = phi i64 [ 0, %entry ], [ %inc6, %for.inc5 ] 519 br label %for.body3 520 521for.body3: ; preds = %for.cond1.preheader, %for.body3 522 %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ] 523 %B.addr.11 = phi ptr [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ] 524 %conv = trunc i64 %i.03 to i32 525 %mul = mul nsw i64 %i.03, 11 526 %sub = sub nsw i64 %mul, %j.02 527 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %sub 528 store i32 %conv, ptr %arrayidx, align 4 529 %arrayidx4 = getelementptr inbounds i32, ptr %A, i64 45 530 %0 = load i32, ptr %arrayidx4, align 4 531 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.11, i64 1 532 store i32 %0, ptr %B.addr.11, align 4 533 %inc = add nsw i64 %j.02, 1 534 %exitcond = icmp ne i64 %inc, 10 535 br i1 %exitcond, label %for.body3, label %for.inc5 536 537for.inc5: ; preds = %for.body3 538 %scevgep = getelementptr i32, ptr %B.addr.04, i64 10 539 %inc6 = add nsw i64 %i.03, 1 540 %exitcond5 = icmp ne i64 %inc6, 5 541 br i1 %exitcond5, label %for.cond1.preheader, label %for.end7 542 543for.end7: ; preds = %for.inc5 544 ret void 545} 546 547 548 549;; for (long int i = 0; i <= 5; i++) 550;; for (long int j = 0; j < 10; j++) { 551;; A[11*i - j] = i; 552;; *B++ = A[45]; 553 554define void @rdiv10(ptr %A, ptr %B) nounwind uwtable ssp { 555; CHECK-LABEL: 'rdiv10' 556; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4 557; CHECK-NEXT: da analyze - none! 558; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx4, align 4 559; CHECK-NEXT: da analyze - none! 560; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4 561; CHECK-NEXT: da analyze - confused! 562; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx4, align 4 --> Dst: %0 = load i32, ptr %arrayidx4, align 4 563; CHECK-NEXT: da analyze - consistent input [S S]! 564; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx4, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4 565; CHECK-NEXT: da analyze - confused! 566; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.11, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4 567; CHECK-NEXT: da analyze - none! 568; 569entry: 570 br label %for.cond1.preheader 571 572for.cond1.preheader: ; preds = %entry, %for.inc5 573 %B.addr.04 = phi ptr [ %B, %entry ], [ %scevgep, %for.inc5 ] 574 %i.03 = phi i64 [ 0, %entry ], [ %inc6, %for.inc5 ] 575 br label %for.body3 576 577for.body3: ; preds = %for.cond1.preheader, %for.body3 578 %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ] 579 %B.addr.11 = phi ptr [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ] 580 %conv = trunc i64 %i.03 to i32 581 %mul = mul nsw i64 %i.03, 11 582 %sub = sub nsw i64 %mul, %j.02 583 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %sub 584 store i32 %conv, ptr %arrayidx, align 4 585 %arrayidx4 = getelementptr inbounds i32, ptr %A, i64 45 586 %0 = load i32, ptr %arrayidx4, align 4 587 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.11, i64 1 588 store i32 %0, ptr %B.addr.11, align 4 589 %inc = add nsw i64 %j.02, 1 590 %exitcond = icmp ne i64 %inc, 10 591 br i1 %exitcond, label %for.body3, label %for.inc5 592 593for.inc5: ; preds = %for.body3 594 %scevgep = getelementptr i32, ptr %B.addr.04, i64 10 595 %inc6 = add nsw i64 %i.03, 1 596 %exitcond5 = icmp ne i64 %inc6, 6 597 br i1 %exitcond5, label %for.cond1.preheader, label %for.end7 598 599for.end7: ; preds = %for.inc5 600 ret void 601} 602 603 604;; for (long int i = 0; i < 5; i++) 605;; for (long int j = 0; j <= 10; j++) { 606;; A[11*i - j] = i; 607;; *B++ = A[45]; 608 609define void @rdiv11(ptr %A, ptr %B) nounwind uwtable ssp { 610; CHECK-LABEL: 'rdiv11' 611; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4 612; CHECK-NEXT: da analyze - none! 613; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx4, align 4 614; CHECK-NEXT: da analyze - none! 615; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4 616; CHECK-NEXT: da analyze - confused! 617; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx4, align 4 --> Dst: %0 = load i32, ptr %arrayidx4, align 4 618; CHECK-NEXT: da analyze - consistent input [S S]! 619; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx4, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4 620; CHECK-NEXT: da analyze - confused! 621; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.11, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4 622; CHECK-NEXT: da analyze - none! 623; 624entry: 625 br label %for.cond1.preheader 626 627for.cond1.preheader: ; preds = %entry, %for.inc5 628 %B.addr.04 = phi ptr [ %B, %entry ], [ %scevgep, %for.inc5 ] 629 %i.03 = phi i64 [ 0, %entry ], [ %inc6, %for.inc5 ] 630 br label %for.body3 631 632for.body3: ; preds = %for.cond1.preheader, %for.body3 633 %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ] 634 %B.addr.11 = phi ptr [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ] 635 %conv = trunc i64 %i.03 to i32 636 %mul = mul nsw i64 %i.03, 11 637 %sub = sub nsw i64 %mul, %j.02 638 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %sub 639 store i32 %conv, ptr %arrayidx, align 4 640 %arrayidx4 = getelementptr inbounds i32, ptr %A, i64 45 641 %0 = load i32, ptr %arrayidx4, align 4 642 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.11, i64 1 643 store i32 %0, ptr %B.addr.11, align 4 644 %inc = add nsw i64 %j.02, 1 645 %exitcond = icmp ne i64 %inc, 11 646 br i1 %exitcond, label %for.body3, label %for.inc5 647 648for.inc5: ; preds = %for.body3 649 %scevgep = getelementptr i32, ptr %B.addr.04, i64 11 650 %inc6 = add nsw i64 %i.03, 1 651 %exitcond5 = icmp ne i64 %inc6, 5 652 br i1 %exitcond5, label %for.cond1.preheader, label %for.end7 653 654for.end7: ; preds = %for.inc5 655 ret void 656} 657 658 659;; for (long int i = 0; i <= 5; i++) 660;; for (long int j = 0; j <= 10; j++) { 661;; A[11*i - j] = i; 662;; *B++ = A[45]; 663 664define void @rdiv12(ptr %A, ptr %B) nounwind uwtable ssp { 665; CHECK-LABEL: 'rdiv12' 666; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4 667; CHECK-NEXT: da analyze - none! 668; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx4, align 4 669; CHECK-NEXT: da analyze - flow [* *|<]! 670; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4 671; CHECK-NEXT: da analyze - confused! 672; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx4, align 4 --> Dst: %0 = load i32, ptr %arrayidx4, align 4 673; CHECK-NEXT: da analyze - consistent input [S S]! 674; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx4, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4 675; CHECK-NEXT: da analyze - confused! 676; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.11, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4 677; CHECK-NEXT: da analyze - none! 678; 679entry: 680 br label %for.cond1.preheader 681 682for.cond1.preheader: ; preds = %entry, %for.inc5 683 %B.addr.04 = phi ptr [ %B, %entry ], [ %scevgep, %for.inc5 ] 684 %i.03 = phi i64 [ 0, %entry ], [ %inc6, %for.inc5 ] 685 br label %for.body3 686 687for.body3: ; preds = %for.cond1.preheader, %for.body3 688 %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ] 689 %B.addr.11 = phi ptr [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ] 690 %conv = trunc i64 %i.03 to i32 691 %mul = mul nsw i64 %i.03, 11 692 %sub = sub nsw i64 %mul, %j.02 693 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %sub 694 store i32 %conv, ptr %arrayidx, align 4 695 %arrayidx4 = getelementptr inbounds i32, ptr %A, i64 45 696 %0 = load i32, ptr %arrayidx4, align 4 697 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.11, i64 1 698 store i32 %0, ptr %B.addr.11, align 4 699 %inc = add nsw i64 %j.02, 1 700 %exitcond = icmp ne i64 %inc, 11 701 br i1 %exitcond, label %for.body3, label %for.inc5 702 703for.inc5: ; preds = %for.body3 704 %scevgep = getelementptr i32, ptr %B.addr.04, i64 11 705 %inc6 = add nsw i64 %i.03, 1 706 %exitcond5 = icmp ne i64 %inc6, 6 707 br i1 %exitcond5, label %for.cond1.preheader, label %for.end7 708 709for.end7: ; preds = %for.inc5 710 ret void 711} 712