822 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 32; RUN: opt -passes='print<access-info>' -disable-output %s 2>&1 | FileCheck %s3 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 safe8; 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 419 br label %loop20 21loop:22 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]23 %gep = getelementptr i32, ptr %gep.off, i32 %iv24 %l = load i32, ptr %a25 store i32 %l, ptr %gep26 %iv.next = add i32 %iv, 127 %ec = icmp eq i32 %iv.next, 10028 br i1 %ec, label %exit, label %loop29 30exit:31 ret void32}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 safe38; 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 449 br label %loop50 51loop:52 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]53 %gep = getelementptr i32, ptr %gep.off, i32 %iv54 %l = load i32, ptr %gep55 store i32 %l, ptr %a56 %iv.next = add i32 %iv, 157 %ec = icmp eq i32 %iv.next, 10058 br i1 %ec, label %exit, label %loop59 60exit:61 ret void62}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 loop68; 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 473; 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 384 br label %loop85 86loop:87 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]88 %gep = getelementptr i32, ptr %gep.off, i32 %iv89 %l = load i32, ptr %a90 store i32 %l, ptr %gep91 %iv.next = add i32 %iv, 192 %ec = icmp eq i32 %iv.next, 10093 br i1 %ec, label %exit, label %loop94 95exit:96 ret void97}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 loop103; 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 4108; 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 3119 br label %loop120 121loop:122 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]123 %gep = getelementptr i32, ptr %gep.off, i32 %iv124 %l = load i32, ptr %gep125 store i32 %l, ptr %a126 %iv.next = add i32 %iv, 1127 %ec = icmp eq i32 %iv.next, 100128 br i1 %ec, label %exit, label %loop129 130exit:131 ret void132}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 safe138; 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 4149 br label %loop150 151loop:152 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]153 %gep = getelementptr i32, ptr %gep.off, i32 %iv154 %l = load i32, ptr %a155 %t = trunc i32 %l to i8156 store i8 %t, ptr %gep157 %iv.next = add i32 %iv, 1158 %ec = icmp eq i32 %iv.next, 100159 br i1 %ec, label %exit, label %loop160 161exit:162 ret void163}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 loop169; 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 4174; 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 4185 br label %loop186 187loop:188 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]189 %gep = getelementptr i32, ptr %gep.off, i32 %iv190 %l = load i64, ptr %a191 %t = trunc i64 %l to i32192 store i32 %t, ptr %gep193 %iv.next = add i32 %iv, 1194 %ec = icmp eq i32 %iv.next, 100195 br i1 %ec, label %exit, label %loop196 197exit:198 ret void199}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 safe205; 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 100216 br label %loop217 218loop:219 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]220 %gep = getelementptr i32, ptr %gep.off, i32 %iv221 %l = load i32, ptr %a222 store i32 %l, ptr %gep223 %iv.next = sub i32 %iv, 1224 %ec = icmp eq i32 %iv.next, -100225 br i1 %ec, label %exit, label %loop226 227exit:228 ret void229}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 safe235; 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 100246 br label %loop247 248loop:249 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]250 %gep = getelementptr i32, ptr %gep.off, i32 %iv251 %l = load i32, ptr %gep252 store i32 %l, ptr %a253 %iv.next = sub i32 %iv, 1254 %ec = icmp eq i32 %iv.next, -100255 br i1 %ec, label %exit, label %loop256 257exit:258 ret void259}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 loop266; 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 4271; 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 99282 br label %loop283 284loop:285 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]286 %gep = getelementptr i32, ptr %gep.off, i32 %iv287 %l = load i32, ptr %a288 store i32 %l, ptr %gep289 %iv.next = sub i32 %iv, 1290 %ec = icmp eq i32 %iv.next, -100291 br i1 %ec, label %exit, label %loop292 293exit:294 ret void295}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 loop301; 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 4306; 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 99317 br label %loop318 319loop:320 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]321 %gep = getelementptr i32, ptr %gep.off, i32 %iv322 %l = load i32, ptr %gep323 store i32 %l, ptr %a324 %iv.next = sub i32 %iv, 1325 %ec = icmp eq i32 %iv.next, -100326 br i1 %ec, label %exit, label %loop327 328exit:329 ret void330}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 safe336; 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 4347 br label %loop348 349loop:350 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]351 %l = load i32, ptr %a352 store i32 %l, ptr %gep.off353 %iv.next = add i32 %iv, 1354 %ec = icmp eq i32 %iv.next, 100355 br i1 %ec, label %exit, label %loop356 357exit:358 ret void359}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 safe365; 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 4376 br label %loop377 378loop:379 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]380 %l = load i32, ptr %gep.off381 store i32 %l, ptr %a382 %iv.next = add i32 %iv, 1383 %ec = icmp eq i32 %iv.next, 100384 br i1 %ec, label %exit, label %loop385 386exit:387 ret void388}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 loop394; 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 4399; 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 3410 br label %loop411 412loop:413 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]414 %l = load i32, ptr %a415 store i32 %l, ptr %gep.off416 %iv.next = add i32 %iv, 1417 %ec = icmp eq i32 %iv.next, 100418 br i1 %ec, label %exit, label %loop419 420exit:421 ret void422}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 loop428; 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 4433; 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 3444 br label %loop445 446loop:447 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]448 %l = load i32, ptr %gep.off449 store i32 %l, ptr %a450 %iv.next = add i32 %iv, 1451 %ec = icmp eq i32 %iv.next, 100452 br i1 %ec, label %exit, label %loop453 454exit:455 ret void456}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 loop462; 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 4467; 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 %off478 %c = icmp sge i32 %off, 4479 br i1 %c, label %loop, label %exit480 481loop:482 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]483 %gep = getelementptr i32, ptr %gep.off, i32 %iv484 %l = load i32, ptr %a485 store i32 %l, ptr %gep486 %iv.next = add i32 %iv, 1487 %ec = icmp eq i32 %iv.next, 100488 br i1 %ec, label %exit, label %loop489 490exit:491 ret void492}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 loop498; 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 4503; 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 %off514 %c = icmp sge i32 %off, 4515 br i1 %c, label %loop, label %exit516 517loop:518 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]519 %gep = getelementptr i32, ptr %gep.off, i32 %iv520 %l = load i32, ptr %gep521 store i32 %l, ptr %a522 %iv.next = add i32 %iv, 1523 %ec = icmp eq i32 %iv.next, 100524 br i1 %ec, label %exit, label %loop525 526exit:527 ret void528}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 loop533; 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 4538; 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 %off549 %c = icmp sge i32 %off, 3550 br i1 %c, label %loop, label %exit551 552loop:553 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]554 %gep = getelementptr i32, ptr %gep.off, i32 %iv555 %l = load i32, ptr %a556 store i32 %l, ptr %gep557 %iv.next = add i32 %iv, 1558 %ec = icmp eq i32 %iv.next, 100559 br i1 %ec, label %exit, label %loop560 561exit:562 ret void563}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 loop569; 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 4574; 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 %off585 %c = icmp sge i32 %off, 3586 br i1 %c, label %loop, label %exit587 588loop:589 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]590 %gep = getelementptr i32, ptr %gep.off, i32 %iv591 %l = load i32, ptr %gep592 store i32 %l, ptr %a593 %iv.next = add i32 %iv, 1594 %ec = icmp eq i32 %iv.next, 100595 br i1 %ec, label %exit, label %loop596 597exit:598 ret void599}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 iterations605; 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 4616 %c = icmp sge i32 %off, 0617 br i1 %c, label %loop, label %exit618 619loop:620 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]621 %gep = getelementptr i32, ptr %gep.off, i32 %iv622 %l = load i32, ptr %gep623 store i32 %l, ptr %a624 %iv.next = add i32 %iv, %off625 %ec = icmp eq i32 %iv.next, 100626 br i1 %ec, label %exit, label %loop627 628exit:629 ret void630}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 iterations636; 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 4647 %c = icmp sge i32 %off, 0648 br i1 %c, label %loop, label %exit649 650loop:651 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]652 %gep = getelementptr i32, ptr %gep.off, i32 %iv653 %l = load i32, ptr %a654 store i32 %l, ptr %gep655 %iv.next = add i32 %iv, %off656 %ec = icmp eq i32 %iv.next, 100657 br i1 %ec, label %exit, label %loop658 659exit:660 ret void661}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 iterations667; 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 4678 br label %loop679 680loop:681 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]682 %gep = getelementptr i32, ptr %gep.off, i32 %iv683 %l = load i32, ptr %a684 store i32 %l, ptr %gep685 %iv.next = add i32 %iv, %off686 %ec = icmp eq i32 %iv.next, 100687 br i1 %ec, label %exit, label %loop688 689exit:690 ret void691}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 iterations697; 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 4708 br label %loop709 710loop:711 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]712 %gep = getelementptr i32, ptr %gep.off, i32 %iv713 %l = load i32, ptr %gep714 store i32 %l, ptr %a715 %iv.next = add i32 %iv, %off716 %ec = icmp eq i32 %iv.next, 100717 br i1 %ec, label %exit, label %loop718 719exit:720 ret void721}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 safe727; 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 4738 br label %loop739 740loop:741 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]742 %gep = getelementptr i32, ptr %gep.off, i32 %iv743 %l = load <4 x i8>, ptr %a744 store i32 0, ptr %gep745 %iv.next = add i32 %iv, 1746 %ec = icmp eq i32 %iv.next, 100747 br i1 %ec, label %exit, label %loop748 749exit:750 ret void751}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 loop757; 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 4762; 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 4773 br label %loop774 775loop:776 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]777 %gep = getelementptr i32, ptr %gep.off, i32 %iv778 %l = load <vscale x 4 x i8>, ptr %a779 store i32 0, ptr %gep780 %iv.next = add i32 %iv, 1781 %ec = icmp eq i32 %iv.next, 100782 br i1 %ec, label %exit, label %loop783 784exit:785 ret void786}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 safe792; 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, 3803 br label %loop804 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, %add809 %gep.mul = getelementptr i8, ptr %dst.1, i32 %iv.mul810 store i32 0, ptr %gep.mul, align 8811 %iv.2.mul = mul i32 %iv.2, %offset812 %gep = getelementptr i32, ptr %dst.2, i32 %iv.2.mul813 store i32 0, ptr %gep, align 8814 %iv.2.next = add i32 %iv.2, 1815 %iv.3.next = add i32 %iv.3, 1816 %ec = icmp eq i32 %iv.3, 200817 br i1 %ec, label %exit, label %loop818 819exit:820 ret void821}822