1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 3 2; RUN: opt -passes='print<access-info>' -disable-output %s 2>&1 | FileCheck %s 3 4define void @test_invar_dependence_before_positive_strided_access_1(ptr %a) { 5; CHECK-LABEL: 'test_invar_dependence_before_positive_strided_access_1' 6; CHECK-NEXT: loop: 7; CHECK-NEXT: Memory dependences are safe 8; CHECK-NEXT: Dependences: 9; CHECK-NEXT: Run-time memory checks: 10; CHECK-NEXT: Grouped accesses: 11; CHECK-EMPTY: 12; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop. 13; CHECK-NEXT: SCEV assumptions: 14; CHECK-EMPTY: 15; CHECK-NEXT: Expressions re-written: 16; 17entry: 18 %gep.off = getelementptr i8, ptr %a, i32 4 19 br label %loop 20 21loop: 22 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ] 23 %gep = getelementptr i32, ptr %gep.off, i32 %iv 24 %l = load i32, ptr %a 25 store i32 %l, ptr %gep 26 %iv.next = add i32 %iv, 1 27 %ec = icmp eq i32 %iv.next, 100 28 br i1 %ec, label %exit, label %loop 29 30exit: 31 ret void 32} 33 34define void @test_invar_dependence_before_positive_strided_access_2(ptr %a) { 35; CHECK-LABEL: 'test_invar_dependence_before_positive_strided_access_2' 36; CHECK-NEXT: loop: 37; CHECK-NEXT: Memory dependences are safe 38; CHECK-NEXT: Dependences: 39; CHECK-NEXT: Run-time memory checks: 40; CHECK-NEXT: Grouped accesses: 41; CHECK-EMPTY: 42; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop. 43; CHECK-NEXT: SCEV assumptions: 44; CHECK-EMPTY: 45; CHECK-NEXT: Expressions re-written: 46; 47entry: 48 %gep.off = getelementptr i8, ptr %a, i32 4 49 br label %loop 50 51loop: 52 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ] 53 %gep = getelementptr i32, ptr %gep.off, i32 %iv 54 %l = load i32, ptr %gep 55 store i32 %l, ptr %a 56 %iv.next = add i32 %iv, 1 57 %ec = icmp eq i32 %iv.next, 100 58 br i1 %ec, label %exit, label %loop 59 60exit: 61 ret void 62} 63 64define void @test_invar_dependence_not_before_positive_strided_access_1(ptr %a) { 65; CHECK-LABEL: 'test_invar_dependence_not_before_positive_strided_access_1' 66; CHECK-NEXT: loop: 67; CHECK-NEXT: Report: unsafe dependent memory operations in loop. Use #pragma clang loop distribute(enable) to allow loop distribution to attempt to isolate the offending operations into a separate loop 68; CHECK-NEXT: Unknown data dependence. 69; CHECK-NEXT: Dependences: 70; CHECK-NEXT: Unknown: 71; CHECK-NEXT: %l = load i32, ptr %a, align 4 -> 72; CHECK-NEXT: store i32 %l, ptr %gep, align 4 73; CHECK-EMPTY: 74; CHECK-NEXT: Run-time memory checks: 75; CHECK-NEXT: Grouped accesses: 76; CHECK-EMPTY: 77; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop. 78; CHECK-NEXT: SCEV assumptions: 79; CHECK-EMPTY: 80; CHECK-NEXT: Expressions re-written: 81; 82entry: 83 %gep.off = getelementptr i8, ptr %a, i32 3 84 br label %loop 85 86loop: 87 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ] 88 %gep = getelementptr i32, ptr %gep.off, i32 %iv 89 %l = load i32, ptr %a 90 store i32 %l, ptr %gep 91 %iv.next = add i32 %iv, 1 92 %ec = icmp eq i32 %iv.next, 100 93 br i1 %ec, label %exit, label %loop 94 95exit: 96 ret void 97} 98 99define void @test_invar_dependence_not_before_positive_strided_access_2(ptr %a) { 100; CHECK-LABEL: 'test_invar_dependence_not_before_positive_strided_access_2' 101; CHECK-NEXT: loop: 102; CHECK-NEXT: Report: unsafe dependent memory operations in loop. Use #pragma clang loop distribute(enable) to allow loop distribution to attempt to isolate the offending operations into a separate loop 103; CHECK-NEXT: Unknown data dependence. 104; CHECK-NEXT: Dependences: 105; CHECK-NEXT: Unknown: 106; CHECK-NEXT: %l = load i32, ptr %gep, align 4 -> 107; CHECK-NEXT: store i32 %l, ptr %a, align 4 108; CHECK-EMPTY: 109; CHECK-NEXT: Run-time memory checks: 110; CHECK-NEXT: Grouped accesses: 111; CHECK-EMPTY: 112; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop. 113; CHECK-NEXT: SCEV assumptions: 114; CHECK-EMPTY: 115; CHECK-NEXT: Expressions re-written: 116; 117entry: 118 %gep.off = getelementptr i8, ptr %a, i32 3 119 br label %loop 120 121loop: 122 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ] 123 %gep = getelementptr i32, ptr %gep.off, i32 %iv 124 %l = load i32, ptr %gep 125 store i32 %l, ptr %a 126 %iv.next = add i32 %iv, 1 127 %ec = icmp eq i32 %iv.next, 100 128 br i1 %ec, label %exit, label %loop 129 130exit: 131 ret void 132} 133 134define void @test_invar_dependence_before_positive_strided_access_1_different_access_sizes(ptr %a) { 135; CHECK-LABEL: 'test_invar_dependence_before_positive_strided_access_1_different_access_sizes' 136; CHECK-NEXT: loop: 137; CHECK-NEXT: Memory dependences are safe 138; CHECK-NEXT: Dependences: 139; CHECK-NEXT: Run-time memory checks: 140; CHECK-NEXT: Grouped accesses: 141; CHECK-EMPTY: 142; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop. 143; CHECK-NEXT: SCEV assumptions: 144; CHECK-EMPTY: 145; CHECK-NEXT: Expressions re-written: 146; 147entry: 148 %gep.off = getelementptr i8, ptr %a, i32 4 149 br label %loop 150 151loop: 152 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ] 153 %gep = getelementptr i32, ptr %gep.off, i32 %iv 154 %l = load i32, ptr %a 155 %t = trunc i32 %l to i8 156 store i8 %t, ptr %gep 157 %iv.next = add i32 %iv, 1 158 %ec = icmp eq i32 %iv.next, 100 159 br i1 %ec, label %exit, label %loop 160 161exit: 162 ret void 163} 164 165define void @test_invar_dependence_not_before_positive_strided_access_1_different_access_sizes(ptr %a) { 166; CHECK-LABEL: 'test_invar_dependence_not_before_positive_strided_access_1_different_access_sizes' 167; CHECK-NEXT: loop: 168; CHECK-NEXT: Report: unsafe dependent memory operations in loop. Use #pragma clang loop distribute(enable) to allow loop distribution to attempt to isolate the offending operations into a separate loop 169; CHECK-NEXT: Unknown data dependence. 170; CHECK-NEXT: Dependences: 171; CHECK-NEXT: Unknown: 172; CHECK-NEXT: %l = load i64, ptr %a, align 4 -> 173; CHECK-NEXT: store i32 %t, ptr %gep, align 4 174; CHECK-EMPTY: 175; CHECK-NEXT: Run-time memory checks: 176; CHECK-NEXT: Grouped accesses: 177; CHECK-EMPTY: 178; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop. 179; CHECK-NEXT: SCEV assumptions: 180; CHECK-EMPTY: 181; CHECK-NEXT: Expressions re-written: 182; 183entry: 184 %gep.off = getelementptr i8, ptr %a, i32 4 185 br label %loop 186 187loop: 188 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ] 189 %gep = getelementptr i32, ptr %gep.off, i32 %iv 190 %l = load i64, ptr %a 191 %t = trunc i64 %l to i32 192 store i32 %t, ptr %gep 193 %iv.next = add i32 %iv, 1 194 %ec = icmp eq i32 %iv.next, 100 195 br i1 %ec, label %exit, label %loop 196 197exit: 198 ret void 199} 200 201define void @test_invar_dependence_before_negative_strided_access_1(ptr %a) { 202; CHECK-LABEL: 'test_invar_dependence_before_negative_strided_access_1' 203; CHECK-NEXT: loop: 204; CHECK-NEXT: Memory dependences are safe 205; CHECK-NEXT: Dependences: 206; CHECK-NEXT: Run-time memory checks: 207; CHECK-NEXT: Grouped accesses: 208; CHECK-EMPTY: 209; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop. 210; CHECK-NEXT: SCEV assumptions: 211; CHECK-EMPTY: 212; CHECK-NEXT: Expressions re-written: 213; 214entry: 215 %gep.off = getelementptr i32, ptr %a, i32 100 216 br label %loop 217 218loop: 219 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ] 220 %gep = getelementptr i32, ptr %gep.off, i32 %iv 221 %l = load i32, ptr %a 222 store i32 %l, ptr %gep 223 %iv.next = sub i32 %iv, 1 224 %ec = icmp eq i32 %iv.next, -100 225 br i1 %ec, label %exit, label %loop 226 227exit: 228 ret void 229} 230 231define void @test_invar_dependence_before_negative_strided_access_2(ptr %a) { 232; CHECK-LABEL: 'test_invar_dependence_before_negative_strided_access_2' 233; CHECK-NEXT: loop: 234; CHECK-NEXT: Memory dependences are safe 235; CHECK-NEXT: Dependences: 236; CHECK-NEXT: Run-time memory checks: 237; CHECK-NEXT: Grouped accesses: 238; CHECK-EMPTY: 239; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop. 240; CHECK-NEXT: SCEV assumptions: 241; CHECK-EMPTY: 242; CHECK-NEXT: Expressions re-written: 243; 244entry: 245 %gep.off = getelementptr i32, ptr %a, i32 100 246 br label %loop 247 248loop: 249 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ] 250 %gep = getelementptr i32, ptr %gep.off, i32 %iv 251 %l = load i32, ptr %gep 252 store i32 %l, ptr %a 253 %iv.next = sub i32 %iv, 1 254 %ec = icmp eq i32 %iv.next, -100 255 br i1 %ec, label %exit, label %loop 256 257exit: 258 ret void 259} 260 261 262define void @test_invar_dependence_not_before_negative_strided_access_1(ptr %a) { 263; CHECK-LABEL: 'test_invar_dependence_not_before_negative_strided_access_1' 264; CHECK-NEXT: loop: 265; CHECK-NEXT: Report: unsafe dependent memory operations in loop. Use #pragma clang loop distribute(enable) to allow loop distribution to attempt to isolate the offending operations into a separate loop 266; CHECK-NEXT: Unknown data dependence. 267; CHECK-NEXT: Dependences: 268; CHECK-NEXT: Unknown: 269; CHECK-NEXT: %l = load i32, ptr %a, align 4 -> 270; CHECK-NEXT: store i32 %l, ptr %gep, align 4 271; CHECK-EMPTY: 272; CHECK-NEXT: Run-time memory checks: 273; CHECK-NEXT: Grouped accesses: 274; CHECK-EMPTY: 275; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop. 276; CHECK-NEXT: SCEV assumptions: 277; CHECK-EMPTY: 278; CHECK-NEXT: Expressions re-written: 279; 280entry: 281 %gep.off = getelementptr i32, ptr %a, i32 99 282 br label %loop 283 284loop: 285 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ] 286 %gep = getelementptr i32, ptr %gep.off, i32 %iv 287 %l = load i32, ptr %a 288 store i32 %l, ptr %gep 289 %iv.next = sub i32 %iv, 1 290 %ec = icmp eq i32 %iv.next, -100 291 br i1 %ec, label %exit, label %loop 292 293exit: 294 ret void 295} 296 297define void @test_invar_dependence_not_before_negative_strided_access_2(ptr %a) { 298; CHECK-LABEL: 'test_invar_dependence_not_before_negative_strided_access_2' 299; CHECK-NEXT: loop: 300; CHECK-NEXT: Report: unsafe dependent memory operations in loop. Use #pragma clang loop distribute(enable) to allow loop distribution to attempt to isolate the offending operations into a separate loop 301; CHECK-NEXT: Unknown data dependence. 302; CHECK-NEXT: Dependences: 303; CHECK-NEXT: Unknown: 304; CHECK-NEXT: %l = load i32, ptr %gep, align 4 -> 305; CHECK-NEXT: store i32 %l, ptr %a, align 4 306; CHECK-EMPTY: 307; CHECK-NEXT: Run-time memory checks: 308; CHECK-NEXT: Grouped accesses: 309; CHECK-EMPTY: 310; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop. 311; CHECK-NEXT: SCEV assumptions: 312; CHECK-EMPTY: 313; CHECK-NEXT: Expressions re-written: 314; 315entry: 316 %gep.off = getelementptr i32, ptr %a, i32 99 317 br label %loop 318 319loop: 320 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ] 321 %gep = getelementptr i32, ptr %gep.off, i32 %iv 322 %l = load i32, ptr %gep 323 store i32 %l, ptr %a 324 %iv.next = sub i32 %iv, 1 325 %ec = icmp eq i32 %iv.next, -100 326 br i1 %ec, label %exit, label %loop 327 328exit: 329 ret void 330} 331 332define void @test_both_invar_before_1(ptr %a) { 333; CHECK-LABEL: 'test_both_invar_before_1' 334; CHECK-NEXT: loop: 335; CHECK-NEXT: Memory dependences are safe 336; CHECK-NEXT: Dependences: 337; CHECK-NEXT: Run-time memory checks: 338; CHECK-NEXT: Grouped accesses: 339; CHECK-EMPTY: 340; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop. 341; CHECK-NEXT: SCEV assumptions: 342; CHECK-EMPTY: 343; CHECK-NEXT: Expressions re-written: 344; 345entry: 346 %gep.off = getelementptr i8, ptr %a, i32 4 347 br label %loop 348 349loop: 350 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ] 351 %l = load i32, ptr %a 352 store i32 %l, ptr %gep.off 353 %iv.next = add i32 %iv, 1 354 %ec = icmp eq i32 %iv.next, 100 355 br i1 %ec, label %exit, label %loop 356 357exit: 358 ret void 359} 360 361define void @test_both_invar_before_2(ptr %a) { 362; CHECK-LABEL: 'test_both_invar_before_2' 363; CHECK-NEXT: loop: 364; CHECK-NEXT: Memory dependences are safe 365; CHECK-NEXT: Dependences: 366; CHECK-NEXT: Run-time memory checks: 367; CHECK-NEXT: Grouped accesses: 368; CHECK-EMPTY: 369; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop. 370; CHECK-NEXT: SCEV assumptions: 371; CHECK-EMPTY: 372; CHECK-NEXT: Expressions re-written: 373; 374entry: 375 %gep.off = getelementptr i8, ptr %a, i32 4 376 br label %loop 377 378loop: 379 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ] 380 %l = load i32, ptr %gep.off 381 store i32 %l, ptr %a 382 %iv.next = add i32 %iv, 1 383 %ec = icmp eq i32 %iv.next, 100 384 br i1 %ec, label %exit, label %loop 385 386exit: 387 ret void 388} 389 390define void @test_both_invar_not_before_1(ptr %a) { 391; CHECK-LABEL: 'test_both_invar_not_before_1' 392; CHECK-NEXT: loop: 393; CHECK-NEXT: Report: unsafe dependent memory operations in loop. Use #pragma clang loop distribute(enable) to allow loop distribution to attempt to isolate the offending operations into a separate loop 394; CHECK-NEXT: Unknown data dependence. 395; CHECK-NEXT: Dependences: 396; CHECK-NEXT: Unknown: 397; CHECK-NEXT: %l = load i32, ptr %a, align 4 -> 398; CHECK-NEXT: store i32 %l, ptr %gep.off, align 4 399; CHECK-EMPTY: 400; CHECK-NEXT: Run-time memory checks: 401; CHECK-NEXT: Grouped accesses: 402; CHECK-EMPTY: 403; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop. 404; CHECK-NEXT: SCEV assumptions: 405; CHECK-EMPTY: 406; CHECK-NEXT: Expressions re-written: 407; 408entry: 409 %gep.off = getelementptr i8, ptr %a, i32 3 410 br label %loop 411 412loop: 413 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ] 414 %l = load i32, ptr %a 415 store i32 %l, ptr %gep.off 416 %iv.next = add i32 %iv, 1 417 %ec = icmp eq i32 %iv.next, 100 418 br i1 %ec, label %exit, label %loop 419 420exit: 421 ret void 422} 423 424define void @test_both_invar_not_before_2(ptr %a) { 425; CHECK-LABEL: 'test_both_invar_not_before_2' 426; CHECK-NEXT: loop: 427; CHECK-NEXT: Report: unsafe dependent memory operations in loop. Use #pragma clang loop distribute(enable) to allow loop distribution to attempt to isolate the offending operations into a separate loop 428; CHECK-NEXT: Unknown data dependence. 429; CHECK-NEXT: Dependences: 430; CHECK-NEXT: Unknown: 431; CHECK-NEXT: %l = load i32, ptr %gep.off, align 4 -> 432; CHECK-NEXT: store i32 %l, ptr %a, align 4 433; CHECK-EMPTY: 434; CHECK-NEXT: Run-time memory checks: 435; CHECK-NEXT: Grouped accesses: 436; CHECK-EMPTY: 437; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop. 438; CHECK-NEXT: SCEV assumptions: 439; CHECK-EMPTY: 440; CHECK-NEXT: Expressions re-written: 441; 442entry: 443 %gep.off = getelementptr i8, ptr %a, i32 3 444 br label %loop 445 446loop: 447 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ] 448 %l = load i32, ptr %gep.off 449 store i32 %l, ptr %a 450 %iv.next = add i32 %iv, 1 451 %ec = icmp eq i32 %iv.next, 100 452 br i1 %ec, label %exit, label %loop 453 454exit: 455 ret void 456} 457 458define void @test_invar_dependence_before_via_loop_guard_positive_strided_access_1(ptr %a, i32 %off) { 459; CHECK-LABEL: 'test_invar_dependence_before_via_loop_guard_positive_strided_access_1' 460; CHECK-NEXT: loop: 461; CHECK-NEXT: Report: unsafe dependent memory operations in loop. Use #pragma clang loop distribute(enable) to allow loop distribution to attempt to isolate the offending operations into a separate loop 462; CHECK-NEXT: Unknown data dependence. 463; CHECK-NEXT: Dependences: 464; CHECK-NEXT: Unknown: 465; CHECK-NEXT: %l = load i32, ptr %a, align 4 -> 466; CHECK-NEXT: store i32 %l, ptr %gep, align 4 467; CHECK-EMPTY: 468; CHECK-NEXT: Run-time memory checks: 469; CHECK-NEXT: Grouped accesses: 470; CHECK-EMPTY: 471; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop. 472; CHECK-NEXT: SCEV assumptions: 473; CHECK-EMPTY: 474; CHECK-NEXT: Expressions re-written: 475; 476entry: 477 %gep.off = getelementptr i8, ptr %a, i32 %off 478 %c = icmp sge i32 %off, 4 479 br i1 %c, label %loop, label %exit 480 481loop: 482 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ] 483 %gep = getelementptr i32, ptr %gep.off, i32 %iv 484 %l = load i32, ptr %a 485 store i32 %l, ptr %gep 486 %iv.next = add i32 %iv, 1 487 %ec = icmp eq i32 %iv.next, 100 488 br i1 %ec, label %exit, label %loop 489 490exit: 491 ret void 492} 493 494define void @test_invar_dependence_before_via_loop_guard_positive_strided_access_2(ptr %a, i32 %off) { 495; CHECK-LABEL: 'test_invar_dependence_before_via_loop_guard_positive_strided_access_2' 496; CHECK-NEXT: loop: 497; CHECK-NEXT: Report: unsafe dependent memory operations in loop. Use #pragma clang loop distribute(enable) to allow loop distribution to attempt to isolate the offending operations into a separate loop 498; CHECK-NEXT: Unknown data dependence. 499; CHECK-NEXT: Dependences: 500; CHECK-NEXT: Unknown: 501; CHECK-NEXT: %l = load i32, ptr %gep, align 4 -> 502; CHECK-NEXT: store i32 %l, ptr %a, align 4 503; CHECK-EMPTY: 504; CHECK-NEXT: Run-time memory checks: 505; CHECK-NEXT: Grouped accesses: 506; CHECK-EMPTY: 507; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop. 508; CHECK-NEXT: SCEV assumptions: 509; CHECK-EMPTY: 510; CHECK-NEXT: Expressions re-written: 511; 512entry: 513 %gep.off = getelementptr i8, ptr %a, i32 %off 514 %c = icmp sge i32 %off, 4 515 br i1 %c, label %loop, label %exit 516 517loop: 518 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ] 519 %gep = getelementptr i32, ptr %gep.off, i32 %iv 520 %l = load i32, ptr %gep 521 store i32 %l, ptr %a 522 %iv.next = add i32 %iv, 1 523 %ec = icmp eq i32 %iv.next, 100 524 br i1 %ec, label %exit, label %loop 525 526exit: 527 ret void 528} 529define void @test_invar_dependence_not_before_via_loop_guard_positive_strided_access_1(ptr %a, i32 %off) { 530; CHECK-LABEL: 'test_invar_dependence_not_before_via_loop_guard_positive_strided_access_1' 531; CHECK-NEXT: loop: 532; CHECK-NEXT: Report: unsafe dependent memory operations in loop. Use #pragma clang loop distribute(enable) to allow loop distribution to attempt to isolate the offending operations into a separate loop 533; CHECK-NEXT: Unknown data dependence. 534; CHECK-NEXT: Dependences: 535; CHECK-NEXT: Unknown: 536; CHECK-NEXT: %l = load i32, ptr %a, align 4 -> 537; CHECK-NEXT: store i32 %l, ptr %gep, align 4 538; CHECK-EMPTY: 539; CHECK-NEXT: Run-time memory checks: 540; CHECK-NEXT: Grouped accesses: 541; CHECK-EMPTY: 542; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop. 543; CHECK-NEXT: SCEV assumptions: 544; CHECK-EMPTY: 545; CHECK-NEXT: Expressions re-written: 546; 547entry: 548 %gep.off = getelementptr i8, ptr %a, i32 %off 549 %c = icmp sge i32 %off, 3 550 br i1 %c, label %loop, label %exit 551 552loop: 553 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ] 554 %gep = getelementptr i32, ptr %gep.off, i32 %iv 555 %l = load i32, ptr %a 556 store i32 %l, ptr %gep 557 %iv.next = add i32 %iv, 1 558 %ec = icmp eq i32 %iv.next, 100 559 br i1 %ec, label %exit, label %loop 560 561exit: 562 ret void 563} 564 565define void @test_invar_dependence_not_before_via_loop_guard_positive_strided_access_2(ptr %a, i32 %off) { 566; CHECK-LABEL: 'test_invar_dependence_not_before_via_loop_guard_positive_strided_access_2' 567; CHECK-NEXT: loop: 568; CHECK-NEXT: Report: unsafe dependent memory operations in loop. Use #pragma clang loop distribute(enable) to allow loop distribution to attempt to isolate the offending operations into a separate loop 569; CHECK-NEXT: Unknown data dependence. 570; CHECK-NEXT: Dependences: 571; CHECK-NEXT: Unknown: 572; CHECK-NEXT: %l = load i32, ptr %gep, align 4 -> 573; CHECK-NEXT: store i32 %l, ptr %a, align 4 574; CHECK-EMPTY: 575; CHECK-NEXT: Run-time memory checks: 576; CHECK-NEXT: Grouped accesses: 577; CHECK-EMPTY: 578; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop. 579; CHECK-NEXT: SCEV assumptions: 580; CHECK-EMPTY: 581; CHECK-NEXT: Expressions re-written: 582; 583entry: 584 %gep.off = getelementptr i8, ptr %a, i32 %off 585 %c = icmp sge i32 %off, 3 586 br i1 %c, label %loop, label %exit 587 588loop: 589 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ] 590 %gep = getelementptr i32, ptr %gep.off, i32 %iv 591 %l = load i32, ptr %gep 592 store i32 %l, ptr %a 593 %iv.next = add i32 %iv, 1 594 %ec = icmp eq i32 %iv.next, 100 595 br i1 %ec, label %exit, label %loop 596 597exit: 598 ret void 599} 600 601define void @test_invar_dependence_before_positive_strided_access_via_loop_guard_1(ptr %a, i32 %off) { 602; CHECK-LABEL: 'test_invar_dependence_before_positive_strided_access_via_loop_guard_1' 603; CHECK-NEXT: loop: 604; CHECK-NEXT: Report: could not determine number of loop iterations 605; CHECK-NEXT: Dependences: 606; CHECK-NEXT: Run-time memory checks: 607; CHECK-NEXT: Grouped accesses: 608; CHECK-EMPTY: 609; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop. 610; CHECK-NEXT: SCEV assumptions: 611; CHECK-EMPTY: 612; CHECK-NEXT: Expressions re-written: 613; 614entry: 615 %gep.off = getelementptr i8, ptr %a, i32 4 616 %c = icmp sge i32 %off, 0 617 br i1 %c, label %loop, label %exit 618 619loop: 620 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ] 621 %gep = getelementptr i32, ptr %gep.off, i32 %iv 622 %l = load i32, ptr %gep 623 store i32 %l, ptr %a 624 %iv.next = add i32 %iv, %off 625 %ec = icmp eq i32 %iv.next, 100 626 br i1 %ec, label %exit, label %loop 627 628exit: 629 ret void 630} 631 632define void @test_invar_dependence_before_positive_strided_access_via_loop_guard_2(ptr %a, i32 %off) { 633; CHECK-LABEL: 'test_invar_dependence_before_positive_strided_access_via_loop_guard_2' 634; CHECK-NEXT: loop: 635; CHECK-NEXT: Report: could not determine number of loop iterations 636; CHECK-NEXT: Dependences: 637; CHECK-NEXT: Run-time memory checks: 638; CHECK-NEXT: Grouped accesses: 639; CHECK-EMPTY: 640; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop. 641; CHECK-NEXT: SCEV assumptions: 642; CHECK-EMPTY: 643; CHECK-NEXT: Expressions re-written: 644; 645entry: 646 %gep.off = getelementptr i8, ptr %a, i32 4 647 %c = icmp sge i32 %off, 0 648 br i1 %c, label %loop, label %exit 649 650loop: 651 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ] 652 %gep = getelementptr i32, ptr %gep.off, i32 %iv 653 %l = load i32, ptr %a 654 store i32 %l, ptr %gep 655 %iv.next = add i32 %iv, %off 656 %ec = icmp eq i32 %iv.next, 100 657 br i1 %ec, label %exit, label %loop 658 659exit: 660 ret void 661} 662 663define void @test_invar_dependence_not_known_beforepositive_strided_access_not_known_via_loop_guard_1(ptr %a, i32 %off) { 664; CHECK-LABEL: 'test_invar_dependence_not_known_beforepositive_strided_access_not_known_via_loop_guard_1' 665; CHECK-NEXT: loop: 666; CHECK-NEXT: Report: could not determine number of loop iterations 667; CHECK-NEXT: Dependences: 668; CHECK-NEXT: Run-time memory checks: 669; CHECK-NEXT: Grouped accesses: 670; CHECK-EMPTY: 671; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop. 672; CHECK-NEXT: SCEV assumptions: 673; CHECK-EMPTY: 674; CHECK-NEXT: Expressions re-written: 675; 676entry: 677 %gep.off = getelementptr i8, ptr %a, i32 4 678 br label %loop 679 680loop: 681 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ] 682 %gep = getelementptr i32, ptr %gep.off, i32 %iv 683 %l = load i32, ptr %a 684 store i32 %l, ptr %gep 685 %iv.next = add i32 %iv, %off 686 %ec = icmp eq i32 %iv.next, 100 687 br i1 %ec, label %exit, label %loop 688 689exit: 690 ret void 691} 692 693define void @test_invar_dependence_not_known_beforepositive_strided_access_not_known_via_loop_guard_2(ptr %a, i32 %off) { 694; CHECK-LABEL: 'test_invar_dependence_not_known_beforepositive_strided_access_not_known_via_loop_guard_2' 695; CHECK-NEXT: loop: 696; CHECK-NEXT: Report: could not determine number of loop iterations 697; CHECK-NEXT: Dependences: 698; CHECK-NEXT: Run-time memory checks: 699; CHECK-NEXT: Grouped accesses: 700; CHECK-EMPTY: 701; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop. 702; CHECK-NEXT: SCEV assumptions: 703; CHECK-EMPTY: 704; CHECK-NEXT: Expressions re-written: 705; 706entry: 707 %gep.off = getelementptr i8, ptr %a, i32 4 708 br label %loop 709 710loop: 711 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ] 712 %gep = getelementptr i32, ptr %gep.off, i32 %iv 713 %l = load i32, ptr %gep 714 store i32 %l, ptr %a 715 %iv.next = add i32 %iv, %off 716 %ec = icmp eq i32 %iv.next, 100 717 br i1 %ec, label %exit, label %loop 718 719exit: 720 ret void 721} 722 723define void @test_invar_vector_dependence_before_positive_strided_access_1(ptr %a) { 724; CHECK-LABEL: 'test_invar_vector_dependence_before_positive_strided_access_1' 725; CHECK-NEXT: loop: 726; CHECK-NEXT: Memory dependences are safe 727; CHECK-NEXT: Dependences: 728; CHECK-NEXT: Run-time memory checks: 729; CHECK-NEXT: Grouped accesses: 730; CHECK-EMPTY: 731; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop. 732; CHECK-NEXT: SCEV assumptions: 733; CHECK-EMPTY: 734; CHECK-NEXT: Expressions re-written: 735; 736entry: 737 %gep.off = getelementptr i8, ptr %a, i32 4 738 br label %loop 739 740loop: 741 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ] 742 %gep = getelementptr i32, ptr %gep.off, i32 %iv 743 %l = load <4 x i8>, ptr %a 744 store i32 0, ptr %gep 745 %iv.next = add i32 %iv, 1 746 %ec = icmp eq i32 %iv.next, 100 747 br i1 %ec, label %exit, label %loop 748 749exit: 750 ret void 751} 752 753define void @test_invar_scalable_dependence_before_positive_strided_access_1(ptr %a) { 754; CHECK-LABEL: 'test_invar_scalable_dependence_before_positive_strided_access_1' 755; CHECK-NEXT: loop: 756; CHECK-NEXT: Report: unsafe dependent memory operations in loop. Use #pragma clang loop distribute(enable) to allow loop distribution to attempt to isolate the offending operations into a separate loop 757; CHECK-NEXT: Unknown data dependence. 758; CHECK-NEXT: Dependences: 759; CHECK-NEXT: Unknown: 760; CHECK-NEXT: %l = load <vscale x 4 x i8>, ptr %a, align 4 -> 761; CHECK-NEXT: store i32 0, ptr %gep, align 4 762; CHECK-EMPTY: 763; CHECK-NEXT: Run-time memory checks: 764; CHECK-NEXT: Grouped accesses: 765; CHECK-EMPTY: 766; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop. 767; CHECK-NEXT: SCEV assumptions: 768; CHECK-EMPTY: 769; CHECK-NEXT: Expressions re-written: 770; 771entry: 772 %gep.off = getelementptr i8, ptr %a, i32 4 773 br label %loop 774 775loop: 776 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ] 777 %gep = getelementptr i32, ptr %gep.off, i32 %iv 778 %l = load <vscale x 4 x i8>, ptr %a 779 store i32 0, ptr %gep 780 %iv.next = add i32 %iv, 1 781 %ec = icmp eq i32 %iv.next, 100 782 br i1 %ec, label %exit, label %loop 783 784exit: 785 ret void 786} 787 788define void @invariant_stores_unit_stride(i32 %offset, ptr noalias %dst.1, ptr %dst.2) { 789; CHECK-LABEL: 'invariant_stores_unit_stride' 790; CHECK-NEXT: loop: 791; CHECK-NEXT: Memory dependences are safe 792; CHECK-NEXT: Dependences: 793; CHECK-NEXT: Run-time memory checks: 794; CHECK-NEXT: Grouped accesses: 795; CHECK-EMPTY: 796; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop. 797; CHECK-NEXT: SCEV assumptions: 798; CHECK-EMPTY: 799; CHECK-NEXT: Expressions re-written: 800; 801entry: 802 %add = add i32 %offset, 3 803 br label %loop 804 805loop: 806 %iv.2 = phi i32 [ 0, %entry ], [ %iv.2.next, %loop ] 807 %iv.3 = phi i32 [ 0, %entry ], [ %iv.3.next, %loop ] 808 %iv.mul = mul i32 %iv.3, %add 809 %gep.mul = getelementptr i8, ptr %dst.1, i32 %iv.mul 810 store i32 0, ptr %gep.mul, align 8 811 %iv.2.mul = mul i32 %iv.2, %offset 812 %gep = getelementptr i32, ptr %dst.2, i32 %iv.2.mul 813 store i32 0, ptr %gep, align 8 814 %iv.2.next = add i32 %iv.2, 1 815 %iv.3.next = add i32 %iv.3, 1 816 %ec = icmp eq i32 %iv.3, 200 817 br i1 %ec, label %exit, label %loop 818 819exit: 820 ret void 821} 822