brintos

brintos / llvm-project-archived public Read only

0
0
Text · 9.8 KiB · 00c46f4 Raw
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