101 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -force-vector-width=4 -force-vector-interleave=1 -passes=loop-vectorize -S %s | FileCheck %s3 4target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"5 6define i32 @test(i64 %N, i32 %x) {7; CHECK-LABEL: @test(8; CHECK-NEXT: entry:9; CHECK-NEXT: [[EXTRA_ITER:%.*]] = and i64 [[N:%.*]], 710; CHECK-NEXT: br label [[CHECK:%.*]]11; CHECK: check:12; CHECK-NEXT: [[EXTRA_ITER_CHECK:%.*]] = icmp eq i64 [[EXTRA_ITER]], 013; CHECK-NEXT: br i1 [[EXTRA_ITER_CHECK]], label [[EXIT:%.*]], label [[LOOP_PREHEADER:%.*]]14; CHECK: loop.preheader:15; CHECK-NEXT: br label [[VECTOR_PH:%.*]]16; CHECK: vector.ph:17; CHECK-NEXT: [[N_RND_UP:%.*]] = add i64 [[EXTRA_ITER]], 318; CHECK-NEXT: [[N_MOD_VF:%.*]] = urem i64 [[N_RND_UP]], 419; CHECK-NEXT: [[N_VEC:%.*]] = sub i64 [[N_RND_UP]], [[N_MOD_VF]]20; CHECK-NEXT: [[TRIP_COUNT_MINUS_1:%.*]] = sub i64 [[EXTRA_ITER]], 121; CHECK-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement <4 x i64> poison, i64 [[TRIP_COUNT_MINUS_1]], i64 022; CHECK-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector <4 x i64> [[BROADCAST_SPLATINSERT]], <4 x i64> poison, <4 x i32> zeroinitializer23; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]24; CHECK: vector.body:25; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]26; CHECK-NEXT: [[VEC_PHI:%.*]] = phi <4 x i32> [ zeroinitializer, [[VECTOR_PH]] ], [ [[TMP2:%.*]], [[VECTOR_BODY]] ]27; CHECK-NEXT: [[BROADCAST_SPLATINSERT1:%.*]] = insertelement <4 x i64> poison, i64 [[INDEX]], i64 028; CHECK-NEXT: [[BROADCAST_SPLAT2:%.*]] = shufflevector <4 x i64> [[BROADCAST_SPLATINSERT1]], <4 x i64> poison, <4 x i32> zeroinitializer29; CHECK-NEXT: [[VEC_IV:%.*]] = add <4 x i64> [[BROADCAST_SPLAT2]], <i64 0, i64 1, i64 2, i64 3>30; CHECK-NEXT: [[TMP0:%.*]] = icmp ule <4 x i64> [[VEC_IV]], [[BROADCAST_SPLAT]]31; CHECK-NEXT: [[TMP1:%.*]] = icmp sgt <4 x i32> [[VEC_PHI]], splat (i32 10)32; CHECK-NEXT: [[TMP2]] = select <4 x i1> [[TMP1]], <4 x i32> [[VEC_PHI]], <4 x i32> splat (i32 10)33; CHECK-NEXT: [[TMP3:%.*]] = select <4 x i1> [[TMP0]], <4 x i32> [[TMP2]], <4 x i32> [[VEC_PHI]]34; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 435; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]36; CHECK-NEXT: br i1 [[TMP4]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]37; CHECK: middle.block:38; CHECK-NEXT: [[TMP5:%.*]] = call i32 @llvm.vector.reduce.smax.v4i32(<4 x i32> [[TMP3]])39; CHECK-NEXT: br label [[LOOP:%.*]]40; CHECK: exit.loopexit:41; CHECK-NEXT: br label [[EXIT]]42; CHECK: exit:43; CHECK-NEXT: [[RESULT:%.*]] = phi i32 [ 0, [[CHECK]] ], [ [[TMP5]], [[LOOP]] ]44; CHECK-NEXT: ret i32 [[RESULT]]45;46entry:47 %extra.iter = and i64 %N, 748 br label %check49 50check:51 %extra.iter.check = icmp eq i64 %extra.iter, 052 br i1 %extra.iter.check, label %exit, label %loop53 54loop:55 %next = phi i32 [ %sel, %loop ], [ 0, %check ]56 %iv = phi i64 [ %iv.next, %loop ], [ %extra.iter, %check ]57 %sel.cond = icmp sgt i32 %next, 1058 %sel = select i1 %sel.cond, i32 %next, i32 1059 %iv.next = add nsw i64 %iv, -160 %ec = icmp eq i64 %iv.next, 061 br i1 %ec, label %exit, label %loop62 63exit:64 %result = phi i32 [ %sel, %loop], [ 0, %check ]65 ret i32 %result66}67 68define i32 @pr66895_tail_fold_reduction_exit_inst_gets_simplified(i32 %n) {69; CHECK-LABEL: @pr66895_tail_fold_reduction_exit_inst_gets_simplified(70; CHECK-NEXT: entry:71; CHECK-NEXT: br label [[VECTOR_PH:%.*]]72; CHECK: vector.ph:73; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]74; CHECK: vector.body:75; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]76; CHECK-NEXT: [[VEC_PHI:%.*]] = phi <4 x i32> [ <i32 0, i32 1, i32 1, i32 1>, [[VECTOR_PH]] ], [ [[VEC_PHI]], [[VECTOR_BODY]] ]77; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 478; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i32 [[INDEX_NEXT]], 1679; CHECK-NEXT: br i1 [[TMP2]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP3:![0-9]+]]80; CHECK: middle.block:81; CHECK-NEXT: [[TMP3:%.*]] = call i32 @llvm.vector.reduce.mul.v4i32(<4 x i32> [[VEC_PHI]])82; CHECK-NEXT: br label [[LOOP:%.*]]83; CHECK: exit:84; CHECK-NEXT: ret i32 [[TMP3]]85;86entry:87 br label %loop88 89loop:90 %iv = phi i32 [ 12, %entry ], [ %iv.next, %loop ]91 %red = phi i32 [ 0, %entry ], [ %red.next, %loop ]92 %iv.next = add i32 %iv, -193 %red.next = mul i32 %red, 194 %ec = icmp eq i32 %iv, 095 br i1 %ec, label %exit, label %loop96 97exit:98 %red.lcssa = phi i32 [ %red.next, %loop ]99 ret i32 %red.lcssa100}101