257 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 52; RUN: opt -p loop-vectorize -force-vector-width=4 -force-vector-interleave=1 -S -debug %s 2>&1 | FileCheck %s3 4; REQUIRES: asserts5 6declare void @init(ptr)7 8define i64 @multi_exiting_to_different_exits_live_in_exit_values() {9; CHECK: multi_exiting_to_different_exits_live_in_exit_values10; CHECK-LABEL: VPlan 'Initial VPlan for VF={4},UF>=1' {11; CHECK-NEXT: Live-in vp<[[VF:%.+]]> = VF12; CHECK-NEXT: Live-in vp<[[VFxUF:%.+]]> = VF * UF13; CHECK-NEXT: Live-in vp<[[VTC:%.+]]> = vector-trip-count14; CHECK-NEXT: Live-in ir<128> = original trip-count15; CHECK-EMPTY:16; CHECK-NEXT: ir-bb<entry>:17; CHECK-NEXT: IR %src = alloca [128 x i32], align 418; CHECK-NEXT: IR call void @init(ptr %src)19; CHECK-NEXT: Successor(s): scalar.ph, vector.ph20; CHECK-EMPTY:21; CHECK-NEXT: vector.ph:22; CHECK-NEXT: Successor(s): vector loop23; CHECK-EMPTY:24; CHECK-NEXT: <x1> vector loop: {25; CHECK-NEXT: vector.body:26; CHECK-NEXT: EMIT vp<[[CAN_IV:%.+]]> = CANONICAL-INDUCTION ir<0>, vp<%index.next>27; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>, vp<[[VF]]28; CHECK-NEXT: CLONE ir<%gep.src> = getelementptr inbounds ir<%src>, vp<[[STEPS]]>29; CHECK-NEXT: vp<[[VEC_PTR:%.+]]> = vector-pointer inbounds ir<%gep.src>30; CHECK-NEXT: WIDEN ir<%l> = load vp<[[VEC_PTR]]>31; CHECK-NEXT: WIDEN ir<%c.1> = icmp eq ir<%l>, ir<10>32; CHECK-NEXT: EMIT vp<%index.next> = add nuw vp<[[CAN_IV]]>, vp<[[VFxUF]]>33; CHECK-NEXT: EMIT vp<[[EA_TAKEN:%.+]]> = any-of ir<%c.1>34; CHECK-NEXT: EMIT vp<[[LATCH_CMP:%.+]]> = icmp eq vp<%index.next>, vp<[[VTC]]>35; CHECK-NEXT: EMIT vp<[[EC:%.+]]> = or vp<[[EA_TAKEN]]>, vp<[[LATCH_CMP]]>36; CHECK-NEXT: EMIT branch-on-cond vp<[[EC]]>37; CHECK-NEXT: No successors38; CHECK-NEXT: }39; CHECK-NEXT: Successor(s): middle.split40; CHECK-EMPTY:41; CHECK-NEXT: middle.split:42; CHECK-NEXT: EMIT branch-on-cond vp<[[EA_TAKEN]]>43; CHECK-NEXT: Successor(s): vector.early.exit, middle.block44; CHECK-EMPTY:45; CHECK-NEXT: middle.block:46; CHECK-NEXT: EMIT vp<[[MIDDLE_CMP:%.+]]> = icmp eq ir<128>, vp<[[VTC]]>47; CHECK-NEXT: EMIT branch-on-cond vp<[[MIDDLE_CMP]]>48; CHECK-NEXT: Successor(s): ir-bb<e2>, scalar.ph49; CHECK-EMPTY:50; CHECK-NEXT: ir-bb<e2>:51; CHECK-NEXT: IR %p2 = phi i64 [ 1, %loop.latch ] (extra operand: ir<1> from middle.block)52; CHECK-NEXT: No successors53; CHECK-EMPTY:54; CHECK-NEXT: vector.early.exit:55; CHECK-NEXT: Successor(s): ir-bb<e1>56; CHECK-EMPTY:57; CHECK-NEXT: ir-bb<e1>:58; CHECK-NEXT: IR %p1 = phi i64 [ 0, %loop.header ] (extra operand: ir<0> from vector.early.exit)59; CHECK-NEXT: No successors60; CHECK-EMPTY:61; CHECK-NEXT: scalar.ph:62; CHECK-NEXT: EMIT-SCALAR vp<[[RESUME:%.+]]> = phi [ vp<[[VTC]]>, middle.block ], [ ir<0>, ir-bb<entry> ]63; CHECK-NEXT: ir-bb<loop.header>64; CHECK-EMPTY:65; CHECK-NEXT: ir-bb<loop.header>:66; CHECK-NEXT: IR %iv = phi i64 [ %inc, %loop.latch ], [ 0, %entry ] (extra operand: vp<[[RESUME]]> from scalar.ph)67; CHECK: No successors68; CHECK-NEXT: }69entry:70 %src = alloca [128 x i32]71 call void @init(ptr %src)72 br label %loop.header73 74loop.header:75 %iv = phi i64 [ %inc, %loop.latch ], [ 0, %entry ]76 %gep.src = getelementptr inbounds i32, ptr %src, i64 %iv77 %l = load i32, ptr %gep.src78 %c.1 = icmp eq i32 %l, 1079 br i1 %c.1, label %e1, label %loop.latch80 81loop.latch:82 %inc = add nuw i64 %iv, 183 %c.2 = icmp eq i64 %inc, 12884 br i1 %c.2, label %e2, label %loop.header85 86e1:87 %p1 = phi i64 [ 0, %loop.header ]88 ret i64 %p189 90e2:91 %p2 = phi i64 [ 1, %loop.latch ]92 ret i64 %p293}94 95define i64 @multi_exiting_to_same_exit_live_in_exit_values() {96; CHECK: multi_exiting_to_same_exit_live_in_exit_values97; CHECK-LABEL: VPlan 'Initial VPlan for VF={4},UF>=1' {98; CHECK-NEXT: Live-in vp<[[VF:%.+]]> = VF99; CHECK-NEXT: Live-in vp<[[VFxUF:%.+]]> = VF * UF100; CHECK-NEXT: Live-in vp<[[VTC:%.+]]> = vector-trip-count101; CHECK-NEXT: Live-in ir<128> = original trip-count102; CHECK-EMPTY:103; CHECK-NEXT: ir-bb<entry>:104; CHECK-NEXT: IR %src = alloca [128 x i32], align 4105; CHECK-NEXT: IR call void @init(ptr %src)106; CHECK-NEXT: Successor(s): scalar.ph, vector.ph107; CHECK-EMPTY:108; CHECK-NEXT: vector.ph:109; CHECK-NEXT: Successor(s): vector loop110; CHECK-EMPTY:111; CHECK-NEXT: <x1> vector loop: {112; CHECK-NEXT: vector.body:113; CHECK-NEXT: EMIT vp<[[CAN_IV:%.+]]> = CANONICAL-INDUCTION ir<0>, vp<%index.next>114; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>, vp<[[VF]]>115; CHECK-NEXT: CLONE ir<%gep.src> = getelementptr inbounds ir<%src>, vp<[[STEPS]]>116; CHECK-NEXT: vp<[[VEC_PTR:%.+]]> = vector-pointer inbounds ir<%gep.src>117; CHECK-NEXT: WIDEN ir<%l> = load vp<[[VEC_PTR]]>118; CHECK-NEXT: WIDEN ir<%c.1> = icmp eq ir<%l>, ir<10>119; CHECK-NEXT: EMIT vp<%index.next> = add nuw vp<[[CAN_IV]]>, vp<[[VFxUF]]>120; CHECK-NEXT: EMIT vp<[[EA_TAKEN:%.+]]> = any-of ir<%c.1>121; CHECK-NEXT: EMIT vp<[[LATCH_CMP:%.+]]> = icmp eq vp<%index.next>, vp<[[VTC]]>122; CHECK-NEXT: EMIT vp<[[EC:%.+]]> = or vp<[[EA_TAKEN]]>, vp<[[LATCH_CMP]]>123; CHECK-NEXT: EMIT branch-on-cond vp<[[EC]]>124; CHECK-NEXT: No successors125; CHECK-NEXT: }126; CHECK-NEXT: Successor(s): middle.split127; CHECK-EMPTY:128; CHECK-NEXT: middle.split:129; CHECK-NEXT: EMIT branch-on-cond vp<[[EA_TAKEN]]>130; CHECK-NEXT: Successor(s): vector.early.exit, middle.block131; CHECK-EMPTY:132; CHECK-NEXT: middle.block:133; CHECK-NEXT: EMIT vp<[[MIDDLE_CMP:%.+]]> = icmp eq ir<128>, vp<[[VTC]]>134; CHECK-NEXT: EMIT branch-on-cond vp<[[MIDDLE_CMP]]>135; CHECK-NEXT: Successor(s): ir-bb<exit>, scalar.ph136; CHECK-EMPTY:137; CHECK-NEXT: vector.early.exit:138; CHECK-NEXT: Successor(s): ir-bb<exit>139; CHECK-EMPTY:140; CHECK-NEXT: ir-bb<exit>:141; CHECK-NEXT: IR %p = phi i64 [ 0, %loop.header ], [ 1, %loop.latch ] (extra operands: ir<1> from middle.block, ir<0> from vector.early.exit)142; CHECK-NEXT: No successors143; CHECK-EMPTY:144; CHECK-NEXT: scalar.ph:145; CHECK-NEXT: EMIT-SCALAR vp<[[RESUME:%.+]]> = phi [ vp<[[VTC]]>, middle.block ], [ ir<0>, ir-bb<entry> ]146; CHECK-NEXT: ir-bb<loop.header>147; CHECK-EMPTY:148; CHECK-NEXT: ir-bb<loop.header>:149; CHECK-NEXT: IR %iv = phi i64 [ %inc, %loop.latch ], [ 0, %entry ] (extra operand: vp<[[RESUME]]> from scalar.ph)150; CHECK: No successors151; CHECK-NEXT: }152 153entry:154 %src = alloca [128 x i32]155 call void @init(ptr %src)156 br label %loop.header157 158loop.header:159 %iv = phi i64 [ %inc, %loop.latch ], [ 0, %entry ]160 %gep.src = getelementptr inbounds i32, ptr %src, i64 %iv161 %l = load i32, ptr %gep.src162 %c.1 = icmp eq i32 %l, 10163 br i1 %c.1, label %exit, label %loop.latch164 165loop.latch:166 %inc = add nuw i64 %iv, 1167 %c.2 = icmp eq i64 %inc, 128168 br i1 %c.2, label %exit, label %loop.header169 170exit:171 %p = phi i64 [ 0, %loop.header ], [ 1, %loop.latch ]172 ret i64 %p173}174 175define i64 @multi_exiting_to_same_exit_live_in_exit_values_2() {176; CHECK: multi_exiting_to_same_exit_live_in_exit_values_2177; CHECK-LABEL: VPlan 'Initial VPlan for VF={4},UF>=1' {178; CHECK-NEXT: Live-in vp<[[VF:%.+]]> = VF179; CHECK-NEXT: Live-in vp<[[VFxUF:%.+]]> = VF * UF180; CHECK-NEXT: Live-in vp<[[VTC:%.+]]> = vector-trip-count181; CHECK-NEXT: Live-in ir<128> = original trip-count182; CHECK-EMPTY:183; CHECK-NEXT: ir-bb<entry>:184; CHECK-NEXT: IR %src = alloca [128 x i32], align 4185; CHECK-NEXT: IR call void @init(ptr %src)186; CHECK-NEXT: Successor(s): scalar.ph, vector.ph187; CHECK-EMPTY:188; CHECK-NEXT: vector.ph:189; CHECK-NEXT: Successor(s): vector loop190; CHECK-EMPTY:191; CHECK-NEXT: <x1> vector loop: {192; CHECK-NEXT: vector.body:193; CHECK-NEXT: EMIT vp<[[CAN_IV:%.+]]> = CANONICAL-INDUCTION ir<0>, vp<%index.next>194; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>, vp<[[VF]]>195; CHECK-NEXT: CLONE ir<%gep.src> = getelementptr inbounds ir<%src>, vp<[[STEPS]]>196; CHECK-NEXT: vp<[[VEC_PTR:%.+]]> = vector-pointer inbounds ir<%gep.src>197; CHECK-NEXT: WIDEN ir<%l> = load vp<[[VEC_PTR]]>198; CHECK-NEXT: WIDEN ir<%c.1> = icmp eq ir<%l>, ir<10>199; CHECK-NEXT: EMIT vp<%index.next> = add nuw vp<[[CAN_IV]]>, vp<[[VFxUF]]>200; CHECK-NEXT: EMIT vp<[[EA_TAKEN:%.+]]> = any-of ir<%c.1>201; CHECK-NEXT: EMIT vp<[[LATCH_CMP:%.+]]> = icmp eq vp<%index.next>, vp<[[VTC]]>202; CHECK-NEXT: EMIT vp<[[EC:%.+]]> = or vp<[[EA_TAKEN]]>, vp<[[LATCH_CMP]]>203; CHECK-NEXT: EMIT branch-on-cond vp<[[EC]]>204; CHECK-NEXT: No successors205; CHECK-NEXT: }206; CHECK-NEXT: Successor(s): middle.split207; CHECK-EMPTY:208; CHECK-NEXT: middle.split:209; CHECK-NEXT: EMIT branch-on-cond vp<[[EA_TAKEN]]>210; CHECK-NEXT: Successor(s): vector.early.exit, middle.block211; CHECK-EMPTY:212; CHECK-NEXT: middle.block:213; CHECK-NEXT: EMIT vp<[[MIDDLE_CMP:%.+]]> = icmp eq ir<128>, vp<[[VTC]]>214; CHECK-NEXT: EMIT branch-on-cond vp<[[MIDDLE_CMP]]>215; CHECK-NEXT: Successor(s): ir-bb<exit>, scalar.ph216; CHECK-EMPTY:217; CHECK-NEXT: vector.early.exit:218; CHECK-NEXT: Successor(s): ir-bb<exit>219; CHECK-EMPTY:220; CHECK-NEXT: ir-bb<exit>:221; CHECK-NEXT: IR %p = phi i64 [ 0, %loop.header ], [ 1, %loop.latch ] (extra operands: ir<1> from middle.block, ir<0> from vector.early.exit)222; CHECK-NEXT: No successors223; CHECK-EMPTY:224; CHECK-NEXT: scalar.ph:225; CHECK-NEXT: EMIT-SCALAR vp<[[RESUME:%.+]]> = phi [ vp<[[VTC]]>, middle.block ], [ ir<0>, ir-bb<entry> ]226; CHECK-NEXT: ir-bb<loop.header>227; CHECK-EMPTY:228; CHECK-NEXT: ir-bb<loop.header>:229; CHECK-NEXT: IR %iv = phi i64 [ %inc, %loop.latch ], [ 0, %entry ] (extra operand: vp<[[RESUME]]> from scalar.ph)230; CHECK: No successors231; CHECK-NEXT: }232 233entry:234 %src = alloca [128 x i32]235 call void @init(ptr %src)236 br label %loop.header237 238loop.header:239 %iv = phi i64 [ %inc, %loop.latch ], [ 0, %entry ]240 %gep.src = getelementptr inbounds i32, ptr %src, i64 %iv241 %l = load i32, ptr %gep.src242 %c.1 = icmp eq i32 %l, 10243 br i1 %c.1, label %exit, label %loop.latch244 245loop.latch:246 %inc = add nuw i64 %iv, 1247 %c.2 = icmp eq i64 %inc, 128248 br i1 %c.2, label %exit, label %loop.header249 250exit:251 %p = phi i64 [ 0, %loop.header ], [ 1, %loop.latch ]252 ret i64 %p253 254; uselistorder directives255 uselistorder label %exit, { 1, 0 }256}257