2224 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 52; RUN: opt -passes=loop-vectorize \3; RUN: -prefer-predicate-over-epilogue=predicate-else-scalar-epilogue \4; RUN: -mtriple=riscv64 -mattr=+v -S %s | FileCheck %s --check-prefix=IF-EVL5 6; RUN: opt -passes=loop-vectorize \7; RUN: -prefer-predicate-over-epilogue=scalar-epilogue \8; RUN: -mtriple=riscv64 -mattr=+v -S %s | FileCheck %s --check-prefix=NO-VP9 10 11define void @test_and(ptr nocapture %a, ptr nocapture readonly %b) {12; IF-EVL-LABEL: define void @test_and(13; IF-EVL-SAME: ptr captures(none) [[A:%.*]], ptr readonly captures(none) [[B:%.*]]) #[[ATTR0:[0-9]+]] {14; IF-EVL-NEXT: [[LOOP_PREHEADER:.*:]]15; IF-EVL-NEXT: [[A2:%.*]] = ptrtoint ptr [[A]] to i6416; IF-EVL-NEXT: [[B1:%.*]] = ptrtoint ptr [[B]] to i6417; IF-EVL-NEXT: br label %[[VECTOR_MEMCHECK:.*]]18; IF-EVL: [[VECTOR_MEMCHECK]]:19; IF-EVL-NEXT: [[TMP0:%.*]] = call i64 @llvm.vscale.i64()20; IF-EVL-NEXT: [[TMP1:%.*]] = mul nuw i64 [[TMP0]], 1621; IF-EVL-NEXT: [[TMP2:%.*]] = sub i64 [[B1]], [[A2]]22; IF-EVL-NEXT: [[DIFF_CHECK:%.*]] = icmp ult i64 [[TMP2]], [[TMP1]]23; IF-EVL-NEXT: br i1 [[DIFF_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]24; IF-EVL: [[VECTOR_PH]]:25; IF-EVL-NEXT: br label %[[VECTOR_BODY:.*]]26; IF-EVL: [[VECTOR_BODY]]:27; IF-EVL-NEXT: [[EVL_BASED_IV:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_EVL_NEXT:%.*]], %[[VECTOR_BODY]] ]28; IF-EVL-NEXT: [[TMP10:%.*]] = phi i64 [ 100, %[[VECTOR_PH]] ], [ [[AVL_NEXT:%.*]], %[[VECTOR_BODY]] ]29; IF-EVL-NEXT: [[TMP11:%.*]] = call i32 @llvm.experimental.get.vector.length.i64(i64 [[TMP10]], i32 16, i1 true)30; IF-EVL-NEXT: [[TMP13:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[EVL_BASED_IV]]31; IF-EVL-NEXT: [[VP_OP_LOAD:%.*]] = call <vscale x 16 x i8> @llvm.vp.load.nxv16i8.p0(ptr align 1 [[TMP13]], <vscale x 16 x i1> splat (i1 true), i32 [[TMP11]])32; IF-EVL-NEXT: [[VP_OP:%.*]] = and <vscale x 16 x i8> [[VP_OP_LOAD]], splat (i8 1)33; IF-EVL-NEXT: [[TMP16:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[EVL_BASED_IV]]34; IF-EVL-NEXT: call void @llvm.vp.store.nxv16i8.p0(<vscale x 16 x i8> [[VP_OP]], ptr align 1 [[TMP16]], <vscale x 16 x i1> splat (i1 true), i32 [[TMP11]])35; IF-EVL-NEXT: [[TMP18:%.*]] = zext i32 [[TMP11]] to i6436; IF-EVL-NEXT: [[INDEX_EVL_NEXT]] = add nuw i64 [[TMP18]], [[EVL_BASED_IV]]37; IF-EVL-NEXT: [[AVL_NEXT]] = sub nuw i64 [[TMP10]], [[TMP18]]38; IF-EVL-NEXT: [[TMP14:%.*]] = icmp eq i64 [[AVL_NEXT]], 039; IF-EVL-NEXT: br i1 [[TMP14]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]40; IF-EVL: [[MIDDLE_BLOCK]]:41; IF-EVL-NEXT: br label %[[FINISH_LOOPEXIT:.*]]42; IF-EVL: [[SCALAR_PH]]:43; IF-EVL-NEXT: br label %[[LOOP:.*]]44; IF-EVL: [[LOOP]]:45; IF-EVL-NEXT: [[LEN:%.*]] = phi i64 [ [[DEC:%.*]], %[[LOOP]] ], [ 0, %[[SCALAR_PH]] ]46; IF-EVL-NEXT: [[DEC]] = add nsw i64 [[LEN]], 147; IF-EVL-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[LEN]]48; IF-EVL-NEXT: [[TMP20:%.*]] = load i8, ptr [[ARRAYIDX]], align 149; IF-EVL-NEXT: [[TMP:%.*]] = and i8 [[TMP20]], 150; IF-EVL-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[LEN]]51; IF-EVL-NEXT: store i8 [[TMP]], ptr [[ARRAYIDX1]], align 152; IF-EVL-NEXT: [[DOTNOT:%.*]] = icmp eq i64 [[DEC]], 10053; IF-EVL-NEXT: br i1 [[DOTNOT]], label %[[FINISH_LOOPEXIT]], label %[[LOOP]], !llvm.loop [[LOOP3:![0-9]+]]54; IF-EVL: [[FINISH_LOOPEXIT]]:55; IF-EVL-NEXT: ret void56;57; NO-VP-LABEL: define void @test_and(58; NO-VP-SAME: ptr captures(none) [[A:%.*]], ptr readonly captures(none) [[B:%.*]]) #[[ATTR0:[0-9]+]] {59; NO-VP-NEXT: [[LOOP_PREHEADER:.*]]:60; NO-VP-NEXT: [[A2:%.*]] = ptrtoint ptr [[A]] to i6461; NO-VP-NEXT: [[B1:%.*]] = ptrtoint ptr [[B]] to i6462; NO-VP-NEXT: [[TMP7:%.*]] = call i64 @llvm.vscale.i64()63; NO-VP-NEXT: [[TMP1:%.*]] = shl nuw i64 [[TMP7]], 464; NO-VP-NEXT: [[TMP14:%.*]] = call i64 @llvm.umax.i64(i64 [[TMP1]], i64 32)65; NO-VP-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 100, [[TMP14]]66; NO-VP-NEXT: br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_MEMCHECK:.*]]67; NO-VP: [[VECTOR_MEMCHECK]]:68; NO-VP-NEXT: [[TMP2:%.*]] = call i64 @llvm.vscale.i64()69; NO-VP-NEXT: [[TMP3:%.*]] = mul nuw i64 [[TMP2]], 1670; NO-VP-NEXT: [[TMP4:%.*]] = sub i64 [[B1]], [[A2]]71; NO-VP-NEXT: [[DIFF_CHECK:%.*]] = icmp ult i64 [[TMP4]], [[TMP3]]72; NO-VP-NEXT: br i1 [[DIFF_CHECK]], label %[[SCALAR_PH]], label %[[VECTOR_PH:.*]]73; NO-VP: [[VECTOR_PH]]:74; NO-VP-NEXT: [[TMP5:%.*]] = call i64 @llvm.vscale.i64()75; NO-VP-NEXT: [[TMP6:%.*]] = mul nuw i64 [[TMP5]], 1676; NO-VP-NEXT: [[N_MOD_VF:%.*]] = urem i64 100, [[TMP6]]77; NO-VP-NEXT: [[N_VEC:%.*]] = sub i64 100, [[N_MOD_VF]]78; NO-VP-NEXT: br label %[[VECTOR_BODY:.*]]79; NO-VP: [[VECTOR_BODY]]:80; NO-VP-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]81; NO-VP-NEXT: [[TMP9:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[INDEX]]82; NO-VP-NEXT: [[WIDE_LOAD:%.*]] = load <vscale x 16 x i8>, ptr [[TMP9]], align 183; NO-VP-NEXT: [[TMP10:%.*]] = and <vscale x 16 x i8> [[WIDE_LOAD]], splat (i8 1)84; NO-VP-NEXT: [[TMP11:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[INDEX]]85; NO-VP-NEXT: store <vscale x 16 x i8> [[TMP10]], ptr [[TMP11]], align 186; NO-VP-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], [[TMP6]]87; NO-VP-NEXT: [[TMP12:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]88; NO-VP-NEXT: br i1 [[TMP12]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]89; NO-VP: [[MIDDLE_BLOCK]]:90; NO-VP-NEXT: [[CMP_N:%.*]] = icmp eq i64 100, [[N_VEC]]91; NO-VP-NEXT: br i1 [[CMP_N]], label %[[FINISH_LOOPEXIT:.*]], label %[[SCALAR_PH]]92; NO-VP: [[SCALAR_PH]]:93; NO-VP-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[LOOP_PREHEADER]] ], [ 0, %[[VECTOR_MEMCHECK]] ]94; NO-VP-NEXT: br label %[[LOOP:.*]]95; NO-VP: [[LOOP]]:96; NO-VP-NEXT: [[LEN:%.*]] = phi i64 [ [[DEC:%.*]], %[[LOOP]] ], [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ]97; NO-VP-NEXT: [[DEC]] = add nsw i64 [[LEN]], 198; NO-VP-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[LEN]]99; NO-VP-NEXT: [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1100; NO-VP-NEXT: [[TMP:%.*]] = and i8 [[TMP0]], 1101; NO-VP-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[LEN]]102; NO-VP-NEXT: store i8 [[TMP]], ptr [[ARRAYIDX1]], align 1103; NO-VP-NEXT: [[DOTNOT:%.*]] = icmp eq i64 [[DEC]], 100104; NO-VP-NEXT: br i1 [[DOTNOT]], label %[[FINISH_LOOPEXIT]], label %[[LOOP]], !llvm.loop [[LOOP3:![0-9]+]]105; NO-VP: [[FINISH_LOOPEXIT]]:106; NO-VP-NEXT: ret void107;108loop.preheader:109 br label %loop110 111loop:112 %len = phi i64 [ %dec, %loop ], [ 0, %loop.preheader ]113 %dec = add nsw i64 %len, 1114 %arrayidx = getelementptr inbounds i8, ptr %a, i64 %len115 %0 = load i8, ptr %arrayidx, align 1116 %tmp = and i8 %0, 1117 %arrayidx1 = getelementptr inbounds i8, ptr %b, i64 %len118 store i8 %tmp, ptr %arrayidx1, align 1119 %.not = icmp eq i64 %dec, 100120 br i1 %.not, label %finish.loopexit, label %loop121 122finish.loopexit:123 ret void124}125 126define void @test_or(ptr nocapture %a, ptr nocapture readonly %b) {127; IF-EVL-LABEL: define void @test_or(128; IF-EVL-SAME: ptr captures(none) [[A:%.*]], ptr readonly captures(none) [[B:%.*]]) #[[ATTR0]] {129; IF-EVL-NEXT: [[LOOP_PREHEADER:.*:]]130; IF-EVL-NEXT: [[A2:%.*]] = ptrtoint ptr [[A]] to i64131; IF-EVL-NEXT: [[B1:%.*]] = ptrtoint ptr [[B]] to i64132; IF-EVL-NEXT: br label %[[VECTOR_MEMCHECK:.*]]133; IF-EVL: [[VECTOR_MEMCHECK]]:134; IF-EVL-NEXT: [[TMP0:%.*]] = call i64 @llvm.vscale.i64()135; IF-EVL-NEXT: [[TMP1:%.*]] = mul nuw i64 [[TMP0]], 16136; IF-EVL-NEXT: [[TMP2:%.*]] = sub i64 [[B1]], [[A2]]137; IF-EVL-NEXT: [[DIFF_CHECK:%.*]] = icmp ult i64 [[TMP2]], [[TMP1]]138; IF-EVL-NEXT: br i1 [[DIFF_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]139; IF-EVL: [[VECTOR_PH]]:140; IF-EVL-NEXT: br label %[[VECTOR_BODY:.*]]141; IF-EVL: [[VECTOR_BODY]]:142; IF-EVL-NEXT: [[EVL_BASED_IV:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_EVL_NEXT:%.*]], %[[VECTOR_BODY]] ]143; IF-EVL-NEXT: [[TMP10:%.*]] = phi i64 [ 100, %[[VECTOR_PH]] ], [ [[AVL_NEXT:%.*]], %[[VECTOR_BODY]] ]144; IF-EVL-NEXT: [[TMP11:%.*]] = call i32 @llvm.experimental.get.vector.length.i64(i64 [[TMP10]], i32 16, i1 true)145; IF-EVL-NEXT: [[TMP13:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[EVL_BASED_IV]]146; IF-EVL-NEXT: [[VP_OP_LOAD:%.*]] = call <vscale x 16 x i8> @llvm.vp.load.nxv16i8.p0(ptr align 1 [[TMP13]], <vscale x 16 x i1> splat (i1 true), i32 [[TMP11]])147; IF-EVL-NEXT: [[VP_OP:%.*]] = or <vscale x 16 x i8> [[VP_OP_LOAD]], splat (i8 1)148; IF-EVL-NEXT: [[TMP16:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[EVL_BASED_IV]]149; IF-EVL-NEXT: call void @llvm.vp.store.nxv16i8.p0(<vscale x 16 x i8> [[VP_OP]], ptr align 1 [[TMP16]], <vscale x 16 x i1> splat (i1 true), i32 [[TMP11]])150; IF-EVL-NEXT: [[TMP18:%.*]] = zext i32 [[TMP11]] to i64151; IF-EVL-NEXT: [[INDEX_EVL_NEXT]] = add nuw i64 [[TMP18]], [[EVL_BASED_IV]]152; IF-EVL-NEXT: [[AVL_NEXT]] = sub nuw i64 [[TMP10]], [[TMP18]]153; IF-EVL-NEXT: [[TMP14:%.*]] = icmp eq i64 [[AVL_NEXT]], 0154; IF-EVL-NEXT: br i1 [[TMP14]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]155; IF-EVL: [[MIDDLE_BLOCK]]:156; IF-EVL-NEXT: br label %[[FINISH_LOOPEXIT:.*]]157; IF-EVL: [[SCALAR_PH]]:158; IF-EVL-NEXT: br label %[[LOOP:.*]]159; IF-EVL: [[LOOP]]:160; IF-EVL-NEXT: [[LEN:%.*]] = phi i64 [ [[DEC:%.*]], %[[LOOP]] ], [ 0, %[[SCALAR_PH]] ]161; IF-EVL-NEXT: [[DEC]] = add nsw i64 [[LEN]], 1162; IF-EVL-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[LEN]]163; IF-EVL-NEXT: [[TMP20:%.*]] = load i8, ptr [[ARRAYIDX]], align 1164; IF-EVL-NEXT: [[TMP:%.*]] = or i8 [[TMP20]], 1165; IF-EVL-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[LEN]]166; IF-EVL-NEXT: store i8 [[TMP]], ptr [[ARRAYIDX1]], align 1167; IF-EVL-NEXT: [[DOTNOT:%.*]] = icmp eq i64 [[DEC]], 100168; IF-EVL-NEXT: br i1 [[DOTNOT]], label %[[FINISH_LOOPEXIT]], label %[[LOOP]], !llvm.loop [[LOOP5:![0-9]+]]169; IF-EVL: [[FINISH_LOOPEXIT]]:170; IF-EVL-NEXT: ret void171;172; NO-VP-LABEL: define void @test_or(173; NO-VP-SAME: ptr captures(none) [[A:%.*]], ptr readonly captures(none) [[B:%.*]]) #[[ATTR0]] {174; NO-VP-NEXT: [[LOOP_PREHEADER:.*]]:175; NO-VP-NEXT: [[A2:%.*]] = ptrtoint ptr [[A]] to i64176; NO-VP-NEXT: [[B1:%.*]] = ptrtoint ptr [[B]] to i64177; NO-VP-NEXT: [[TMP7:%.*]] = call i64 @llvm.vscale.i64()178; NO-VP-NEXT: [[TMP1:%.*]] = shl nuw i64 [[TMP7]], 4179; NO-VP-NEXT: [[TMP14:%.*]] = call i64 @llvm.umax.i64(i64 [[TMP1]], i64 32)180; NO-VP-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 100, [[TMP14]]181; NO-VP-NEXT: br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_MEMCHECK:.*]]182; NO-VP: [[VECTOR_MEMCHECK]]:183; NO-VP-NEXT: [[TMP2:%.*]] = call i64 @llvm.vscale.i64()184; NO-VP-NEXT: [[TMP3:%.*]] = mul nuw i64 [[TMP2]], 16185; NO-VP-NEXT: [[TMP4:%.*]] = sub i64 [[B1]], [[A2]]186; NO-VP-NEXT: [[DIFF_CHECK:%.*]] = icmp ult i64 [[TMP4]], [[TMP3]]187; NO-VP-NEXT: br i1 [[DIFF_CHECK]], label %[[SCALAR_PH]], label %[[VECTOR_PH:.*]]188; NO-VP: [[VECTOR_PH]]:189; NO-VP-NEXT: [[TMP5:%.*]] = call i64 @llvm.vscale.i64()190; NO-VP-NEXT: [[TMP6:%.*]] = mul nuw i64 [[TMP5]], 16191; NO-VP-NEXT: [[N_MOD_VF:%.*]] = urem i64 100, [[TMP6]]192; NO-VP-NEXT: [[N_VEC:%.*]] = sub i64 100, [[N_MOD_VF]]193; NO-VP-NEXT: br label %[[VECTOR_BODY:.*]]194; NO-VP: [[VECTOR_BODY]]:195; NO-VP-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]196; NO-VP-NEXT: [[TMP9:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[INDEX]]197; NO-VP-NEXT: [[WIDE_LOAD:%.*]] = load <vscale x 16 x i8>, ptr [[TMP9]], align 1198; NO-VP-NEXT: [[TMP10:%.*]] = or <vscale x 16 x i8> [[WIDE_LOAD]], splat (i8 1)199; NO-VP-NEXT: [[TMP11:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[INDEX]]200; NO-VP-NEXT: store <vscale x 16 x i8> [[TMP10]], ptr [[TMP11]], align 1201; NO-VP-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], [[TMP6]]202; NO-VP-NEXT: [[TMP12:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]203; NO-VP-NEXT: br i1 [[TMP12]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]204; NO-VP: [[MIDDLE_BLOCK]]:205; NO-VP-NEXT: [[CMP_N:%.*]] = icmp eq i64 100, [[N_VEC]]206; NO-VP-NEXT: br i1 [[CMP_N]], label %[[FINISH_LOOPEXIT:.*]], label %[[SCALAR_PH]]207; NO-VP: [[SCALAR_PH]]:208; NO-VP-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[LOOP_PREHEADER]] ], [ 0, %[[VECTOR_MEMCHECK]] ]209; NO-VP-NEXT: br label %[[LOOP:.*]]210; NO-VP: [[LOOP]]:211; NO-VP-NEXT: [[LEN:%.*]] = phi i64 [ [[DEC:%.*]], %[[LOOP]] ], [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ]212; NO-VP-NEXT: [[DEC]] = add nsw i64 [[LEN]], 1213; NO-VP-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[LEN]]214; NO-VP-NEXT: [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1215; NO-VP-NEXT: [[TMP:%.*]] = or i8 [[TMP0]], 1216; NO-VP-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[LEN]]217; NO-VP-NEXT: store i8 [[TMP]], ptr [[ARRAYIDX1]], align 1218; NO-VP-NEXT: [[DOTNOT:%.*]] = icmp eq i64 [[DEC]], 100219; NO-VP-NEXT: br i1 [[DOTNOT]], label %[[FINISH_LOOPEXIT]], label %[[LOOP]], !llvm.loop [[LOOP5:![0-9]+]]220; NO-VP: [[FINISH_LOOPEXIT]]:221; NO-VP-NEXT: ret void222;223loop.preheader:224 br label %loop225 226loop:227 %len = phi i64 [ %dec, %loop ], [ 0, %loop.preheader ]228 %dec = add nsw i64 %len, 1229 %arrayidx = getelementptr inbounds i8, ptr %a, i64 %len230 %0 = load i8, ptr %arrayidx, align 1231 %tmp = or i8 %0, 1232 %arrayidx1 = getelementptr inbounds i8, ptr %b, i64 %len233 store i8 %tmp, ptr %arrayidx1, align 1234 %.not = icmp eq i64 %dec, 100235 br i1 %.not, label %finish.loopexit, label %loop236 237finish.loopexit:238 ret void239}240 241define void @test_xor(ptr nocapture %a, ptr nocapture readonly %b) {242; IF-EVL-LABEL: define void @test_xor(243; IF-EVL-SAME: ptr captures(none) [[A:%.*]], ptr readonly captures(none) [[B:%.*]]) #[[ATTR0]] {244; IF-EVL-NEXT: [[LOOP_PREHEADER:.*:]]245; IF-EVL-NEXT: [[A2:%.*]] = ptrtoint ptr [[A]] to i64246; IF-EVL-NEXT: [[B1:%.*]] = ptrtoint ptr [[B]] to i64247; IF-EVL-NEXT: br label %[[VECTOR_MEMCHECK:.*]]248; IF-EVL: [[VECTOR_MEMCHECK]]:249; IF-EVL-NEXT: [[TMP0:%.*]] = call i64 @llvm.vscale.i64()250; IF-EVL-NEXT: [[TMP1:%.*]] = mul nuw i64 [[TMP0]], 16251; IF-EVL-NEXT: [[TMP2:%.*]] = sub i64 [[B1]], [[A2]]252; IF-EVL-NEXT: [[DIFF_CHECK:%.*]] = icmp ult i64 [[TMP2]], [[TMP1]]253; IF-EVL-NEXT: br i1 [[DIFF_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]254; IF-EVL: [[VECTOR_PH]]:255; IF-EVL-NEXT: br label %[[VECTOR_BODY:.*]]256; IF-EVL: [[VECTOR_BODY]]:257; IF-EVL-NEXT: [[EVL_BASED_IV:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_EVL_NEXT:%.*]], %[[VECTOR_BODY]] ]258; IF-EVL-NEXT: [[TMP10:%.*]] = phi i64 [ 100, %[[VECTOR_PH]] ], [ [[AVL_NEXT:%.*]], %[[VECTOR_BODY]] ]259; IF-EVL-NEXT: [[TMP11:%.*]] = call i32 @llvm.experimental.get.vector.length.i64(i64 [[TMP10]], i32 16, i1 true)260; IF-EVL-NEXT: [[TMP13:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[EVL_BASED_IV]]261; IF-EVL-NEXT: [[VP_OP_LOAD:%.*]] = call <vscale x 16 x i8> @llvm.vp.load.nxv16i8.p0(ptr align 1 [[TMP13]], <vscale x 16 x i1> splat (i1 true), i32 [[TMP11]])262; IF-EVL-NEXT: [[VP_OP:%.*]] = xor <vscale x 16 x i8> [[VP_OP_LOAD]], splat (i8 1)263; IF-EVL-NEXT: [[TMP16:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[EVL_BASED_IV]]264; IF-EVL-NEXT: call void @llvm.vp.store.nxv16i8.p0(<vscale x 16 x i8> [[VP_OP]], ptr align 1 [[TMP16]], <vscale x 16 x i1> splat (i1 true), i32 [[TMP11]])265; IF-EVL-NEXT: [[TMP18:%.*]] = zext i32 [[TMP11]] to i64266; IF-EVL-NEXT: [[INDEX_EVL_NEXT]] = add nuw i64 [[TMP18]], [[EVL_BASED_IV]]267; IF-EVL-NEXT: [[AVL_NEXT]] = sub nuw i64 [[TMP10]], [[TMP18]]268; IF-EVL-NEXT: [[TMP14:%.*]] = icmp eq i64 [[AVL_NEXT]], 0269; IF-EVL-NEXT: br i1 [[TMP14]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP6:![0-9]+]]270; IF-EVL: [[MIDDLE_BLOCK]]:271; IF-EVL-NEXT: br label %[[FINISH_LOOPEXIT:.*]]272; IF-EVL: [[SCALAR_PH]]:273; IF-EVL-NEXT: br label %[[LOOP:.*]]274; IF-EVL: [[LOOP]]:275; IF-EVL-NEXT: [[LEN:%.*]] = phi i64 [ [[DEC:%.*]], %[[LOOP]] ], [ 0, %[[SCALAR_PH]] ]276; IF-EVL-NEXT: [[DEC]] = add nsw i64 [[LEN]], 1277; IF-EVL-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[LEN]]278; IF-EVL-NEXT: [[TMP20:%.*]] = load i8, ptr [[ARRAYIDX]], align 1279; IF-EVL-NEXT: [[TMP:%.*]] = xor i8 [[TMP20]], 1280; IF-EVL-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[LEN]]281; IF-EVL-NEXT: store i8 [[TMP]], ptr [[ARRAYIDX1]], align 1282; IF-EVL-NEXT: [[DOTNOT:%.*]] = icmp eq i64 [[DEC]], 100283; IF-EVL-NEXT: br i1 [[DOTNOT]], label %[[FINISH_LOOPEXIT]], label %[[LOOP]], !llvm.loop [[LOOP7:![0-9]+]]284; IF-EVL: [[FINISH_LOOPEXIT]]:285; IF-EVL-NEXT: ret void286;287; NO-VP-LABEL: define void @test_xor(288; NO-VP-SAME: ptr captures(none) [[A:%.*]], ptr readonly captures(none) [[B:%.*]]) #[[ATTR0]] {289; NO-VP-NEXT: [[LOOP_PREHEADER:.*]]:290; NO-VP-NEXT: [[A2:%.*]] = ptrtoint ptr [[A]] to i64291; NO-VP-NEXT: [[B1:%.*]] = ptrtoint ptr [[B]] to i64292; NO-VP-NEXT: [[TMP7:%.*]] = call i64 @llvm.vscale.i64()293; NO-VP-NEXT: [[TMP1:%.*]] = shl nuw i64 [[TMP7]], 4294; NO-VP-NEXT: [[TMP14:%.*]] = call i64 @llvm.umax.i64(i64 [[TMP1]], i64 32)295; NO-VP-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 100, [[TMP14]]296; NO-VP-NEXT: br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_MEMCHECK:.*]]297; NO-VP: [[VECTOR_MEMCHECK]]:298; NO-VP-NEXT: [[TMP2:%.*]] = call i64 @llvm.vscale.i64()299; NO-VP-NEXT: [[TMP3:%.*]] = mul nuw i64 [[TMP2]], 16300; NO-VP-NEXT: [[TMP4:%.*]] = sub i64 [[B1]], [[A2]]301; NO-VP-NEXT: [[DIFF_CHECK:%.*]] = icmp ult i64 [[TMP4]], [[TMP3]]302; NO-VP-NEXT: br i1 [[DIFF_CHECK]], label %[[SCALAR_PH]], label %[[VECTOR_PH:.*]]303; NO-VP: [[VECTOR_PH]]:304; NO-VP-NEXT: [[TMP5:%.*]] = call i64 @llvm.vscale.i64()305; NO-VP-NEXT: [[TMP6:%.*]] = mul nuw i64 [[TMP5]], 16306; NO-VP-NEXT: [[N_MOD_VF:%.*]] = urem i64 100, [[TMP6]]307; NO-VP-NEXT: [[N_VEC:%.*]] = sub i64 100, [[N_MOD_VF]]308; NO-VP-NEXT: br label %[[VECTOR_BODY:.*]]309; NO-VP: [[VECTOR_BODY]]:310; NO-VP-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]311; NO-VP-NEXT: [[TMP9:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[INDEX]]312; NO-VP-NEXT: [[WIDE_LOAD:%.*]] = load <vscale x 16 x i8>, ptr [[TMP9]], align 1313; NO-VP-NEXT: [[TMP10:%.*]] = xor <vscale x 16 x i8> [[WIDE_LOAD]], splat (i8 1)314; NO-VP-NEXT: [[TMP11:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[INDEX]]315; NO-VP-NEXT: store <vscale x 16 x i8> [[TMP10]], ptr [[TMP11]], align 1316; NO-VP-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], [[TMP6]]317; NO-VP-NEXT: [[TMP12:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]318; NO-VP-NEXT: br i1 [[TMP12]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP6:![0-9]+]]319; NO-VP: [[MIDDLE_BLOCK]]:320; NO-VP-NEXT: [[CMP_N:%.*]] = icmp eq i64 100, [[N_VEC]]321; NO-VP-NEXT: br i1 [[CMP_N]], label %[[FINISH_LOOPEXIT:.*]], label %[[SCALAR_PH]]322; NO-VP: [[SCALAR_PH]]:323; NO-VP-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[LOOP_PREHEADER]] ], [ 0, %[[VECTOR_MEMCHECK]] ]324; NO-VP-NEXT: br label %[[LOOP:.*]]325; NO-VP: [[LOOP]]:326; NO-VP-NEXT: [[LEN:%.*]] = phi i64 [ [[DEC:%.*]], %[[LOOP]] ], [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ]327; NO-VP-NEXT: [[DEC]] = add nsw i64 [[LEN]], 1328; NO-VP-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[LEN]]329; NO-VP-NEXT: [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1330; NO-VP-NEXT: [[TMP:%.*]] = xor i8 [[TMP0]], 1331; NO-VP-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[LEN]]332; NO-VP-NEXT: store i8 [[TMP]], ptr [[ARRAYIDX1]], align 1333; NO-VP-NEXT: [[DOTNOT:%.*]] = icmp eq i64 [[DEC]], 100334; NO-VP-NEXT: br i1 [[DOTNOT]], label %[[FINISH_LOOPEXIT]], label %[[LOOP]], !llvm.loop [[LOOP7:![0-9]+]]335; NO-VP: [[FINISH_LOOPEXIT]]:336; NO-VP-NEXT: ret void337;338loop.preheader:339 br label %loop340 341loop:342 %len = phi i64 [ %dec, %loop ], [ 0, %loop.preheader ]343 %dec = add nsw i64 %len, 1344 %arrayidx = getelementptr inbounds i8, ptr %a, i64 %len345 %0 = load i8, ptr %arrayidx, align 1346 %tmp = xor i8 %0, 1347 %arrayidx1 = getelementptr inbounds i8, ptr %b, i64 %len348 store i8 %tmp, ptr %arrayidx1, align 1349 %.not = icmp eq i64 %dec, 100350 br i1 %.not, label %finish.loopexit, label %loop351 352finish.loopexit:353 ret void354}355 356define void @test_shl(ptr nocapture %a, ptr nocapture readonly %b) {357; IF-EVL-LABEL: define void @test_shl(358; IF-EVL-SAME: ptr captures(none) [[A:%.*]], ptr readonly captures(none) [[B:%.*]]) #[[ATTR0]] {359; IF-EVL-NEXT: [[LOOP_PREHEADER:.*:]]360; IF-EVL-NEXT: [[A2:%.*]] = ptrtoint ptr [[A]] to i64361; IF-EVL-NEXT: [[B1:%.*]] = ptrtoint ptr [[B]] to i64362; IF-EVL-NEXT: br label %[[VECTOR_MEMCHECK:.*]]363; IF-EVL: [[VECTOR_MEMCHECK]]:364; IF-EVL-NEXT: [[TMP0:%.*]] = call i64 @llvm.vscale.i64()365; IF-EVL-NEXT: [[TMP1:%.*]] = mul nuw i64 [[TMP0]], 16366; IF-EVL-NEXT: [[TMP2:%.*]] = sub i64 [[B1]], [[A2]]367; IF-EVL-NEXT: [[DIFF_CHECK:%.*]] = icmp ult i64 [[TMP2]], [[TMP1]]368; IF-EVL-NEXT: br i1 [[DIFF_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]369; IF-EVL: [[VECTOR_PH]]:370; IF-EVL-NEXT: br label %[[VECTOR_BODY:.*]]371; IF-EVL: [[VECTOR_BODY]]:372; IF-EVL-NEXT: [[EVL_BASED_IV:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_EVL_NEXT:%.*]], %[[VECTOR_BODY]] ]373; IF-EVL-NEXT: [[TMP10:%.*]] = phi i64 [ 100, %[[VECTOR_PH]] ], [ [[AVL_NEXT:%.*]], %[[VECTOR_BODY]] ]374; IF-EVL-NEXT: [[TMP11:%.*]] = call i32 @llvm.experimental.get.vector.length.i64(i64 [[TMP10]], i32 16, i1 true)375; IF-EVL-NEXT: [[TMP13:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[EVL_BASED_IV]]376; IF-EVL-NEXT: [[VP_OP_LOAD:%.*]] = call <vscale x 16 x i8> @llvm.vp.load.nxv16i8.p0(ptr align 1 [[TMP13]], <vscale x 16 x i1> splat (i1 true), i32 [[TMP11]])377; IF-EVL-NEXT: [[VP_OP:%.*]] = shl <vscale x 16 x i8> [[VP_OP_LOAD]], splat (i8 1)378; IF-EVL-NEXT: [[TMP16:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[EVL_BASED_IV]]379; IF-EVL-NEXT: call void @llvm.vp.store.nxv16i8.p0(<vscale x 16 x i8> [[VP_OP]], ptr align 1 [[TMP16]], <vscale x 16 x i1> splat (i1 true), i32 [[TMP11]])380; IF-EVL-NEXT: [[TMP18:%.*]] = zext i32 [[TMP11]] to i64381; IF-EVL-NEXT: [[INDEX_EVL_NEXT]] = add nuw i64 [[TMP18]], [[EVL_BASED_IV]]382; IF-EVL-NEXT: [[AVL_NEXT]] = sub nuw i64 [[TMP10]], [[TMP18]]383; IF-EVL-NEXT: [[TMP14:%.*]] = icmp eq i64 [[AVL_NEXT]], 0384; IF-EVL-NEXT: br i1 [[TMP14]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP8:![0-9]+]]385; IF-EVL: [[MIDDLE_BLOCK]]:386; IF-EVL-NEXT: br label %[[FINISH_LOOPEXIT:.*]]387; IF-EVL: [[SCALAR_PH]]:388; IF-EVL-NEXT: br label %[[LOOP:.*]]389; IF-EVL: [[LOOP]]:390; IF-EVL-NEXT: [[LEN:%.*]] = phi i64 [ [[DEC:%.*]], %[[LOOP]] ], [ 0, %[[SCALAR_PH]] ]391; IF-EVL-NEXT: [[DEC]] = add nsw i64 [[LEN]], 1392; IF-EVL-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[LEN]]393; IF-EVL-NEXT: [[TMP20:%.*]] = load i8, ptr [[ARRAYIDX]], align 1394; IF-EVL-NEXT: [[TMP:%.*]] = shl i8 [[TMP20]], 1395; IF-EVL-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[LEN]]396; IF-EVL-NEXT: store i8 [[TMP]], ptr [[ARRAYIDX1]], align 1397; IF-EVL-NEXT: [[DOTNOT:%.*]] = icmp eq i64 [[DEC]], 100398; IF-EVL-NEXT: br i1 [[DOTNOT]], label %[[FINISH_LOOPEXIT]], label %[[LOOP]], !llvm.loop [[LOOP9:![0-9]+]]399; IF-EVL: [[FINISH_LOOPEXIT]]:400; IF-EVL-NEXT: ret void401;402; NO-VP-LABEL: define void @test_shl(403; NO-VP-SAME: ptr captures(none) [[A:%.*]], ptr readonly captures(none) [[B:%.*]]) #[[ATTR0]] {404; NO-VP-NEXT: [[LOOP_PREHEADER:.*]]:405; NO-VP-NEXT: [[A2:%.*]] = ptrtoint ptr [[A]] to i64406; NO-VP-NEXT: [[B1:%.*]] = ptrtoint ptr [[B]] to i64407; NO-VP-NEXT: [[TMP7:%.*]] = call i64 @llvm.vscale.i64()408; NO-VP-NEXT: [[TMP1:%.*]] = shl nuw i64 [[TMP7]], 4409; NO-VP-NEXT: [[TMP14:%.*]] = call i64 @llvm.umax.i64(i64 [[TMP1]], i64 32)410; NO-VP-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 100, [[TMP14]]411; NO-VP-NEXT: br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_MEMCHECK:.*]]412; NO-VP: [[VECTOR_MEMCHECK]]:413; NO-VP-NEXT: [[TMP2:%.*]] = call i64 @llvm.vscale.i64()414; NO-VP-NEXT: [[TMP3:%.*]] = mul nuw i64 [[TMP2]], 16415; NO-VP-NEXT: [[TMP4:%.*]] = sub i64 [[B1]], [[A2]]416; NO-VP-NEXT: [[DIFF_CHECK:%.*]] = icmp ult i64 [[TMP4]], [[TMP3]]417; NO-VP-NEXT: br i1 [[DIFF_CHECK]], label %[[SCALAR_PH]], label %[[VECTOR_PH:.*]]418; NO-VP: [[VECTOR_PH]]:419; NO-VP-NEXT: [[TMP5:%.*]] = call i64 @llvm.vscale.i64()420; NO-VP-NEXT: [[TMP6:%.*]] = mul nuw i64 [[TMP5]], 16421; NO-VP-NEXT: [[N_MOD_VF:%.*]] = urem i64 100, [[TMP6]]422; NO-VP-NEXT: [[N_VEC:%.*]] = sub i64 100, [[N_MOD_VF]]423; NO-VP-NEXT: br label %[[VECTOR_BODY:.*]]424; NO-VP: [[VECTOR_BODY]]:425; NO-VP-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]426; NO-VP-NEXT: [[TMP9:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[INDEX]]427; NO-VP-NEXT: [[WIDE_LOAD:%.*]] = load <vscale x 16 x i8>, ptr [[TMP9]], align 1428; NO-VP-NEXT: [[TMP10:%.*]] = shl <vscale x 16 x i8> [[WIDE_LOAD]], splat (i8 1)429; NO-VP-NEXT: [[TMP11:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[INDEX]]430; NO-VP-NEXT: store <vscale x 16 x i8> [[TMP10]], ptr [[TMP11]], align 1431; NO-VP-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], [[TMP6]]432; NO-VP-NEXT: [[TMP12:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]433; NO-VP-NEXT: br i1 [[TMP12]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP8:![0-9]+]]434; NO-VP: [[MIDDLE_BLOCK]]:435; NO-VP-NEXT: [[CMP_N:%.*]] = icmp eq i64 100, [[N_VEC]]436; NO-VP-NEXT: br i1 [[CMP_N]], label %[[FINISH_LOOPEXIT:.*]], label %[[SCALAR_PH]]437; NO-VP: [[SCALAR_PH]]:438; NO-VP-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[LOOP_PREHEADER]] ], [ 0, %[[VECTOR_MEMCHECK]] ]439; NO-VP-NEXT: br label %[[LOOP:.*]]440; NO-VP: [[LOOP]]:441; NO-VP-NEXT: [[LEN:%.*]] = phi i64 [ [[DEC:%.*]], %[[LOOP]] ], [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ]442; NO-VP-NEXT: [[DEC]] = add nsw i64 [[LEN]], 1443; NO-VP-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[LEN]]444; NO-VP-NEXT: [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1445; NO-VP-NEXT: [[TMP:%.*]] = shl i8 [[TMP0]], 1446; NO-VP-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[LEN]]447; NO-VP-NEXT: store i8 [[TMP]], ptr [[ARRAYIDX1]], align 1448; NO-VP-NEXT: [[DOTNOT:%.*]] = icmp eq i64 [[DEC]], 100449; NO-VP-NEXT: br i1 [[DOTNOT]], label %[[FINISH_LOOPEXIT]], label %[[LOOP]], !llvm.loop [[LOOP9:![0-9]+]]450; NO-VP: [[FINISH_LOOPEXIT]]:451; NO-VP-NEXT: ret void452;453loop.preheader:454 br label %loop455 456loop:457 %len = phi i64 [ %dec, %loop ], [ 0, %loop.preheader ]458 %dec = add nsw i64 %len, 1459 %arrayidx = getelementptr inbounds i8, ptr %a, i64 %len460 %0 = load i8, ptr %arrayidx, align 1461 %tmp = shl i8 %0, 1462 %arrayidx1 = getelementptr inbounds i8, ptr %b, i64 %len463 store i8 %tmp, ptr %arrayidx1, align 1464 %.not = icmp eq i64 %dec, 100465 br i1 %.not, label %finish.loopexit, label %loop466 467finish.loopexit:468 ret void469}470 471define void @test_lshr(ptr nocapture %a, ptr nocapture readonly %b) {472; IF-EVL-LABEL: define void @test_lshr(473; IF-EVL-SAME: ptr captures(none) [[A:%.*]], ptr readonly captures(none) [[B:%.*]]) #[[ATTR0]] {474; IF-EVL-NEXT: [[LOOP_PREHEADER:.*:]]475; IF-EVL-NEXT: [[A2:%.*]] = ptrtoint ptr [[A]] to i64476; IF-EVL-NEXT: [[B1:%.*]] = ptrtoint ptr [[B]] to i64477; IF-EVL-NEXT: br label %[[VECTOR_MEMCHECK:.*]]478; IF-EVL: [[VECTOR_MEMCHECK]]:479; IF-EVL-NEXT: [[TMP0:%.*]] = call i64 @llvm.vscale.i64()480; IF-EVL-NEXT: [[TMP1:%.*]] = mul nuw i64 [[TMP0]], 16481; IF-EVL-NEXT: [[TMP2:%.*]] = sub i64 [[B1]], [[A2]]482; IF-EVL-NEXT: [[DIFF_CHECK:%.*]] = icmp ult i64 [[TMP2]], [[TMP1]]483; IF-EVL-NEXT: br i1 [[DIFF_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]484; IF-EVL: [[VECTOR_PH]]:485; IF-EVL-NEXT: br label %[[VECTOR_BODY:.*]]486; IF-EVL: [[VECTOR_BODY]]:487; IF-EVL-NEXT: [[EVL_BASED_IV:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_EVL_NEXT:%.*]], %[[VECTOR_BODY]] ]488; IF-EVL-NEXT: [[TMP10:%.*]] = phi i64 [ 100, %[[VECTOR_PH]] ], [ [[AVL_NEXT:%.*]], %[[VECTOR_BODY]] ]489; IF-EVL-NEXT: [[TMP11:%.*]] = call i32 @llvm.experimental.get.vector.length.i64(i64 [[TMP10]], i32 16, i1 true)490; IF-EVL-NEXT: [[TMP13:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[EVL_BASED_IV]]491; IF-EVL-NEXT: [[VP_OP_LOAD:%.*]] = call <vscale x 16 x i8> @llvm.vp.load.nxv16i8.p0(ptr align 1 [[TMP13]], <vscale x 16 x i1> splat (i1 true), i32 [[TMP11]])492; IF-EVL-NEXT: [[VP_OP:%.*]] = lshr <vscale x 16 x i8> [[VP_OP_LOAD]], splat (i8 1)493; IF-EVL-NEXT: [[TMP16:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[EVL_BASED_IV]]494; IF-EVL-NEXT: call void @llvm.vp.store.nxv16i8.p0(<vscale x 16 x i8> [[VP_OP]], ptr align 1 [[TMP16]], <vscale x 16 x i1> splat (i1 true), i32 [[TMP11]])495; IF-EVL-NEXT: [[TMP18:%.*]] = zext i32 [[TMP11]] to i64496; IF-EVL-NEXT: [[INDEX_EVL_NEXT]] = add nuw i64 [[TMP18]], [[EVL_BASED_IV]]497; IF-EVL-NEXT: [[AVL_NEXT]] = sub nuw i64 [[TMP10]], [[TMP18]]498; IF-EVL-NEXT: [[TMP14:%.*]] = icmp eq i64 [[AVL_NEXT]], 0499; IF-EVL-NEXT: br i1 [[TMP14]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP10:![0-9]+]]500; IF-EVL: [[MIDDLE_BLOCK]]:501; IF-EVL-NEXT: br label %[[FINISH_LOOPEXIT:.*]]502; IF-EVL: [[SCALAR_PH]]:503; IF-EVL-NEXT: br label %[[LOOP:.*]]504; IF-EVL: [[LOOP]]:505; IF-EVL-NEXT: [[LEN:%.*]] = phi i64 [ [[DEC:%.*]], %[[LOOP]] ], [ 0, %[[SCALAR_PH]] ]506; IF-EVL-NEXT: [[DEC]] = add nsw i64 [[LEN]], 1507; IF-EVL-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[LEN]]508; IF-EVL-NEXT: [[TMP20:%.*]] = load i8, ptr [[ARRAYIDX]], align 1509; IF-EVL-NEXT: [[TMP:%.*]] = lshr i8 [[TMP20]], 1510; IF-EVL-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[LEN]]511; IF-EVL-NEXT: store i8 [[TMP]], ptr [[ARRAYIDX1]], align 1512; IF-EVL-NEXT: [[DOTNOT:%.*]] = icmp eq i64 [[DEC]], 100513; IF-EVL-NEXT: br i1 [[DOTNOT]], label %[[FINISH_LOOPEXIT]], label %[[LOOP]], !llvm.loop [[LOOP11:![0-9]+]]514; IF-EVL: [[FINISH_LOOPEXIT]]:515; IF-EVL-NEXT: ret void516;517; NO-VP-LABEL: define void @test_lshr(518; NO-VP-SAME: ptr captures(none) [[A:%.*]], ptr readonly captures(none) [[B:%.*]]) #[[ATTR0]] {519; NO-VP-NEXT: [[LOOP_PREHEADER:.*]]:520; NO-VP-NEXT: [[A2:%.*]] = ptrtoint ptr [[A]] to i64521; NO-VP-NEXT: [[B1:%.*]] = ptrtoint ptr [[B]] to i64522; NO-VP-NEXT: [[TMP7:%.*]] = call i64 @llvm.vscale.i64()523; NO-VP-NEXT: [[TMP1:%.*]] = shl nuw i64 [[TMP7]], 4524; NO-VP-NEXT: [[TMP14:%.*]] = call i64 @llvm.umax.i64(i64 [[TMP1]], i64 32)525; NO-VP-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 100, [[TMP14]]526; NO-VP-NEXT: br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_MEMCHECK:.*]]527; NO-VP: [[VECTOR_MEMCHECK]]:528; NO-VP-NEXT: [[TMP2:%.*]] = call i64 @llvm.vscale.i64()529; NO-VP-NEXT: [[TMP3:%.*]] = mul nuw i64 [[TMP2]], 16530; NO-VP-NEXT: [[TMP4:%.*]] = sub i64 [[B1]], [[A2]]531; NO-VP-NEXT: [[DIFF_CHECK:%.*]] = icmp ult i64 [[TMP4]], [[TMP3]]532; NO-VP-NEXT: br i1 [[DIFF_CHECK]], label %[[SCALAR_PH]], label %[[VECTOR_PH:.*]]533; NO-VP: [[VECTOR_PH]]:534; NO-VP-NEXT: [[TMP5:%.*]] = call i64 @llvm.vscale.i64()535; NO-VP-NEXT: [[TMP6:%.*]] = mul nuw i64 [[TMP5]], 16536; NO-VP-NEXT: [[N_MOD_VF:%.*]] = urem i64 100, [[TMP6]]537; NO-VP-NEXT: [[N_VEC:%.*]] = sub i64 100, [[N_MOD_VF]]538; NO-VP-NEXT: br label %[[VECTOR_BODY:.*]]539; NO-VP: [[VECTOR_BODY]]:540; NO-VP-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]541; NO-VP-NEXT: [[TMP9:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[INDEX]]542; NO-VP-NEXT: [[WIDE_LOAD:%.*]] = load <vscale x 16 x i8>, ptr [[TMP9]], align 1543; NO-VP-NEXT: [[TMP10:%.*]] = lshr <vscale x 16 x i8> [[WIDE_LOAD]], splat (i8 1)544; NO-VP-NEXT: [[TMP11:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[INDEX]]545; NO-VP-NEXT: store <vscale x 16 x i8> [[TMP10]], ptr [[TMP11]], align 1546; NO-VP-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], [[TMP6]]547; NO-VP-NEXT: [[TMP12:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]548; NO-VP-NEXT: br i1 [[TMP12]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP10:![0-9]+]]549; NO-VP: [[MIDDLE_BLOCK]]:550; NO-VP-NEXT: [[CMP_N:%.*]] = icmp eq i64 100, [[N_VEC]]551; NO-VP-NEXT: br i1 [[CMP_N]], label %[[FINISH_LOOPEXIT:.*]], label %[[SCALAR_PH]]552; NO-VP: [[SCALAR_PH]]:553; NO-VP-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[LOOP_PREHEADER]] ], [ 0, %[[VECTOR_MEMCHECK]] ]554; NO-VP-NEXT: br label %[[LOOP:.*]]555; NO-VP: [[LOOP]]:556; NO-VP-NEXT: [[LEN:%.*]] = phi i64 [ [[DEC:%.*]], %[[LOOP]] ], [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ]557; NO-VP-NEXT: [[DEC]] = add nsw i64 [[LEN]], 1558; NO-VP-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[LEN]]559; NO-VP-NEXT: [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1560; NO-VP-NEXT: [[TMP:%.*]] = lshr i8 [[TMP0]], 1561; NO-VP-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[LEN]]562; NO-VP-NEXT: store i8 [[TMP]], ptr [[ARRAYIDX1]], align 1563; NO-VP-NEXT: [[DOTNOT:%.*]] = icmp eq i64 [[DEC]], 100564; NO-VP-NEXT: br i1 [[DOTNOT]], label %[[FINISH_LOOPEXIT]], label %[[LOOP]], !llvm.loop [[LOOP11:![0-9]+]]565; NO-VP: [[FINISH_LOOPEXIT]]:566; NO-VP-NEXT: ret void567;568loop.preheader:569 br label %loop570 571loop:572 %len = phi i64 [ %dec, %loop ], [ 0, %loop.preheader ]573 %dec = add nsw i64 %len, 1574 %arrayidx = getelementptr inbounds i8, ptr %a, i64 %len575 %0 = load i8, ptr %arrayidx, align 1576 %tmp = lshr i8 %0, 1577 %arrayidx1 = getelementptr inbounds i8, ptr %b, i64 %len578 store i8 %tmp, ptr %arrayidx1, align 1579 %.not = icmp eq i64 %dec, 100580 br i1 %.not, label %finish.loopexit, label %loop581 582finish.loopexit:583 ret void584}585 586define void @test_ashr(ptr nocapture %a, ptr nocapture readonly %b) {587; IF-EVL-LABEL: define void @test_ashr(588; IF-EVL-SAME: ptr captures(none) [[A:%.*]], ptr readonly captures(none) [[B:%.*]]) #[[ATTR0]] {589; IF-EVL-NEXT: [[LOOP_PREHEADER:.*:]]590; IF-EVL-NEXT: [[A2:%.*]] = ptrtoint ptr [[A]] to i64591; IF-EVL-NEXT: [[B1:%.*]] = ptrtoint ptr [[B]] to i64592; IF-EVL-NEXT: br label %[[VECTOR_MEMCHECK:.*]]593; IF-EVL: [[VECTOR_MEMCHECK]]:594; IF-EVL-NEXT: [[TMP0:%.*]] = call i64 @llvm.vscale.i64()595; IF-EVL-NEXT: [[TMP1:%.*]] = mul nuw i64 [[TMP0]], 16596; IF-EVL-NEXT: [[TMP2:%.*]] = sub i64 [[B1]], [[A2]]597; IF-EVL-NEXT: [[DIFF_CHECK:%.*]] = icmp ult i64 [[TMP2]], [[TMP1]]598; IF-EVL-NEXT: br i1 [[DIFF_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]599; IF-EVL: [[VECTOR_PH]]:600; IF-EVL-NEXT: br label %[[VECTOR_BODY:.*]]601; IF-EVL: [[VECTOR_BODY]]:602; IF-EVL-NEXT: [[EVL_BASED_IV:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_EVL_NEXT:%.*]], %[[VECTOR_BODY]] ]603; IF-EVL-NEXT: [[TMP10:%.*]] = phi i64 [ 100, %[[VECTOR_PH]] ], [ [[AVL_NEXT:%.*]], %[[VECTOR_BODY]] ]604; IF-EVL-NEXT: [[TMP11:%.*]] = call i32 @llvm.experimental.get.vector.length.i64(i64 [[TMP10]], i32 16, i1 true)605; IF-EVL-NEXT: [[TMP13:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[EVL_BASED_IV]]606; IF-EVL-NEXT: [[VP_OP_LOAD:%.*]] = call <vscale x 16 x i8> @llvm.vp.load.nxv16i8.p0(ptr align 1 [[TMP13]], <vscale x 16 x i1> splat (i1 true), i32 [[TMP11]])607; IF-EVL-NEXT: [[VP_OP:%.*]] = ashr <vscale x 16 x i8> [[VP_OP_LOAD]], splat (i8 1)608; IF-EVL-NEXT: [[TMP16:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[EVL_BASED_IV]]609; IF-EVL-NEXT: call void @llvm.vp.store.nxv16i8.p0(<vscale x 16 x i8> [[VP_OP]], ptr align 1 [[TMP16]], <vscale x 16 x i1> splat (i1 true), i32 [[TMP11]])610; IF-EVL-NEXT: [[TMP18:%.*]] = zext i32 [[TMP11]] to i64611; IF-EVL-NEXT: [[INDEX_EVL_NEXT]] = add nuw i64 [[TMP18]], [[EVL_BASED_IV]]612; IF-EVL-NEXT: [[AVL_NEXT]] = sub nuw i64 [[TMP10]], [[TMP18]]613; IF-EVL-NEXT: [[TMP14:%.*]] = icmp eq i64 [[AVL_NEXT]], 0614; IF-EVL-NEXT: br i1 [[TMP14]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP12:![0-9]+]]615; IF-EVL: [[MIDDLE_BLOCK]]:616; IF-EVL-NEXT: br label %[[FINISH_LOOPEXIT:.*]]617; IF-EVL: [[SCALAR_PH]]:618; IF-EVL-NEXT: br label %[[LOOP:.*]]619; IF-EVL: [[LOOP]]:620; IF-EVL-NEXT: [[LEN:%.*]] = phi i64 [ [[DEC:%.*]], %[[LOOP]] ], [ 0, %[[SCALAR_PH]] ]621; IF-EVL-NEXT: [[DEC]] = add nsw i64 [[LEN]], 1622; IF-EVL-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[LEN]]623; IF-EVL-NEXT: [[TMP20:%.*]] = load i8, ptr [[ARRAYIDX]], align 1624; IF-EVL-NEXT: [[TMP:%.*]] = ashr i8 [[TMP20]], 1625; IF-EVL-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[LEN]]626; IF-EVL-NEXT: store i8 [[TMP]], ptr [[ARRAYIDX1]], align 1627; IF-EVL-NEXT: [[DOTNOT:%.*]] = icmp eq i64 [[DEC]], 100628; IF-EVL-NEXT: br i1 [[DOTNOT]], label %[[FINISH_LOOPEXIT]], label %[[LOOP]], !llvm.loop [[LOOP13:![0-9]+]]629; IF-EVL: [[FINISH_LOOPEXIT]]:630; IF-EVL-NEXT: ret void631;632; NO-VP-LABEL: define void @test_ashr(633; NO-VP-SAME: ptr captures(none) [[A:%.*]], ptr readonly captures(none) [[B:%.*]]) #[[ATTR0]] {634; NO-VP-NEXT: [[LOOP_PREHEADER:.*]]:635; NO-VP-NEXT: [[A2:%.*]] = ptrtoint ptr [[A]] to i64636; NO-VP-NEXT: [[B1:%.*]] = ptrtoint ptr [[B]] to i64637; NO-VP-NEXT: [[TMP7:%.*]] = call i64 @llvm.vscale.i64()638; NO-VP-NEXT: [[TMP1:%.*]] = shl nuw i64 [[TMP7]], 4639; NO-VP-NEXT: [[TMP14:%.*]] = call i64 @llvm.umax.i64(i64 [[TMP1]], i64 32)640; NO-VP-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 100, [[TMP14]]641; NO-VP-NEXT: br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_MEMCHECK:.*]]642; NO-VP: [[VECTOR_MEMCHECK]]:643; NO-VP-NEXT: [[TMP2:%.*]] = call i64 @llvm.vscale.i64()644; NO-VP-NEXT: [[TMP3:%.*]] = mul nuw i64 [[TMP2]], 16645; NO-VP-NEXT: [[TMP4:%.*]] = sub i64 [[B1]], [[A2]]646; NO-VP-NEXT: [[DIFF_CHECK:%.*]] = icmp ult i64 [[TMP4]], [[TMP3]]647; NO-VP-NEXT: br i1 [[DIFF_CHECK]], label %[[SCALAR_PH]], label %[[VECTOR_PH:.*]]648; NO-VP: [[VECTOR_PH]]:649; NO-VP-NEXT: [[TMP5:%.*]] = call i64 @llvm.vscale.i64()650; NO-VP-NEXT: [[TMP6:%.*]] = mul nuw i64 [[TMP5]], 16651; NO-VP-NEXT: [[N_MOD_VF:%.*]] = urem i64 100, [[TMP6]]652; NO-VP-NEXT: [[N_VEC:%.*]] = sub i64 100, [[N_MOD_VF]]653; NO-VP-NEXT: br label %[[VECTOR_BODY:.*]]654; NO-VP: [[VECTOR_BODY]]:655; NO-VP-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]656; NO-VP-NEXT: [[TMP9:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[INDEX]]657; NO-VP-NEXT: [[WIDE_LOAD:%.*]] = load <vscale x 16 x i8>, ptr [[TMP9]], align 1658; NO-VP-NEXT: [[TMP10:%.*]] = ashr <vscale x 16 x i8> [[WIDE_LOAD]], splat (i8 1)659; NO-VP-NEXT: [[TMP11:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[INDEX]]660; NO-VP-NEXT: store <vscale x 16 x i8> [[TMP10]], ptr [[TMP11]], align 1661; NO-VP-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], [[TMP6]]662; NO-VP-NEXT: [[TMP12:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]663; NO-VP-NEXT: br i1 [[TMP12]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP12:![0-9]+]]664; NO-VP: [[MIDDLE_BLOCK]]:665; NO-VP-NEXT: [[CMP_N:%.*]] = icmp eq i64 100, [[N_VEC]]666; NO-VP-NEXT: br i1 [[CMP_N]], label %[[FINISH_LOOPEXIT:.*]], label %[[SCALAR_PH]]667; NO-VP: [[SCALAR_PH]]:668; NO-VP-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[LOOP_PREHEADER]] ], [ 0, %[[VECTOR_MEMCHECK]] ]669; NO-VP-NEXT: br label %[[LOOP:.*]]670; NO-VP: [[LOOP]]:671; NO-VP-NEXT: [[LEN:%.*]] = phi i64 [ [[DEC:%.*]], %[[LOOP]] ], [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ]672; NO-VP-NEXT: [[DEC]] = add nsw i64 [[LEN]], 1673; NO-VP-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[LEN]]674; NO-VP-NEXT: [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1675; NO-VP-NEXT: [[TMP:%.*]] = ashr i8 [[TMP0]], 1676; NO-VP-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[LEN]]677; NO-VP-NEXT: store i8 [[TMP]], ptr [[ARRAYIDX1]], align 1678; NO-VP-NEXT: [[DOTNOT:%.*]] = icmp eq i64 [[DEC]], 100679; NO-VP-NEXT: br i1 [[DOTNOT]], label %[[FINISH_LOOPEXIT]], label %[[LOOP]], !llvm.loop [[LOOP13:![0-9]+]]680; NO-VP: [[FINISH_LOOPEXIT]]:681; NO-VP-NEXT: ret void682;683loop.preheader:684 br label %loop685 686loop:687 %len = phi i64 [ %dec, %loop ], [ 0, %loop.preheader ]688 %dec = add nsw i64 %len, 1689 %arrayidx = getelementptr inbounds i8, ptr %a, i64 %len690 %0 = load i8, ptr %arrayidx, align 1691 %tmp = ashr i8 %0, 1692 %arrayidx1 = getelementptr inbounds i8, ptr %b, i64 %len693 store i8 %tmp, ptr %arrayidx1, align 1694 %.not = icmp eq i64 %dec, 100695 br i1 %.not, label %finish.loopexit, label %loop696 697finish.loopexit:698 ret void699}700 701define void @test_add(ptr nocapture %a, ptr nocapture readonly %b) {702; IF-EVL-LABEL: define void @test_add(703; IF-EVL-SAME: ptr captures(none) [[A:%.*]], ptr readonly captures(none) [[B:%.*]]) #[[ATTR0]] {704; IF-EVL-NEXT: [[LOOP_PREHEADER:.*:]]705; IF-EVL-NEXT: [[A2:%.*]] = ptrtoint ptr [[A]] to i64706; IF-EVL-NEXT: [[B1:%.*]] = ptrtoint ptr [[B]] to i64707; IF-EVL-NEXT: br label %[[VECTOR_MEMCHECK:.*]]708; IF-EVL: [[VECTOR_MEMCHECK]]:709; IF-EVL-NEXT: [[TMP0:%.*]] = call i64 @llvm.vscale.i64()710; IF-EVL-NEXT: [[TMP1:%.*]] = mul nuw i64 [[TMP0]], 16711; IF-EVL-NEXT: [[TMP2:%.*]] = sub i64 [[B1]], [[A2]]712; IF-EVL-NEXT: [[DIFF_CHECK:%.*]] = icmp ult i64 [[TMP2]], [[TMP1]]713; IF-EVL-NEXT: br i1 [[DIFF_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]714; IF-EVL: [[VECTOR_PH]]:715; IF-EVL-NEXT: br label %[[VECTOR_BODY:.*]]716; IF-EVL: [[VECTOR_BODY]]:717; IF-EVL-NEXT: [[EVL_BASED_IV:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_EVL_NEXT:%.*]], %[[VECTOR_BODY]] ]718; IF-EVL-NEXT: [[TMP10:%.*]] = phi i64 [ 100, %[[VECTOR_PH]] ], [ [[AVL_NEXT:%.*]], %[[VECTOR_BODY]] ]719; IF-EVL-NEXT: [[TMP11:%.*]] = call i32 @llvm.experimental.get.vector.length.i64(i64 [[TMP10]], i32 16, i1 true)720; IF-EVL-NEXT: [[TMP13:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[EVL_BASED_IV]]721; IF-EVL-NEXT: [[VP_OP_LOAD:%.*]] = call <vscale x 16 x i8> @llvm.vp.load.nxv16i8.p0(ptr align 1 [[TMP13]], <vscale x 16 x i1> splat (i1 true), i32 [[TMP11]])722; IF-EVL-NEXT: [[VP_OP:%.*]] = add <vscale x 16 x i8> [[VP_OP_LOAD]], splat (i8 1)723; IF-EVL-NEXT: [[TMP16:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[EVL_BASED_IV]]724; IF-EVL-NEXT: call void @llvm.vp.store.nxv16i8.p0(<vscale x 16 x i8> [[VP_OP]], ptr align 1 [[TMP16]], <vscale x 16 x i1> splat (i1 true), i32 [[TMP11]])725; IF-EVL-NEXT: [[TMP18:%.*]] = zext i32 [[TMP11]] to i64726; IF-EVL-NEXT: [[INDEX_EVL_NEXT]] = add nuw i64 [[TMP18]], [[EVL_BASED_IV]]727; IF-EVL-NEXT: [[AVL_NEXT]] = sub nuw i64 [[TMP10]], [[TMP18]]728; IF-EVL-NEXT: [[TMP14:%.*]] = icmp eq i64 [[AVL_NEXT]], 0729; IF-EVL-NEXT: br i1 [[TMP14]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP14:![0-9]+]]730; IF-EVL: [[MIDDLE_BLOCK]]:731; IF-EVL-NEXT: br label %[[FINISH_LOOPEXIT:.*]]732; IF-EVL: [[SCALAR_PH]]:733; IF-EVL-NEXT: br label %[[LOOP:.*]]734; IF-EVL: [[LOOP]]:735; IF-EVL-NEXT: [[LEN:%.*]] = phi i64 [ [[DEC:%.*]], %[[LOOP]] ], [ 0, %[[SCALAR_PH]] ]736; IF-EVL-NEXT: [[DEC]] = add nsw i64 [[LEN]], 1737; IF-EVL-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[LEN]]738; IF-EVL-NEXT: [[TMP20:%.*]] = load i8, ptr [[ARRAYIDX]], align 1739; IF-EVL-NEXT: [[TMP:%.*]] = add i8 [[TMP20]], 1740; IF-EVL-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[LEN]]741; IF-EVL-NEXT: store i8 [[TMP]], ptr [[ARRAYIDX1]], align 1742; IF-EVL-NEXT: [[DOTNOT:%.*]] = icmp eq i64 [[DEC]], 100743; IF-EVL-NEXT: br i1 [[DOTNOT]], label %[[FINISH_LOOPEXIT]], label %[[LOOP]], !llvm.loop [[LOOP15:![0-9]+]]744; IF-EVL: [[FINISH_LOOPEXIT]]:745; IF-EVL-NEXT: ret void746;747; NO-VP-LABEL: define void @test_add(748; NO-VP-SAME: ptr captures(none) [[A:%.*]], ptr readonly captures(none) [[B:%.*]]) #[[ATTR0]] {749; NO-VP-NEXT: [[LOOP_PREHEADER:.*]]:750; NO-VP-NEXT: [[A2:%.*]] = ptrtoint ptr [[A]] to i64751; NO-VP-NEXT: [[B1:%.*]] = ptrtoint ptr [[B]] to i64752; NO-VP-NEXT: [[TMP7:%.*]] = call i64 @llvm.vscale.i64()753; NO-VP-NEXT: [[TMP1:%.*]] = shl nuw i64 [[TMP7]], 4754; NO-VP-NEXT: [[TMP14:%.*]] = call i64 @llvm.umax.i64(i64 [[TMP1]], i64 32)755; NO-VP-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 100, [[TMP14]]756; NO-VP-NEXT: br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_MEMCHECK:.*]]757; NO-VP: [[VECTOR_MEMCHECK]]:758; NO-VP-NEXT: [[TMP2:%.*]] = call i64 @llvm.vscale.i64()759; NO-VP-NEXT: [[TMP3:%.*]] = mul nuw i64 [[TMP2]], 16760; NO-VP-NEXT: [[TMP4:%.*]] = sub i64 [[B1]], [[A2]]761; NO-VP-NEXT: [[DIFF_CHECK:%.*]] = icmp ult i64 [[TMP4]], [[TMP3]]762; NO-VP-NEXT: br i1 [[DIFF_CHECK]], label %[[SCALAR_PH]], label %[[VECTOR_PH:.*]]763; NO-VP: [[VECTOR_PH]]:764; NO-VP-NEXT: [[TMP5:%.*]] = call i64 @llvm.vscale.i64()765; NO-VP-NEXT: [[TMP6:%.*]] = mul nuw i64 [[TMP5]], 16766; NO-VP-NEXT: [[N_MOD_VF:%.*]] = urem i64 100, [[TMP6]]767; NO-VP-NEXT: [[N_VEC:%.*]] = sub i64 100, [[N_MOD_VF]]768; NO-VP-NEXT: br label %[[VECTOR_BODY:.*]]769; NO-VP: [[VECTOR_BODY]]:770; NO-VP-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]771; NO-VP-NEXT: [[TMP9:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[INDEX]]772; NO-VP-NEXT: [[WIDE_LOAD:%.*]] = load <vscale x 16 x i8>, ptr [[TMP9]], align 1773; NO-VP-NEXT: [[TMP10:%.*]] = add <vscale x 16 x i8> [[WIDE_LOAD]], splat (i8 1)774; NO-VP-NEXT: [[TMP11:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[INDEX]]775; NO-VP-NEXT: store <vscale x 16 x i8> [[TMP10]], ptr [[TMP11]], align 1776; NO-VP-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], [[TMP6]]777; NO-VP-NEXT: [[TMP12:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]778; NO-VP-NEXT: br i1 [[TMP12]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP14:![0-9]+]]779; NO-VP: [[MIDDLE_BLOCK]]:780; NO-VP-NEXT: [[CMP_N:%.*]] = icmp eq i64 100, [[N_VEC]]781; NO-VP-NEXT: br i1 [[CMP_N]], label %[[FINISH_LOOPEXIT:.*]], label %[[SCALAR_PH]]782; NO-VP: [[SCALAR_PH]]:783; NO-VP-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[LOOP_PREHEADER]] ], [ 0, %[[VECTOR_MEMCHECK]] ]784; NO-VP-NEXT: br label %[[LOOP:.*]]785; NO-VP: [[LOOP]]:786; NO-VP-NEXT: [[LEN:%.*]] = phi i64 [ [[DEC:%.*]], %[[LOOP]] ], [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ]787; NO-VP-NEXT: [[DEC]] = add nsw i64 [[LEN]], 1788; NO-VP-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[LEN]]789; NO-VP-NEXT: [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1790; NO-VP-NEXT: [[TMP:%.*]] = add i8 [[TMP0]], 1791; NO-VP-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[LEN]]792; NO-VP-NEXT: store i8 [[TMP]], ptr [[ARRAYIDX1]], align 1793; NO-VP-NEXT: [[DOTNOT:%.*]] = icmp eq i64 [[DEC]], 100794; NO-VP-NEXT: br i1 [[DOTNOT]], label %[[FINISH_LOOPEXIT]], label %[[LOOP]], !llvm.loop [[LOOP15:![0-9]+]]795; NO-VP: [[FINISH_LOOPEXIT]]:796; NO-VP-NEXT: ret void797;798loop.preheader:799 br label %loop800 801loop:802 %len = phi i64 [ %dec, %loop ], [ 0, %loop.preheader ]803 %dec = add nsw i64 %len, 1804 %arrayidx = getelementptr inbounds i8, ptr %a, i64 %len805 %0 = load i8, ptr %arrayidx, align 1806 %tmp = add i8 %0, 1807 %arrayidx1 = getelementptr inbounds i8, ptr %b, i64 %len808 store i8 %tmp, ptr %arrayidx1, align 1809 %.not = icmp eq i64 %dec, 100810 br i1 %.not, label %finish.loopexit, label %loop811 812finish.loopexit:813 ret void814}815 816define void @test_sub(ptr nocapture %a, ptr nocapture readonly %b) {817; IF-EVL-LABEL: define void @test_sub(818; IF-EVL-SAME: ptr captures(none) [[A:%.*]], ptr readonly captures(none) [[B:%.*]]) #[[ATTR0]] {819; IF-EVL-NEXT: [[LOOP_PREHEADER:.*:]]820; IF-EVL-NEXT: [[A2:%.*]] = ptrtoint ptr [[A]] to i64821; IF-EVL-NEXT: [[B1:%.*]] = ptrtoint ptr [[B]] to i64822; IF-EVL-NEXT: br label %[[VECTOR_MEMCHECK:.*]]823; IF-EVL: [[VECTOR_MEMCHECK]]:824; IF-EVL-NEXT: [[TMP0:%.*]] = call i64 @llvm.vscale.i64()825; IF-EVL-NEXT: [[TMP1:%.*]] = mul nuw i64 [[TMP0]], 16826; IF-EVL-NEXT: [[TMP2:%.*]] = sub i64 [[B1]], [[A2]]827; IF-EVL-NEXT: [[DIFF_CHECK:%.*]] = icmp ult i64 [[TMP2]], [[TMP1]]828; IF-EVL-NEXT: br i1 [[DIFF_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]829; IF-EVL: [[VECTOR_PH]]:830; IF-EVL-NEXT: br label %[[VECTOR_BODY:.*]]831; IF-EVL: [[VECTOR_BODY]]:832; IF-EVL-NEXT: [[EVL_BASED_IV:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_EVL_NEXT:%.*]], %[[VECTOR_BODY]] ]833; IF-EVL-NEXT: [[TMP10:%.*]] = phi i64 [ 100, %[[VECTOR_PH]] ], [ [[AVL_NEXT:%.*]], %[[VECTOR_BODY]] ]834; IF-EVL-NEXT: [[TMP11:%.*]] = call i32 @llvm.experimental.get.vector.length.i64(i64 [[TMP10]], i32 16, i1 true)835; IF-EVL-NEXT: [[TMP13:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[EVL_BASED_IV]]836; IF-EVL-NEXT: [[VP_OP_LOAD:%.*]] = call <vscale x 16 x i8> @llvm.vp.load.nxv16i8.p0(ptr align 1 [[TMP13]], <vscale x 16 x i1> splat (i1 true), i32 [[TMP11]])837; IF-EVL-NEXT: [[VP_OP:%.*]] = sub <vscale x 16 x i8> [[VP_OP_LOAD]], splat (i8 1)838; IF-EVL-NEXT: [[TMP16:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[EVL_BASED_IV]]839; IF-EVL-NEXT: call void @llvm.vp.store.nxv16i8.p0(<vscale x 16 x i8> [[VP_OP]], ptr align 1 [[TMP16]], <vscale x 16 x i1> splat (i1 true), i32 [[TMP11]])840; IF-EVL-NEXT: [[TMP18:%.*]] = zext i32 [[TMP11]] to i64841; IF-EVL-NEXT: [[INDEX_EVL_NEXT]] = add nuw i64 [[TMP18]], [[EVL_BASED_IV]]842; IF-EVL-NEXT: [[AVL_NEXT]] = sub nuw i64 [[TMP10]], [[TMP18]]843; IF-EVL-NEXT: [[TMP14:%.*]] = icmp eq i64 [[AVL_NEXT]], 0844; IF-EVL-NEXT: br i1 [[TMP14]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP16:![0-9]+]]845; IF-EVL: [[MIDDLE_BLOCK]]:846; IF-EVL-NEXT: br label %[[FINISH_LOOPEXIT:.*]]847; IF-EVL: [[SCALAR_PH]]:848; IF-EVL-NEXT: br label %[[LOOP:.*]]849; IF-EVL: [[LOOP]]:850; IF-EVL-NEXT: [[LEN:%.*]] = phi i64 [ [[DEC:%.*]], %[[LOOP]] ], [ 0, %[[SCALAR_PH]] ]851; IF-EVL-NEXT: [[DEC]] = add nsw i64 [[LEN]], 1852; IF-EVL-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[LEN]]853; IF-EVL-NEXT: [[TMP20:%.*]] = load i8, ptr [[ARRAYIDX]], align 1854; IF-EVL-NEXT: [[TMP:%.*]] = sub i8 [[TMP20]], 1855; IF-EVL-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[LEN]]856; IF-EVL-NEXT: store i8 [[TMP]], ptr [[ARRAYIDX1]], align 1857; IF-EVL-NEXT: [[DOTNOT:%.*]] = icmp eq i64 [[DEC]], 100858; IF-EVL-NEXT: br i1 [[DOTNOT]], label %[[FINISH_LOOPEXIT]], label %[[LOOP]], !llvm.loop [[LOOP17:![0-9]+]]859; IF-EVL: [[FINISH_LOOPEXIT]]:860; IF-EVL-NEXT: ret void861;862; NO-VP-LABEL: define void @test_sub(863; NO-VP-SAME: ptr captures(none) [[A:%.*]], ptr readonly captures(none) [[B:%.*]]) #[[ATTR0]] {864; NO-VP-NEXT: [[LOOP_PREHEADER:.*]]:865; NO-VP-NEXT: [[A2:%.*]] = ptrtoint ptr [[A]] to i64866; NO-VP-NEXT: [[B1:%.*]] = ptrtoint ptr [[B]] to i64867; NO-VP-NEXT: [[TMP7:%.*]] = call i64 @llvm.vscale.i64()868; NO-VP-NEXT: [[TMP1:%.*]] = shl nuw i64 [[TMP7]], 4869; NO-VP-NEXT: [[TMP14:%.*]] = call i64 @llvm.umax.i64(i64 [[TMP1]], i64 32)870; NO-VP-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 100, [[TMP14]]871; NO-VP-NEXT: br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_MEMCHECK:.*]]872; NO-VP: [[VECTOR_MEMCHECK]]:873; NO-VP-NEXT: [[TMP2:%.*]] = call i64 @llvm.vscale.i64()874; NO-VP-NEXT: [[TMP3:%.*]] = mul nuw i64 [[TMP2]], 16875; NO-VP-NEXT: [[TMP4:%.*]] = sub i64 [[B1]], [[A2]]876; NO-VP-NEXT: [[DIFF_CHECK:%.*]] = icmp ult i64 [[TMP4]], [[TMP3]]877; NO-VP-NEXT: br i1 [[DIFF_CHECK]], label %[[SCALAR_PH]], label %[[VECTOR_PH:.*]]878; NO-VP: [[VECTOR_PH]]:879; NO-VP-NEXT: [[TMP5:%.*]] = call i64 @llvm.vscale.i64()880; NO-VP-NEXT: [[TMP6:%.*]] = mul nuw i64 [[TMP5]], 16881; NO-VP-NEXT: [[N_MOD_VF:%.*]] = urem i64 100, [[TMP6]]882; NO-VP-NEXT: [[N_VEC:%.*]] = sub i64 100, [[N_MOD_VF]]883; NO-VP-NEXT: br label %[[VECTOR_BODY:.*]]884; NO-VP: [[VECTOR_BODY]]:885; NO-VP-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]886; NO-VP-NEXT: [[TMP9:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[INDEX]]887; NO-VP-NEXT: [[WIDE_LOAD:%.*]] = load <vscale x 16 x i8>, ptr [[TMP9]], align 1888; NO-VP-NEXT: [[TMP10:%.*]] = sub <vscale x 16 x i8> [[WIDE_LOAD]], splat (i8 1)889; NO-VP-NEXT: [[TMP11:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[INDEX]]890; NO-VP-NEXT: store <vscale x 16 x i8> [[TMP10]], ptr [[TMP11]], align 1891; NO-VP-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], [[TMP6]]892; NO-VP-NEXT: [[TMP12:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]893; NO-VP-NEXT: br i1 [[TMP12]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP16:![0-9]+]]894; NO-VP: [[MIDDLE_BLOCK]]:895; NO-VP-NEXT: [[CMP_N:%.*]] = icmp eq i64 100, [[N_VEC]]896; NO-VP-NEXT: br i1 [[CMP_N]], label %[[FINISH_LOOPEXIT:.*]], label %[[SCALAR_PH]]897; NO-VP: [[SCALAR_PH]]:898; NO-VP-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[LOOP_PREHEADER]] ], [ 0, %[[VECTOR_MEMCHECK]] ]899; NO-VP-NEXT: br label %[[LOOP:.*]]900; NO-VP: [[LOOP]]:901; NO-VP-NEXT: [[LEN:%.*]] = phi i64 [ [[DEC:%.*]], %[[LOOP]] ], [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ]902; NO-VP-NEXT: [[DEC]] = add nsw i64 [[LEN]], 1903; NO-VP-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[LEN]]904; NO-VP-NEXT: [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1905; NO-VP-NEXT: [[TMP:%.*]] = sub i8 [[TMP0]], 1906; NO-VP-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[LEN]]907; NO-VP-NEXT: store i8 [[TMP]], ptr [[ARRAYIDX1]], align 1908; NO-VP-NEXT: [[DOTNOT:%.*]] = icmp eq i64 [[DEC]], 100909; NO-VP-NEXT: br i1 [[DOTNOT]], label %[[FINISH_LOOPEXIT]], label %[[LOOP]], !llvm.loop [[LOOP17:![0-9]+]]910; NO-VP: [[FINISH_LOOPEXIT]]:911; NO-VP-NEXT: ret void912;913loop.preheader:914 br label %loop915 916loop:917 %len = phi i64 [ %dec, %loop ], [ 0, %loop.preheader ]918 %dec = add nsw i64 %len, 1919 %arrayidx = getelementptr inbounds i8, ptr %a, i64 %len920 %0 = load i8, ptr %arrayidx, align 1921 %tmp = sub i8 %0, 1922 %arrayidx1 = getelementptr inbounds i8, ptr %b, i64 %len923 store i8 %tmp, ptr %arrayidx1, align 1924 %.not = icmp eq i64 %dec, 100925 br i1 %.not, label %finish.loopexit, label %loop926 927finish.loopexit:928 ret void929}930 931define void @test_mul(ptr nocapture %a, ptr nocapture readonly %b) {932; IF-EVL-LABEL: define void @test_mul(933; IF-EVL-SAME: ptr captures(none) [[A:%.*]], ptr readonly captures(none) [[B:%.*]]) #[[ATTR0]] {934; IF-EVL-NEXT: [[LOOP_PREHEADER:.*:]]935; IF-EVL-NEXT: [[A2:%.*]] = ptrtoint ptr [[A]] to i64936; IF-EVL-NEXT: [[B1:%.*]] = ptrtoint ptr [[B]] to i64937; IF-EVL-NEXT: br label %[[VECTOR_MEMCHECK:.*]]938; IF-EVL: [[VECTOR_MEMCHECK]]:939; IF-EVL-NEXT: [[TMP0:%.*]] = call i64 @llvm.vscale.i64()940; IF-EVL-NEXT: [[TMP1:%.*]] = mul nuw i64 [[TMP0]], 16941; IF-EVL-NEXT: [[TMP2:%.*]] = sub i64 [[B1]], [[A2]]942; IF-EVL-NEXT: [[DIFF_CHECK:%.*]] = icmp ult i64 [[TMP2]], [[TMP1]]943; IF-EVL-NEXT: br i1 [[DIFF_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]944; IF-EVL: [[VECTOR_PH]]:945; IF-EVL-NEXT: br label %[[VECTOR_BODY:.*]]946; IF-EVL: [[VECTOR_BODY]]:947; IF-EVL-NEXT: [[EVL_BASED_IV:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_EVL_NEXT:%.*]], %[[VECTOR_BODY]] ]948; IF-EVL-NEXT: [[TMP10:%.*]] = phi i64 [ 100, %[[VECTOR_PH]] ], [ [[AVL_NEXT:%.*]], %[[VECTOR_BODY]] ]949; IF-EVL-NEXT: [[TMP11:%.*]] = call i32 @llvm.experimental.get.vector.length.i64(i64 [[TMP10]], i32 16, i1 true)950; IF-EVL-NEXT: [[TMP13:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[EVL_BASED_IV]]951; IF-EVL-NEXT: [[VP_OP_LOAD:%.*]] = call <vscale x 16 x i8> @llvm.vp.load.nxv16i8.p0(ptr align 1 [[TMP13]], <vscale x 16 x i1> splat (i1 true), i32 [[TMP11]])952; IF-EVL-NEXT: [[VP_OP:%.*]] = mul <vscale x 16 x i8> [[VP_OP_LOAD]], splat (i8 3)953; IF-EVL-NEXT: [[TMP16:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[EVL_BASED_IV]]954; IF-EVL-NEXT: call void @llvm.vp.store.nxv16i8.p0(<vscale x 16 x i8> [[VP_OP]], ptr align 1 [[TMP16]], <vscale x 16 x i1> splat (i1 true), i32 [[TMP11]])955; IF-EVL-NEXT: [[TMP18:%.*]] = zext i32 [[TMP11]] to i64956; IF-EVL-NEXT: [[INDEX_EVL_NEXT]] = add nuw i64 [[TMP18]], [[EVL_BASED_IV]]957; IF-EVL-NEXT: [[AVL_NEXT]] = sub nuw i64 [[TMP10]], [[TMP18]]958; IF-EVL-NEXT: [[TMP14:%.*]] = icmp eq i64 [[AVL_NEXT]], 0959; IF-EVL-NEXT: br i1 [[TMP14]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP18:![0-9]+]]960; IF-EVL: [[MIDDLE_BLOCK]]:961; IF-EVL-NEXT: br label %[[FINISH_LOOPEXIT:.*]]962; IF-EVL: [[SCALAR_PH]]:963; IF-EVL-NEXT: br label %[[LOOP:.*]]964; IF-EVL: [[LOOP]]:965; IF-EVL-NEXT: [[LEN:%.*]] = phi i64 [ [[DEC:%.*]], %[[LOOP]] ], [ 0, %[[SCALAR_PH]] ]966; IF-EVL-NEXT: [[DEC]] = add nsw i64 [[LEN]], 1967; IF-EVL-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[LEN]]968; IF-EVL-NEXT: [[TMP20:%.*]] = load i8, ptr [[ARRAYIDX]], align 1969; IF-EVL-NEXT: [[TMP:%.*]] = mul i8 [[TMP20]], 3970; IF-EVL-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[LEN]]971; IF-EVL-NEXT: store i8 [[TMP]], ptr [[ARRAYIDX1]], align 1972; IF-EVL-NEXT: [[DOTNOT:%.*]] = icmp eq i64 [[DEC]], 100973; IF-EVL-NEXT: br i1 [[DOTNOT]], label %[[FINISH_LOOPEXIT]], label %[[LOOP]], !llvm.loop [[LOOP19:![0-9]+]]974; IF-EVL: [[FINISH_LOOPEXIT]]:975; IF-EVL-NEXT: ret void976;977; NO-VP-LABEL: define void @test_mul(978; NO-VP-SAME: ptr captures(none) [[A:%.*]], ptr readonly captures(none) [[B:%.*]]) #[[ATTR0]] {979; NO-VP-NEXT: [[LOOP_PREHEADER:.*]]:980; NO-VP-NEXT: [[A2:%.*]] = ptrtoint ptr [[A]] to i64981; NO-VP-NEXT: [[B1:%.*]] = ptrtoint ptr [[B]] to i64982; NO-VP-NEXT: [[TMP7:%.*]] = call i64 @llvm.vscale.i64()983; NO-VP-NEXT: [[TMP1:%.*]] = shl nuw i64 [[TMP7]], 4984; NO-VP-NEXT: [[TMP14:%.*]] = call i64 @llvm.umax.i64(i64 [[TMP1]], i64 32)985; NO-VP-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 100, [[TMP14]]986; NO-VP-NEXT: br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_MEMCHECK:.*]]987; NO-VP: [[VECTOR_MEMCHECK]]:988; NO-VP-NEXT: [[TMP2:%.*]] = call i64 @llvm.vscale.i64()989; NO-VP-NEXT: [[TMP3:%.*]] = mul nuw i64 [[TMP2]], 16990; NO-VP-NEXT: [[TMP4:%.*]] = sub i64 [[B1]], [[A2]]991; NO-VP-NEXT: [[DIFF_CHECK:%.*]] = icmp ult i64 [[TMP4]], [[TMP3]]992; NO-VP-NEXT: br i1 [[DIFF_CHECK]], label %[[SCALAR_PH]], label %[[VECTOR_PH:.*]]993; NO-VP: [[VECTOR_PH]]:994; NO-VP-NEXT: [[TMP5:%.*]] = call i64 @llvm.vscale.i64()995; NO-VP-NEXT: [[TMP6:%.*]] = mul nuw i64 [[TMP5]], 16996; NO-VP-NEXT: [[N_MOD_VF:%.*]] = urem i64 100, [[TMP6]]997; NO-VP-NEXT: [[N_VEC:%.*]] = sub i64 100, [[N_MOD_VF]]998; NO-VP-NEXT: br label %[[VECTOR_BODY:.*]]999; NO-VP: [[VECTOR_BODY]]:1000; NO-VP-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]1001; NO-VP-NEXT: [[TMP9:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[INDEX]]1002; NO-VP-NEXT: [[WIDE_LOAD:%.*]] = load <vscale x 16 x i8>, ptr [[TMP9]], align 11003; NO-VP-NEXT: [[TMP10:%.*]] = mul <vscale x 16 x i8> [[WIDE_LOAD]], splat (i8 3)1004; NO-VP-NEXT: [[TMP11:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[INDEX]]1005; NO-VP-NEXT: store <vscale x 16 x i8> [[TMP10]], ptr [[TMP11]], align 11006; NO-VP-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], [[TMP6]]1007; NO-VP-NEXT: [[TMP12:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]1008; NO-VP-NEXT: br i1 [[TMP12]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP18:![0-9]+]]1009; NO-VP: [[MIDDLE_BLOCK]]:1010; NO-VP-NEXT: [[CMP_N:%.*]] = icmp eq i64 100, [[N_VEC]]1011; NO-VP-NEXT: br i1 [[CMP_N]], label %[[FINISH_LOOPEXIT:.*]], label %[[SCALAR_PH]]1012; NO-VP: [[SCALAR_PH]]:1013; NO-VP-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[LOOP_PREHEADER]] ], [ 0, %[[VECTOR_MEMCHECK]] ]1014; NO-VP-NEXT: br label %[[LOOP:.*]]1015; NO-VP: [[LOOP]]:1016; NO-VP-NEXT: [[LEN:%.*]] = phi i64 [ [[DEC:%.*]], %[[LOOP]] ], [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ]1017; NO-VP-NEXT: [[DEC]] = add nsw i64 [[LEN]], 11018; NO-VP-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[LEN]]1019; NO-VP-NEXT: [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 11020; NO-VP-NEXT: [[TMP:%.*]] = mul i8 [[TMP0]], 31021; NO-VP-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[LEN]]1022; NO-VP-NEXT: store i8 [[TMP]], ptr [[ARRAYIDX1]], align 11023; NO-VP-NEXT: [[DOTNOT:%.*]] = icmp eq i64 [[DEC]], 1001024; NO-VP-NEXT: br i1 [[DOTNOT]], label %[[FINISH_LOOPEXIT]], label %[[LOOP]], !llvm.loop [[LOOP19:![0-9]+]]1025; NO-VP: [[FINISH_LOOPEXIT]]:1026; NO-VP-NEXT: ret void1027;1028loop.preheader:1029 br label %loop1030 1031loop:1032 %len = phi i64 [ %dec, %loop ], [ 0, %loop.preheader ]1033 %dec = add nsw i64 %len, 11034 %arrayidx = getelementptr inbounds i8, ptr %a, i64 %len1035 %0 = load i8, ptr %arrayidx, align 11036 %tmp = mul i8 %0, 31037 %arrayidx1 = getelementptr inbounds i8, ptr %b, i64 %len1038 store i8 %tmp, ptr %arrayidx1, align 11039 %.not = icmp eq i64 %dec, 1001040 br i1 %.not, label %finish.loopexit, label %loop1041 1042finish.loopexit:1043 ret void1044}1045 1046define void @test_sdiv(ptr nocapture %a, ptr nocapture readonly %b) {1047; IF-EVL-LABEL: define void @test_sdiv(1048; IF-EVL-SAME: ptr captures(none) [[A:%.*]], ptr readonly captures(none) [[B:%.*]]) #[[ATTR0]] {1049; IF-EVL-NEXT: [[LOOP_PREHEADER:.*:]]1050; IF-EVL-NEXT: [[A2:%.*]] = ptrtoint ptr [[A]] to i641051; IF-EVL-NEXT: [[B1:%.*]] = ptrtoint ptr [[B]] to i641052; IF-EVL-NEXT: br label %[[VECTOR_MEMCHECK:.*]]1053; IF-EVL: [[VECTOR_MEMCHECK]]:1054; IF-EVL-NEXT: [[TMP0:%.*]] = call i64 @llvm.vscale.i64()1055; IF-EVL-NEXT: [[TMP1:%.*]] = mul nuw i64 [[TMP0]], 161056; IF-EVL-NEXT: [[TMP2:%.*]] = sub i64 [[B1]], [[A2]]1057; IF-EVL-NEXT: [[DIFF_CHECK:%.*]] = icmp ult i64 [[TMP2]], [[TMP1]]1058; IF-EVL-NEXT: br i1 [[DIFF_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]1059; IF-EVL: [[VECTOR_PH]]:1060; IF-EVL-NEXT: br label %[[VECTOR_BODY:.*]]1061; IF-EVL: [[VECTOR_BODY]]:1062; IF-EVL-NEXT: [[EVL_BASED_IV:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_EVL_NEXT:%.*]], %[[VECTOR_BODY]] ]1063; IF-EVL-NEXT: [[TMP10:%.*]] = phi i64 [ 100, %[[VECTOR_PH]] ], [ [[AVL_NEXT:%.*]], %[[VECTOR_BODY]] ]1064; IF-EVL-NEXT: [[TMP11:%.*]] = call i32 @llvm.experimental.get.vector.length.i64(i64 [[TMP10]], i32 16, i1 true)1065; IF-EVL-NEXT: [[TMP13:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[EVL_BASED_IV]]1066; IF-EVL-NEXT: [[VP_OP_LOAD:%.*]] = call <vscale x 16 x i8> @llvm.vp.load.nxv16i8.p0(ptr align 1 [[TMP13]], <vscale x 16 x i1> splat (i1 true), i32 [[TMP11]])1067; IF-EVL-NEXT: [[VP_OP:%.*]] = sdiv <vscale x 16 x i8> [[VP_OP_LOAD]], splat (i8 3)1068; IF-EVL-NEXT: [[TMP16:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[EVL_BASED_IV]]1069; IF-EVL-NEXT: call void @llvm.vp.store.nxv16i8.p0(<vscale x 16 x i8> [[VP_OP]], ptr align 1 [[TMP16]], <vscale x 16 x i1> splat (i1 true), i32 [[TMP11]])1070; IF-EVL-NEXT: [[TMP18:%.*]] = zext i32 [[TMP11]] to i641071; IF-EVL-NEXT: [[INDEX_EVL_NEXT]] = add nuw i64 [[TMP18]], [[EVL_BASED_IV]]1072; IF-EVL-NEXT: [[AVL_NEXT]] = sub nuw i64 [[TMP10]], [[TMP18]]1073; IF-EVL-NEXT: [[TMP14:%.*]] = icmp eq i64 [[AVL_NEXT]], 01074; IF-EVL-NEXT: br i1 [[TMP14]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP20:![0-9]+]]1075; IF-EVL: [[MIDDLE_BLOCK]]:1076; IF-EVL-NEXT: br label %[[FINISH_LOOPEXIT:.*]]1077; IF-EVL: [[SCALAR_PH]]:1078; IF-EVL-NEXT: br label %[[LOOP:.*]]1079; IF-EVL: [[LOOP]]:1080; IF-EVL-NEXT: [[LEN:%.*]] = phi i64 [ [[DEC:%.*]], %[[LOOP]] ], [ 0, %[[SCALAR_PH]] ]1081; IF-EVL-NEXT: [[DEC]] = add nsw i64 [[LEN]], 11082; IF-EVL-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[LEN]]1083; IF-EVL-NEXT: [[TMP20:%.*]] = load i8, ptr [[ARRAYIDX]], align 11084; IF-EVL-NEXT: [[TMP:%.*]] = sdiv i8 [[TMP20]], 31085; IF-EVL-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[LEN]]1086; IF-EVL-NEXT: store i8 [[TMP]], ptr [[ARRAYIDX1]], align 11087; IF-EVL-NEXT: [[DOTNOT:%.*]] = icmp eq i64 [[DEC]], 1001088; IF-EVL-NEXT: br i1 [[DOTNOT]], label %[[FINISH_LOOPEXIT]], label %[[LOOP]], !llvm.loop [[LOOP21:![0-9]+]]1089; IF-EVL: [[FINISH_LOOPEXIT]]:1090; IF-EVL-NEXT: ret void1091;1092; NO-VP-LABEL: define void @test_sdiv(1093; NO-VP-SAME: ptr captures(none) [[A:%.*]], ptr readonly captures(none) [[B:%.*]]) #[[ATTR0]] {1094; NO-VP-NEXT: [[LOOP_PREHEADER:.*]]:1095; NO-VP-NEXT: [[A2:%.*]] = ptrtoint ptr [[A]] to i641096; NO-VP-NEXT: [[B1:%.*]] = ptrtoint ptr [[B]] to i641097; NO-VP-NEXT: [[TMP7:%.*]] = call i64 @llvm.vscale.i64()1098; NO-VP-NEXT: [[TMP1:%.*]] = shl nuw i64 [[TMP7]], 41099; NO-VP-NEXT: [[TMP14:%.*]] = call i64 @llvm.umax.i64(i64 [[TMP1]], i64 32)1100; NO-VP-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 100, [[TMP14]]1101; NO-VP-NEXT: br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_MEMCHECK:.*]]1102; NO-VP: [[VECTOR_MEMCHECK]]:1103; NO-VP-NEXT: [[TMP2:%.*]] = call i64 @llvm.vscale.i64()1104; NO-VP-NEXT: [[TMP3:%.*]] = mul nuw i64 [[TMP2]], 161105; NO-VP-NEXT: [[TMP4:%.*]] = sub i64 [[B1]], [[A2]]1106; NO-VP-NEXT: [[DIFF_CHECK:%.*]] = icmp ult i64 [[TMP4]], [[TMP3]]1107; NO-VP-NEXT: br i1 [[DIFF_CHECK]], label %[[SCALAR_PH]], label %[[VECTOR_PH:.*]]1108; NO-VP: [[VECTOR_PH]]:1109; NO-VP-NEXT: [[TMP5:%.*]] = call i64 @llvm.vscale.i64()1110; NO-VP-NEXT: [[TMP6:%.*]] = mul nuw i64 [[TMP5]], 161111; NO-VP-NEXT: [[N_MOD_VF:%.*]] = urem i64 100, [[TMP6]]1112; NO-VP-NEXT: [[N_VEC:%.*]] = sub i64 100, [[N_MOD_VF]]1113; NO-VP-NEXT: br label %[[VECTOR_BODY:.*]]1114; NO-VP: [[VECTOR_BODY]]:1115; NO-VP-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]1116; NO-VP-NEXT: [[TMP9:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[INDEX]]1117; NO-VP-NEXT: [[WIDE_LOAD:%.*]] = load <vscale x 16 x i8>, ptr [[TMP9]], align 11118; NO-VP-NEXT: [[TMP10:%.*]] = sdiv <vscale x 16 x i8> [[WIDE_LOAD]], splat (i8 3)1119; NO-VP-NEXT: [[TMP11:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[INDEX]]1120; NO-VP-NEXT: store <vscale x 16 x i8> [[TMP10]], ptr [[TMP11]], align 11121; NO-VP-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], [[TMP6]]1122; NO-VP-NEXT: [[TMP12:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]1123; NO-VP-NEXT: br i1 [[TMP12]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP20:![0-9]+]]1124; NO-VP: [[MIDDLE_BLOCK]]:1125; NO-VP-NEXT: [[CMP_N:%.*]] = icmp eq i64 100, [[N_VEC]]1126; NO-VP-NEXT: br i1 [[CMP_N]], label %[[FINISH_LOOPEXIT:.*]], label %[[SCALAR_PH]]1127; NO-VP: [[SCALAR_PH]]:1128; NO-VP-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[LOOP_PREHEADER]] ], [ 0, %[[VECTOR_MEMCHECK]] ]1129; NO-VP-NEXT: br label %[[LOOP:.*]]1130; NO-VP: [[LOOP]]:1131; NO-VP-NEXT: [[LEN:%.*]] = phi i64 [ [[DEC:%.*]], %[[LOOP]] ], [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ]1132; NO-VP-NEXT: [[DEC]] = add nsw i64 [[LEN]], 11133; NO-VP-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[LEN]]1134; NO-VP-NEXT: [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 11135; NO-VP-NEXT: [[TMP:%.*]] = sdiv i8 [[TMP0]], 31136; NO-VP-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[LEN]]1137; NO-VP-NEXT: store i8 [[TMP]], ptr [[ARRAYIDX1]], align 11138; NO-VP-NEXT: [[DOTNOT:%.*]] = icmp eq i64 [[DEC]], 1001139; NO-VP-NEXT: br i1 [[DOTNOT]], label %[[FINISH_LOOPEXIT]], label %[[LOOP]], !llvm.loop [[LOOP21:![0-9]+]]1140; NO-VP: [[FINISH_LOOPEXIT]]:1141; NO-VP-NEXT: ret void1142;1143loop.preheader:1144 br label %loop1145 1146loop:1147 %len = phi i64 [ %dec, %loop ], [ 0, %loop.preheader ]1148 %dec = add nsw i64 %len, 11149 %arrayidx = getelementptr inbounds i8, ptr %a, i64 %len1150 %0 = load i8, ptr %arrayidx, align 11151 %tmp = sdiv i8 %0, 31152 %arrayidx1 = getelementptr inbounds i8, ptr %b, i64 %len1153 store i8 %tmp, ptr %arrayidx1, align 11154 %.not = icmp eq i64 %dec, 1001155 br i1 %.not, label %finish.loopexit, label %loop1156 1157finish.loopexit:1158 ret void1159}1160 1161define void @test_udiv(ptr nocapture %a, ptr nocapture readonly %b) {1162; IF-EVL-LABEL: define void @test_udiv(1163; IF-EVL-SAME: ptr captures(none) [[A:%.*]], ptr readonly captures(none) [[B:%.*]]) #[[ATTR0]] {1164; IF-EVL-NEXT: [[LOOP_PREHEADER:.*:]]1165; IF-EVL-NEXT: [[A2:%.*]] = ptrtoint ptr [[A]] to i641166; IF-EVL-NEXT: [[B1:%.*]] = ptrtoint ptr [[B]] to i641167; IF-EVL-NEXT: br label %[[VECTOR_MEMCHECK:.*]]1168; IF-EVL: [[VECTOR_MEMCHECK]]:1169; IF-EVL-NEXT: [[TMP0:%.*]] = call i64 @llvm.vscale.i64()1170; IF-EVL-NEXT: [[TMP1:%.*]] = mul nuw i64 [[TMP0]], 161171; IF-EVL-NEXT: [[TMP2:%.*]] = sub i64 [[B1]], [[A2]]1172; IF-EVL-NEXT: [[DIFF_CHECK:%.*]] = icmp ult i64 [[TMP2]], [[TMP1]]1173; IF-EVL-NEXT: br i1 [[DIFF_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]1174; IF-EVL: [[VECTOR_PH]]:1175; IF-EVL-NEXT: br label %[[VECTOR_BODY:.*]]1176; IF-EVL: [[VECTOR_BODY]]:1177; IF-EVL-NEXT: [[EVL_BASED_IV:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_EVL_NEXT:%.*]], %[[VECTOR_BODY]] ]1178; IF-EVL-NEXT: [[TMP10:%.*]] = phi i64 [ 100, %[[VECTOR_PH]] ], [ [[AVL_NEXT:%.*]], %[[VECTOR_BODY]] ]1179; IF-EVL-NEXT: [[TMP11:%.*]] = call i32 @llvm.experimental.get.vector.length.i64(i64 [[TMP10]], i32 16, i1 true)1180; IF-EVL-NEXT: [[TMP13:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[EVL_BASED_IV]]1181; IF-EVL-NEXT: [[VP_OP_LOAD:%.*]] = call <vscale x 16 x i8> @llvm.vp.load.nxv16i8.p0(ptr align 1 [[TMP13]], <vscale x 16 x i1> splat (i1 true), i32 [[TMP11]])1182; IF-EVL-NEXT: [[VP_OP:%.*]] = udiv <vscale x 16 x i8> [[VP_OP_LOAD]], splat (i8 3)1183; IF-EVL-NEXT: [[TMP16:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[EVL_BASED_IV]]1184; IF-EVL-NEXT: call void @llvm.vp.store.nxv16i8.p0(<vscale x 16 x i8> [[VP_OP]], ptr align 1 [[TMP16]], <vscale x 16 x i1> splat (i1 true), i32 [[TMP11]])1185; IF-EVL-NEXT: [[TMP18:%.*]] = zext i32 [[TMP11]] to i641186; IF-EVL-NEXT: [[INDEX_EVL_NEXT]] = add nuw i64 [[TMP18]], [[EVL_BASED_IV]]1187; IF-EVL-NEXT: [[AVL_NEXT]] = sub nuw i64 [[TMP10]], [[TMP18]]1188; IF-EVL-NEXT: [[TMP14:%.*]] = icmp eq i64 [[AVL_NEXT]], 01189; IF-EVL-NEXT: br i1 [[TMP14]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP22:![0-9]+]]1190; IF-EVL: [[MIDDLE_BLOCK]]:1191; IF-EVL-NEXT: br label %[[FINISH_LOOPEXIT:.*]]1192; IF-EVL: [[SCALAR_PH]]:1193; IF-EVL-NEXT: br label %[[LOOP:.*]]1194; IF-EVL: [[LOOP]]:1195; IF-EVL-NEXT: [[LEN:%.*]] = phi i64 [ [[DEC:%.*]], %[[LOOP]] ], [ 0, %[[SCALAR_PH]] ]1196; IF-EVL-NEXT: [[DEC]] = add nsw i64 [[LEN]], 11197; IF-EVL-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[LEN]]1198; IF-EVL-NEXT: [[TMP20:%.*]] = load i8, ptr [[ARRAYIDX]], align 11199; IF-EVL-NEXT: [[TMP:%.*]] = udiv i8 [[TMP20]], 31200; IF-EVL-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[LEN]]1201; IF-EVL-NEXT: store i8 [[TMP]], ptr [[ARRAYIDX1]], align 11202; IF-EVL-NEXT: [[DOTNOT:%.*]] = icmp eq i64 [[DEC]], 1001203; IF-EVL-NEXT: br i1 [[DOTNOT]], label %[[FINISH_LOOPEXIT]], label %[[LOOP]], !llvm.loop [[LOOP23:![0-9]+]]1204; IF-EVL: [[FINISH_LOOPEXIT]]:1205; IF-EVL-NEXT: ret void1206;1207; NO-VP-LABEL: define void @test_udiv(1208; NO-VP-SAME: ptr captures(none) [[A:%.*]], ptr readonly captures(none) [[B:%.*]]) #[[ATTR0]] {1209; NO-VP-NEXT: [[LOOP_PREHEADER:.*]]:1210; NO-VP-NEXT: [[A2:%.*]] = ptrtoint ptr [[A]] to i641211; NO-VP-NEXT: [[B1:%.*]] = ptrtoint ptr [[B]] to i641212; NO-VP-NEXT: [[TMP7:%.*]] = call i64 @llvm.vscale.i64()1213; NO-VP-NEXT: [[TMP1:%.*]] = shl nuw i64 [[TMP7]], 41214; NO-VP-NEXT: [[TMP14:%.*]] = call i64 @llvm.umax.i64(i64 [[TMP1]], i64 32)1215; NO-VP-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 100, [[TMP14]]1216; NO-VP-NEXT: br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_MEMCHECK:.*]]1217; NO-VP: [[VECTOR_MEMCHECK]]:1218; NO-VP-NEXT: [[TMP2:%.*]] = call i64 @llvm.vscale.i64()1219; NO-VP-NEXT: [[TMP3:%.*]] = mul nuw i64 [[TMP2]], 161220; NO-VP-NEXT: [[TMP4:%.*]] = sub i64 [[B1]], [[A2]]1221; NO-VP-NEXT: [[DIFF_CHECK:%.*]] = icmp ult i64 [[TMP4]], [[TMP3]]1222; NO-VP-NEXT: br i1 [[DIFF_CHECK]], label %[[SCALAR_PH]], label %[[VECTOR_PH:.*]]1223; NO-VP: [[VECTOR_PH]]:1224; NO-VP-NEXT: [[TMP5:%.*]] = call i64 @llvm.vscale.i64()1225; NO-VP-NEXT: [[TMP6:%.*]] = mul nuw i64 [[TMP5]], 161226; NO-VP-NEXT: [[N_MOD_VF:%.*]] = urem i64 100, [[TMP6]]1227; NO-VP-NEXT: [[N_VEC:%.*]] = sub i64 100, [[N_MOD_VF]]1228; NO-VP-NEXT: br label %[[VECTOR_BODY:.*]]1229; NO-VP: [[VECTOR_BODY]]:1230; NO-VP-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]1231; NO-VP-NEXT: [[TMP9:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[INDEX]]1232; NO-VP-NEXT: [[WIDE_LOAD:%.*]] = load <vscale x 16 x i8>, ptr [[TMP9]], align 11233; NO-VP-NEXT: [[TMP10:%.*]] = udiv <vscale x 16 x i8> [[WIDE_LOAD]], splat (i8 3)1234; NO-VP-NEXT: [[TMP11:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[INDEX]]1235; NO-VP-NEXT: store <vscale x 16 x i8> [[TMP10]], ptr [[TMP11]], align 11236; NO-VP-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], [[TMP6]]1237; NO-VP-NEXT: [[TMP12:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]1238; NO-VP-NEXT: br i1 [[TMP12]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP22:![0-9]+]]1239; NO-VP: [[MIDDLE_BLOCK]]:1240; NO-VP-NEXT: [[CMP_N:%.*]] = icmp eq i64 100, [[N_VEC]]1241; NO-VP-NEXT: br i1 [[CMP_N]], label %[[FINISH_LOOPEXIT:.*]], label %[[SCALAR_PH]]1242; NO-VP: [[SCALAR_PH]]:1243; NO-VP-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[LOOP_PREHEADER]] ], [ 0, %[[VECTOR_MEMCHECK]] ]1244; NO-VP-NEXT: br label %[[LOOP:.*]]1245; NO-VP: [[LOOP]]:1246; NO-VP-NEXT: [[LEN:%.*]] = phi i64 [ [[DEC:%.*]], %[[LOOP]] ], [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ]1247; NO-VP-NEXT: [[DEC]] = add nsw i64 [[LEN]], 11248; NO-VP-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[LEN]]1249; NO-VP-NEXT: [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 11250; NO-VP-NEXT: [[TMP:%.*]] = udiv i8 [[TMP0]], 31251; NO-VP-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[LEN]]1252; NO-VP-NEXT: store i8 [[TMP]], ptr [[ARRAYIDX1]], align 11253; NO-VP-NEXT: [[DOTNOT:%.*]] = icmp eq i64 [[DEC]], 1001254; NO-VP-NEXT: br i1 [[DOTNOT]], label %[[FINISH_LOOPEXIT]], label %[[LOOP]], !llvm.loop [[LOOP23:![0-9]+]]1255; NO-VP: [[FINISH_LOOPEXIT]]:1256; NO-VP-NEXT: ret void1257;1258loop.preheader:1259 br label %loop1260 1261loop:1262 %len = phi i64 [ %dec, %loop ], [ 0, %loop.preheader ]1263 %dec = add nsw i64 %len, 11264 %arrayidx = getelementptr inbounds i8, ptr %a, i64 %len1265 %0 = load i8, ptr %arrayidx, align 11266 %tmp = udiv i8 %0, 31267 %arrayidx1 = getelementptr inbounds i8, ptr %b, i64 %len1268 store i8 %tmp, ptr %arrayidx1, align 11269 %.not = icmp eq i64 %dec, 1001270 br i1 %.not, label %finish.loopexit, label %loop1271 1272finish.loopexit:1273 ret void1274}1275 1276define void @test_srem(ptr nocapture %a, ptr nocapture readonly %b) {1277; IF-EVL-LABEL: define void @test_srem(1278; IF-EVL-SAME: ptr captures(none) [[A:%.*]], ptr readonly captures(none) [[B:%.*]]) #[[ATTR0]] {1279; IF-EVL-NEXT: [[LOOP_PREHEADER:.*:]]1280; IF-EVL-NEXT: [[A2:%.*]] = ptrtoint ptr [[A]] to i641281; IF-EVL-NEXT: [[B1:%.*]] = ptrtoint ptr [[B]] to i641282; IF-EVL-NEXT: br label %[[VECTOR_MEMCHECK:.*]]1283; IF-EVL: [[VECTOR_MEMCHECK]]:1284; IF-EVL-NEXT: [[TMP0:%.*]] = call i64 @llvm.vscale.i64()1285; IF-EVL-NEXT: [[TMP1:%.*]] = mul nuw i64 [[TMP0]], 161286; IF-EVL-NEXT: [[TMP2:%.*]] = sub i64 [[B1]], [[A2]]1287; IF-EVL-NEXT: [[DIFF_CHECK:%.*]] = icmp ult i64 [[TMP2]], [[TMP1]]1288; IF-EVL-NEXT: br i1 [[DIFF_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]1289; IF-EVL: [[VECTOR_PH]]:1290; IF-EVL-NEXT: br label %[[VECTOR_BODY:.*]]1291; IF-EVL: [[VECTOR_BODY]]:1292; IF-EVL-NEXT: [[EVL_BASED_IV:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_EVL_NEXT:%.*]], %[[VECTOR_BODY]] ]1293; IF-EVL-NEXT: [[TMP10:%.*]] = phi i64 [ 100, %[[VECTOR_PH]] ], [ [[AVL_NEXT:%.*]], %[[VECTOR_BODY]] ]1294; IF-EVL-NEXT: [[TMP11:%.*]] = call i32 @llvm.experimental.get.vector.length.i64(i64 [[TMP10]], i32 16, i1 true)1295; IF-EVL-NEXT: [[TMP13:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[EVL_BASED_IV]]1296; IF-EVL-NEXT: [[VP_OP_LOAD:%.*]] = call <vscale x 16 x i8> @llvm.vp.load.nxv16i8.p0(ptr align 1 [[TMP13]], <vscale x 16 x i1> splat (i1 true), i32 [[TMP11]])1297; IF-EVL-NEXT: [[VP_OP:%.*]] = srem <vscale x 16 x i8> [[VP_OP_LOAD]], splat (i8 3)1298; IF-EVL-NEXT: [[TMP16:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[EVL_BASED_IV]]1299; IF-EVL-NEXT: call void @llvm.vp.store.nxv16i8.p0(<vscale x 16 x i8> [[VP_OP]], ptr align 1 [[TMP16]], <vscale x 16 x i1> splat (i1 true), i32 [[TMP11]])1300; IF-EVL-NEXT: [[TMP18:%.*]] = zext i32 [[TMP11]] to i641301; IF-EVL-NEXT: [[INDEX_EVL_NEXT]] = add nuw i64 [[TMP18]], [[EVL_BASED_IV]]1302; IF-EVL-NEXT: [[AVL_NEXT]] = sub nuw i64 [[TMP10]], [[TMP18]]1303; IF-EVL-NEXT: [[TMP14:%.*]] = icmp eq i64 [[AVL_NEXT]], 01304; IF-EVL-NEXT: br i1 [[TMP14]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP24:![0-9]+]]1305; IF-EVL: [[MIDDLE_BLOCK]]:1306; IF-EVL-NEXT: br label %[[FINISH_LOOPEXIT:.*]]1307; IF-EVL: [[SCALAR_PH]]:1308; IF-EVL-NEXT: br label %[[LOOP:.*]]1309; IF-EVL: [[LOOP]]:1310; IF-EVL-NEXT: [[LEN:%.*]] = phi i64 [ [[DEC:%.*]], %[[LOOP]] ], [ 0, %[[SCALAR_PH]] ]1311; IF-EVL-NEXT: [[DEC]] = add nsw i64 [[LEN]], 11312; IF-EVL-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[LEN]]1313; IF-EVL-NEXT: [[TMP20:%.*]] = load i8, ptr [[ARRAYIDX]], align 11314; IF-EVL-NEXT: [[TMP:%.*]] = srem i8 [[TMP20]], 31315; IF-EVL-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[LEN]]1316; IF-EVL-NEXT: store i8 [[TMP]], ptr [[ARRAYIDX1]], align 11317; IF-EVL-NEXT: [[DOTNOT:%.*]] = icmp eq i64 [[DEC]], 1001318; IF-EVL-NEXT: br i1 [[DOTNOT]], label %[[FINISH_LOOPEXIT]], label %[[LOOP]], !llvm.loop [[LOOP25:![0-9]+]]1319; IF-EVL: [[FINISH_LOOPEXIT]]:1320; IF-EVL-NEXT: ret void1321;1322; NO-VP-LABEL: define void @test_srem(1323; NO-VP-SAME: ptr captures(none) [[A:%.*]], ptr readonly captures(none) [[B:%.*]]) #[[ATTR0]] {1324; NO-VP-NEXT: [[LOOP_PREHEADER:.*]]:1325; NO-VP-NEXT: [[A2:%.*]] = ptrtoint ptr [[A]] to i641326; NO-VP-NEXT: [[B1:%.*]] = ptrtoint ptr [[B]] to i641327; NO-VP-NEXT: [[TMP7:%.*]] = call i64 @llvm.vscale.i64()1328; NO-VP-NEXT: [[TMP1:%.*]] = shl nuw i64 [[TMP7]], 41329; NO-VP-NEXT: [[TMP14:%.*]] = call i64 @llvm.umax.i64(i64 [[TMP1]], i64 32)1330; NO-VP-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 100, [[TMP14]]1331; NO-VP-NEXT: br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_MEMCHECK:.*]]1332; NO-VP: [[VECTOR_MEMCHECK]]:1333; NO-VP-NEXT: [[TMP2:%.*]] = call i64 @llvm.vscale.i64()1334; NO-VP-NEXT: [[TMP3:%.*]] = mul nuw i64 [[TMP2]], 161335; NO-VP-NEXT: [[TMP4:%.*]] = sub i64 [[B1]], [[A2]]1336; NO-VP-NEXT: [[DIFF_CHECK:%.*]] = icmp ult i64 [[TMP4]], [[TMP3]]1337; NO-VP-NEXT: br i1 [[DIFF_CHECK]], label %[[SCALAR_PH]], label %[[VECTOR_PH:.*]]1338; NO-VP: [[VECTOR_PH]]:1339; NO-VP-NEXT: [[TMP5:%.*]] = call i64 @llvm.vscale.i64()1340; NO-VP-NEXT: [[TMP6:%.*]] = mul nuw i64 [[TMP5]], 161341; NO-VP-NEXT: [[N_MOD_VF:%.*]] = urem i64 100, [[TMP6]]1342; NO-VP-NEXT: [[N_VEC:%.*]] = sub i64 100, [[N_MOD_VF]]1343; NO-VP-NEXT: br label %[[VECTOR_BODY:.*]]1344; NO-VP: [[VECTOR_BODY]]:1345; NO-VP-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]1346; NO-VP-NEXT: [[TMP9:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[INDEX]]1347; NO-VP-NEXT: [[WIDE_LOAD:%.*]] = load <vscale x 16 x i8>, ptr [[TMP9]], align 11348; NO-VP-NEXT: [[TMP10:%.*]] = srem <vscale x 16 x i8> [[WIDE_LOAD]], splat (i8 3)1349; NO-VP-NEXT: [[TMP11:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[INDEX]]1350; NO-VP-NEXT: store <vscale x 16 x i8> [[TMP10]], ptr [[TMP11]], align 11351; NO-VP-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], [[TMP6]]1352; NO-VP-NEXT: [[TMP12:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]1353; NO-VP-NEXT: br i1 [[TMP12]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP24:![0-9]+]]1354; NO-VP: [[MIDDLE_BLOCK]]:1355; NO-VP-NEXT: [[CMP_N:%.*]] = icmp eq i64 100, [[N_VEC]]1356; NO-VP-NEXT: br i1 [[CMP_N]], label %[[FINISH_LOOPEXIT:.*]], label %[[SCALAR_PH]]1357; NO-VP: [[SCALAR_PH]]:1358; NO-VP-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[LOOP_PREHEADER]] ], [ 0, %[[VECTOR_MEMCHECK]] ]1359; NO-VP-NEXT: br label %[[LOOP:.*]]1360; NO-VP: [[LOOP]]:1361; NO-VP-NEXT: [[LEN:%.*]] = phi i64 [ [[DEC:%.*]], %[[LOOP]] ], [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ]1362; NO-VP-NEXT: [[DEC]] = add nsw i64 [[LEN]], 11363; NO-VP-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[LEN]]1364; NO-VP-NEXT: [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 11365; NO-VP-NEXT: [[TMP:%.*]] = srem i8 [[TMP0]], 31366; NO-VP-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[LEN]]1367; NO-VP-NEXT: store i8 [[TMP]], ptr [[ARRAYIDX1]], align 11368; NO-VP-NEXT: [[DOTNOT:%.*]] = icmp eq i64 [[DEC]], 1001369; NO-VP-NEXT: br i1 [[DOTNOT]], label %[[FINISH_LOOPEXIT]], label %[[LOOP]], !llvm.loop [[LOOP25:![0-9]+]]1370; NO-VP: [[FINISH_LOOPEXIT]]:1371; NO-VP-NEXT: ret void1372;1373loop.preheader:1374 br label %loop1375 1376loop:1377 %len = phi i64 [ %dec, %loop ], [ 0, %loop.preheader ]1378 %dec = add nsw i64 %len, 11379 %arrayidx = getelementptr inbounds i8, ptr %a, i64 %len1380 %0 = load i8, ptr %arrayidx, align 11381 %tmp = srem i8 %0, 31382 %arrayidx1 = getelementptr inbounds i8, ptr %b, i64 %len1383 store i8 %tmp, ptr %arrayidx1, align 11384 %.not = icmp eq i64 %dec, 1001385 br i1 %.not, label %finish.loopexit, label %loop1386 1387finish.loopexit:1388 ret void1389}1390 1391define void @test_urem(ptr nocapture %a, ptr nocapture readonly %b) {1392; IF-EVL-LABEL: define void @test_urem(1393; IF-EVL-SAME: ptr captures(none) [[A:%.*]], ptr readonly captures(none) [[B:%.*]]) #[[ATTR0]] {1394; IF-EVL-NEXT: [[LOOP_PREHEADER:.*:]]1395; IF-EVL-NEXT: [[A2:%.*]] = ptrtoint ptr [[A]] to i641396; IF-EVL-NEXT: [[B1:%.*]] = ptrtoint ptr [[B]] to i641397; IF-EVL-NEXT: br label %[[VECTOR_MEMCHECK:.*]]1398; IF-EVL: [[VECTOR_MEMCHECK]]:1399; IF-EVL-NEXT: [[TMP0:%.*]] = call i64 @llvm.vscale.i64()1400; IF-EVL-NEXT: [[TMP1:%.*]] = mul nuw i64 [[TMP0]], 161401; IF-EVL-NEXT: [[TMP2:%.*]] = sub i64 [[B1]], [[A2]]1402; IF-EVL-NEXT: [[DIFF_CHECK:%.*]] = icmp ult i64 [[TMP2]], [[TMP1]]1403; IF-EVL-NEXT: br i1 [[DIFF_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]1404; IF-EVL: [[VECTOR_PH]]:1405; IF-EVL-NEXT: br label %[[VECTOR_BODY:.*]]1406; IF-EVL: [[VECTOR_BODY]]:1407; IF-EVL-NEXT: [[EVL_BASED_IV:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_EVL_NEXT:%.*]], %[[VECTOR_BODY]] ]1408; IF-EVL-NEXT: [[TMP10:%.*]] = phi i64 [ 100, %[[VECTOR_PH]] ], [ [[AVL_NEXT:%.*]], %[[VECTOR_BODY]] ]1409; IF-EVL-NEXT: [[TMP11:%.*]] = call i32 @llvm.experimental.get.vector.length.i64(i64 [[TMP10]], i32 16, i1 true)1410; IF-EVL-NEXT: [[TMP13:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[EVL_BASED_IV]]1411; IF-EVL-NEXT: [[VP_OP_LOAD:%.*]] = call <vscale x 16 x i8> @llvm.vp.load.nxv16i8.p0(ptr align 1 [[TMP13]], <vscale x 16 x i1> splat (i1 true), i32 [[TMP11]])1412; IF-EVL-NEXT: [[VP_OP:%.*]] = urem <vscale x 16 x i8> [[VP_OP_LOAD]], splat (i8 3)1413; IF-EVL-NEXT: [[TMP16:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[EVL_BASED_IV]]1414; IF-EVL-NEXT: call void @llvm.vp.store.nxv16i8.p0(<vscale x 16 x i8> [[VP_OP]], ptr align 1 [[TMP16]], <vscale x 16 x i1> splat (i1 true), i32 [[TMP11]])1415; IF-EVL-NEXT: [[TMP18:%.*]] = zext i32 [[TMP11]] to i641416; IF-EVL-NEXT: [[INDEX_EVL_NEXT]] = add nuw i64 [[TMP18]], [[EVL_BASED_IV]]1417; IF-EVL-NEXT: [[AVL_NEXT]] = sub nuw i64 [[TMP10]], [[TMP18]]1418; IF-EVL-NEXT: [[TMP14:%.*]] = icmp eq i64 [[AVL_NEXT]], 01419; IF-EVL-NEXT: br i1 [[TMP14]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP26:![0-9]+]]1420; IF-EVL: [[MIDDLE_BLOCK]]:1421; IF-EVL-NEXT: br label %[[FINISH_LOOPEXIT:.*]]1422; IF-EVL: [[SCALAR_PH]]:1423; IF-EVL-NEXT: br label %[[LOOP:.*]]1424; IF-EVL: [[LOOP]]:1425; IF-EVL-NEXT: [[LEN:%.*]] = phi i64 [ [[DEC:%.*]], %[[LOOP]] ], [ 0, %[[SCALAR_PH]] ]1426; IF-EVL-NEXT: [[DEC]] = add nsw i64 [[LEN]], 11427; IF-EVL-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[LEN]]1428; IF-EVL-NEXT: [[TMP20:%.*]] = load i8, ptr [[ARRAYIDX]], align 11429; IF-EVL-NEXT: [[TMP:%.*]] = urem i8 [[TMP20]], 31430; IF-EVL-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[LEN]]1431; IF-EVL-NEXT: store i8 [[TMP]], ptr [[ARRAYIDX1]], align 11432; IF-EVL-NEXT: [[DOTNOT:%.*]] = icmp eq i64 [[DEC]], 1001433; IF-EVL-NEXT: br i1 [[DOTNOT]], label %[[FINISH_LOOPEXIT]], label %[[LOOP]], !llvm.loop [[LOOP27:![0-9]+]]1434; IF-EVL: [[FINISH_LOOPEXIT]]:1435; IF-EVL-NEXT: ret void1436;1437; NO-VP-LABEL: define void @test_urem(1438; NO-VP-SAME: ptr captures(none) [[A:%.*]], ptr readonly captures(none) [[B:%.*]]) #[[ATTR0]] {1439; NO-VP-NEXT: [[LOOP_PREHEADER:.*]]:1440; NO-VP-NEXT: [[A2:%.*]] = ptrtoint ptr [[A]] to i641441; NO-VP-NEXT: [[B1:%.*]] = ptrtoint ptr [[B]] to i641442; NO-VP-NEXT: [[TMP7:%.*]] = call i64 @llvm.vscale.i64()1443; NO-VP-NEXT: [[TMP1:%.*]] = shl nuw i64 [[TMP7]], 41444; NO-VP-NEXT: [[TMP14:%.*]] = call i64 @llvm.umax.i64(i64 [[TMP1]], i64 32)1445; NO-VP-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 100, [[TMP14]]1446; NO-VP-NEXT: br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_MEMCHECK:.*]]1447; NO-VP: [[VECTOR_MEMCHECK]]:1448; NO-VP-NEXT: [[TMP2:%.*]] = call i64 @llvm.vscale.i64()1449; NO-VP-NEXT: [[TMP3:%.*]] = mul nuw i64 [[TMP2]], 161450; NO-VP-NEXT: [[TMP4:%.*]] = sub i64 [[B1]], [[A2]]1451; NO-VP-NEXT: [[DIFF_CHECK:%.*]] = icmp ult i64 [[TMP4]], [[TMP3]]1452; NO-VP-NEXT: br i1 [[DIFF_CHECK]], label %[[SCALAR_PH]], label %[[VECTOR_PH:.*]]1453; NO-VP: [[VECTOR_PH]]:1454; NO-VP-NEXT: [[TMP5:%.*]] = call i64 @llvm.vscale.i64()1455; NO-VP-NEXT: [[TMP6:%.*]] = mul nuw i64 [[TMP5]], 161456; NO-VP-NEXT: [[N_MOD_VF:%.*]] = urem i64 100, [[TMP6]]1457; NO-VP-NEXT: [[N_VEC:%.*]] = sub i64 100, [[N_MOD_VF]]1458; NO-VP-NEXT: br label %[[VECTOR_BODY:.*]]1459; NO-VP: [[VECTOR_BODY]]:1460; NO-VP-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]1461; NO-VP-NEXT: [[TMP9:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[INDEX]]1462; NO-VP-NEXT: [[WIDE_LOAD:%.*]] = load <vscale x 16 x i8>, ptr [[TMP9]], align 11463; NO-VP-NEXT: [[TMP10:%.*]] = urem <vscale x 16 x i8> [[WIDE_LOAD]], splat (i8 3)1464; NO-VP-NEXT: [[TMP11:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[INDEX]]1465; NO-VP-NEXT: store <vscale x 16 x i8> [[TMP10]], ptr [[TMP11]], align 11466; NO-VP-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], [[TMP6]]1467; NO-VP-NEXT: [[TMP12:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]1468; NO-VP-NEXT: br i1 [[TMP12]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP26:![0-9]+]]1469; NO-VP: [[MIDDLE_BLOCK]]:1470; NO-VP-NEXT: [[CMP_N:%.*]] = icmp eq i64 100, [[N_VEC]]1471; NO-VP-NEXT: br i1 [[CMP_N]], label %[[FINISH_LOOPEXIT:.*]], label %[[SCALAR_PH]]1472; NO-VP: [[SCALAR_PH]]:1473; NO-VP-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[LOOP_PREHEADER]] ], [ 0, %[[VECTOR_MEMCHECK]] ]1474; NO-VP-NEXT: br label %[[LOOP:.*]]1475; NO-VP: [[LOOP]]:1476; NO-VP-NEXT: [[LEN:%.*]] = phi i64 [ [[DEC:%.*]], %[[LOOP]] ], [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ]1477; NO-VP-NEXT: [[DEC]] = add nsw i64 [[LEN]], 11478; NO-VP-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[LEN]]1479; NO-VP-NEXT: [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 11480; NO-VP-NEXT: [[TMP:%.*]] = urem i8 [[TMP0]], 31481; NO-VP-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[LEN]]1482; NO-VP-NEXT: store i8 [[TMP]], ptr [[ARRAYIDX1]], align 11483; NO-VP-NEXT: [[DOTNOT:%.*]] = icmp eq i64 [[DEC]], 1001484; NO-VP-NEXT: br i1 [[DOTNOT]], label %[[FINISH_LOOPEXIT]], label %[[LOOP]], !llvm.loop [[LOOP27:![0-9]+]]1485; NO-VP: [[FINISH_LOOPEXIT]]:1486; NO-VP-NEXT: ret void1487;1488loop.preheader:1489 br label %loop1490 1491loop:1492 %len = phi i64 [ %dec, %loop ], [ 0, %loop.preheader ]1493 %dec = add nsw i64 %len, 11494 %arrayidx = getelementptr inbounds i8, ptr %a, i64 %len1495 %0 = load i8, ptr %arrayidx, align 11496 %tmp = urem i8 %0, 31497 %arrayidx1 = getelementptr inbounds i8, ptr %b, i64 %len1498 store i8 %tmp, ptr %arrayidx1, align 11499 %.not = icmp eq i64 %dec, 1001500 br i1 %.not, label %finish.loopexit, label %loop1501 1502finish.loopexit:1503 ret void1504}1505 1506; Floating point tests1507 1508define void @test_fadd(ptr nocapture %a, ptr nocapture readonly %b) {1509; IF-EVL-LABEL: define void @test_fadd(1510; IF-EVL-SAME: ptr captures(none) [[A:%.*]], ptr readonly captures(none) [[B:%.*]]) #[[ATTR0]] {1511; IF-EVL-NEXT: [[LOOP_PREHEADER:.*:]]1512; IF-EVL-NEXT: [[A2:%.*]] = ptrtoint ptr [[A]] to i641513; IF-EVL-NEXT: [[B1:%.*]] = ptrtoint ptr [[B]] to i641514; IF-EVL-NEXT: br label %[[VECTOR_MEMCHECK:.*]]1515; IF-EVL: [[VECTOR_MEMCHECK]]:1516; IF-EVL-NEXT: [[TMP0:%.*]] = call i64 @llvm.vscale.i64()1517; IF-EVL-NEXT: [[TMP1:%.*]] = mul nuw i64 [[TMP0]], 41518; IF-EVL-NEXT: [[TMP2:%.*]] = mul i64 [[TMP1]], 41519; IF-EVL-NEXT: [[TMP3:%.*]] = sub i64 [[B1]], [[A2]]1520; IF-EVL-NEXT: [[DIFF_CHECK:%.*]] = icmp ult i64 [[TMP3]], [[TMP2]]1521; IF-EVL-NEXT: br i1 [[DIFF_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]1522; IF-EVL: [[VECTOR_PH]]:1523; IF-EVL-NEXT: br label %[[VECTOR_BODY:.*]]1524; IF-EVL: [[VECTOR_BODY]]:1525; IF-EVL-NEXT: [[EVL_BASED_IV:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_EVL_NEXT:%.*]], %[[VECTOR_BODY]] ]1526; IF-EVL-NEXT: [[TMP11:%.*]] = phi i64 [ 100, %[[VECTOR_PH]] ], [ [[AVL_NEXT:%.*]], %[[VECTOR_BODY]] ]1527; IF-EVL-NEXT: [[TMP12:%.*]] = call i32 @llvm.experimental.get.vector.length.i64(i64 [[TMP11]], i32 4, i1 true)1528; IF-EVL-NEXT: [[TMP14:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[EVL_BASED_IV]]1529; IF-EVL-NEXT: [[VP_OP_LOAD:%.*]] = call <vscale x 4 x float> @llvm.vp.load.nxv4f32.p0(ptr align 4 [[TMP14]], <vscale x 4 x i1> splat (i1 true), i32 [[TMP12]])1530; IF-EVL-NEXT: [[VP_OP:%.*]] = fadd fast <vscale x 4 x float> [[VP_OP_LOAD]], splat (float 3.000000e+00)1531; IF-EVL-NEXT: [[TMP17:%.*]] = getelementptr inbounds float, ptr [[B]], i64 [[EVL_BASED_IV]]1532; IF-EVL-NEXT: call void @llvm.vp.store.nxv4f32.p0(<vscale x 4 x float> [[VP_OP]], ptr align 4 [[TMP17]], <vscale x 4 x i1> splat (i1 true), i32 [[TMP12]])1533; IF-EVL-NEXT: [[TMP19:%.*]] = zext i32 [[TMP12]] to i641534; IF-EVL-NEXT: [[INDEX_EVL_NEXT]] = add nuw i64 [[TMP19]], [[EVL_BASED_IV]]1535; IF-EVL-NEXT: [[AVL_NEXT]] = sub nuw i64 [[TMP11]], [[TMP19]]1536; IF-EVL-NEXT: [[TMP15:%.*]] = icmp eq i64 [[AVL_NEXT]], 01537; IF-EVL-NEXT: br i1 [[TMP15]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP28:![0-9]+]]1538; IF-EVL: [[MIDDLE_BLOCK]]:1539; IF-EVL-NEXT: br label %[[FINISH_LOOPEXIT:.*]]1540; IF-EVL: [[SCALAR_PH]]:1541; IF-EVL-NEXT: br label %[[LOOP:.*]]1542; IF-EVL: [[LOOP]]:1543; IF-EVL-NEXT: [[LEN:%.*]] = phi i64 [ [[DEC:%.*]], %[[LOOP]] ], [ 0, %[[SCALAR_PH]] ]1544; IF-EVL-NEXT: [[DEC]] = add nsw i64 [[LEN]], 11545; IF-EVL-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[LEN]]1546; IF-EVL-NEXT: [[TMP21:%.*]] = load float, ptr [[ARRAYIDX]], align 41547; IF-EVL-NEXT: [[TMP:%.*]] = fadd fast float [[TMP21]], 3.000000e+001548; IF-EVL-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds float, ptr [[B]], i64 [[LEN]]1549; IF-EVL-NEXT: store float [[TMP]], ptr [[ARRAYIDX1]], align 41550; IF-EVL-NEXT: [[DOTNOT:%.*]] = icmp eq i64 [[DEC]], 1001551; IF-EVL-NEXT: br i1 [[DOTNOT]], label %[[FINISH_LOOPEXIT]], label %[[LOOP]], !llvm.loop [[LOOP29:![0-9]+]]1552; IF-EVL: [[FINISH_LOOPEXIT]]:1553; IF-EVL-NEXT: ret void1554;1555; NO-VP-LABEL: define void @test_fadd(1556; NO-VP-SAME: ptr captures(none) [[A:%.*]], ptr readonly captures(none) [[B:%.*]]) #[[ATTR0]] {1557; NO-VP-NEXT: [[LOOP_PREHEADER:.*]]:1558; NO-VP-NEXT: [[A2:%.*]] = ptrtoint ptr [[A]] to i641559; NO-VP-NEXT: [[B1:%.*]] = ptrtoint ptr [[B]] to i641560; NO-VP-NEXT: [[TMP9:%.*]] = call i64 @llvm.vscale.i64()1561; NO-VP-NEXT: [[TMP1:%.*]] = shl nuw i64 [[TMP9]], 21562; NO-VP-NEXT: [[TMP2:%.*]] = call i64 @llvm.umax.i64(i64 [[TMP1]], i64 16)1563; NO-VP-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 100, [[TMP2]]1564; NO-VP-NEXT: br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_MEMCHECK:.*]]1565; NO-VP: [[VECTOR_MEMCHECK]]:1566; NO-VP-NEXT: [[TMP3:%.*]] = call i64 @llvm.vscale.i64()1567; NO-VP-NEXT: [[TMP4:%.*]] = mul nuw i64 [[TMP3]], 41568; NO-VP-NEXT: [[TMP5:%.*]] = mul i64 [[TMP4]], 41569; NO-VP-NEXT: [[TMP6:%.*]] = sub i64 [[B1]], [[A2]]1570; NO-VP-NEXT: [[DIFF_CHECK:%.*]] = icmp ult i64 [[TMP6]], [[TMP5]]1571; NO-VP-NEXT: br i1 [[DIFF_CHECK]], label %[[SCALAR_PH]], label %[[VECTOR_PH:.*]]1572; NO-VP: [[VECTOR_PH]]:1573; NO-VP-NEXT: [[TMP7:%.*]] = call i64 @llvm.vscale.i64()1574; NO-VP-NEXT: [[TMP8:%.*]] = mul nuw i64 [[TMP7]], 41575; NO-VP-NEXT: [[N_MOD_VF:%.*]] = urem i64 100, [[TMP8]]1576; NO-VP-NEXT: [[N_VEC:%.*]] = sub i64 100, [[N_MOD_VF]]1577; NO-VP-NEXT: br label %[[VECTOR_BODY:.*]]1578; NO-VP: [[VECTOR_BODY]]:1579; NO-VP-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]1580; NO-VP-NEXT: [[TMP11:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[INDEX]]1581; NO-VP-NEXT: [[WIDE_LOAD:%.*]] = load <vscale x 4 x float>, ptr [[TMP11]], align 41582; NO-VP-NEXT: [[TMP12:%.*]] = fadd fast <vscale x 4 x float> [[WIDE_LOAD]], splat (float 3.000000e+00)1583; NO-VP-NEXT: [[TMP13:%.*]] = getelementptr inbounds float, ptr [[B]], i64 [[INDEX]]1584; NO-VP-NEXT: store <vscale x 4 x float> [[TMP12]], ptr [[TMP13]], align 41585; NO-VP-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], [[TMP8]]1586; NO-VP-NEXT: [[TMP14:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]1587; NO-VP-NEXT: br i1 [[TMP14]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP28:![0-9]+]]1588; NO-VP: [[MIDDLE_BLOCK]]:1589; NO-VP-NEXT: [[CMP_N:%.*]] = icmp eq i64 100, [[N_VEC]]1590; NO-VP-NEXT: br i1 [[CMP_N]], label %[[FINISH_LOOPEXIT:.*]], label %[[SCALAR_PH]]1591; NO-VP: [[SCALAR_PH]]:1592; NO-VP-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[LOOP_PREHEADER]] ], [ 0, %[[VECTOR_MEMCHECK]] ]1593; NO-VP-NEXT: br label %[[LOOP:.*]]1594; NO-VP: [[LOOP]]:1595; NO-VP-NEXT: [[LEN:%.*]] = phi i64 [ [[DEC:%.*]], %[[LOOP]] ], [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ]1596; NO-VP-NEXT: [[DEC]] = add nsw i64 [[LEN]], 11597; NO-VP-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[LEN]]1598; NO-VP-NEXT: [[TMP0:%.*]] = load float, ptr [[ARRAYIDX]], align 41599; NO-VP-NEXT: [[TMP:%.*]] = fadd fast float [[TMP0]], 3.000000e+001600; NO-VP-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds float, ptr [[B]], i64 [[LEN]]1601; NO-VP-NEXT: store float [[TMP]], ptr [[ARRAYIDX1]], align 41602; NO-VP-NEXT: [[DOTNOT:%.*]] = icmp eq i64 [[DEC]], 1001603; NO-VP-NEXT: br i1 [[DOTNOT]], label %[[FINISH_LOOPEXIT]], label %[[LOOP]], !llvm.loop [[LOOP29:![0-9]+]]1604; NO-VP: [[FINISH_LOOPEXIT]]:1605; NO-VP-NEXT: ret void1606;1607loop.preheader:1608 br label %loop1609 1610loop:1611 %len = phi i64 [ %dec, %loop ], [ 0, %loop.preheader ]1612 %dec = add nsw i64 %len, 11613 %arrayidx = getelementptr inbounds float, ptr %a, i64 %len1614 %0 = load float, ptr %arrayidx, align 41615 %tmp = fadd fast float %0, 3.000000e+001616 %arrayidx1 = getelementptr inbounds float, ptr %b, i64 %len1617 store float %tmp, ptr %arrayidx1, align 41618 %.not = icmp eq i64 %dec, 1001619 br i1 %.not, label %finish.loopexit, label %loop1620 1621finish.loopexit:1622 ret void1623}1624 1625define void @test_fsub(ptr nocapture %a, ptr nocapture readonly %b) {1626; IF-EVL-LABEL: define void @test_fsub(1627; IF-EVL-SAME: ptr captures(none) [[A:%.*]], ptr readonly captures(none) [[B:%.*]]) #[[ATTR0]] {1628; IF-EVL-NEXT: [[LOOP_PREHEADER:.*:]]1629; IF-EVL-NEXT: [[A2:%.*]] = ptrtoint ptr [[A]] to i641630; IF-EVL-NEXT: [[B1:%.*]] = ptrtoint ptr [[B]] to i641631; IF-EVL-NEXT: br label %[[VECTOR_MEMCHECK:.*]]1632; IF-EVL: [[VECTOR_MEMCHECK]]:1633; IF-EVL-NEXT: [[TMP0:%.*]] = call i64 @llvm.vscale.i64()1634; IF-EVL-NEXT: [[TMP1:%.*]] = mul nuw i64 [[TMP0]], 41635; IF-EVL-NEXT: [[TMP2:%.*]] = mul i64 [[TMP1]], 41636; IF-EVL-NEXT: [[TMP3:%.*]] = sub i64 [[B1]], [[A2]]1637; IF-EVL-NEXT: [[DIFF_CHECK:%.*]] = icmp ult i64 [[TMP3]], [[TMP2]]1638; IF-EVL-NEXT: br i1 [[DIFF_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]1639; IF-EVL: [[VECTOR_PH]]:1640; IF-EVL-NEXT: br label %[[VECTOR_BODY:.*]]1641; IF-EVL: [[VECTOR_BODY]]:1642; IF-EVL-NEXT: [[EVL_BASED_IV:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_EVL_NEXT:%.*]], %[[VECTOR_BODY]] ]1643; IF-EVL-NEXT: [[TMP11:%.*]] = phi i64 [ 100, %[[VECTOR_PH]] ], [ [[AVL_NEXT:%.*]], %[[VECTOR_BODY]] ]1644; IF-EVL-NEXT: [[TMP12:%.*]] = call i32 @llvm.experimental.get.vector.length.i64(i64 [[TMP11]], i32 4, i1 true)1645; IF-EVL-NEXT: [[TMP14:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[EVL_BASED_IV]]1646; IF-EVL-NEXT: [[VP_OP_LOAD:%.*]] = call <vscale x 4 x float> @llvm.vp.load.nxv4f32.p0(ptr align 4 [[TMP14]], <vscale x 4 x i1> splat (i1 true), i32 [[TMP12]])1647; IF-EVL-NEXT: [[VP_OP:%.*]] = fsub fast <vscale x 4 x float> [[VP_OP_LOAD]], splat (float 3.000000e+00)1648; IF-EVL-NEXT: [[TMP17:%.*]] = getelementptr inbounds float, ptr [[B]], i64 [[EVL_BASED_IV]]1649; IF-EVL-NEXT: call void @llvm.vp.store.nxv4f32.p0(<vscale x 4 x float> [[VP_OP]], ptr align 4 [[TMP17]], <vscale x 4 x i1> splat (i1 true), i32 [[TMP12]])1650; IF-EVL-NEXT: [[TMP19:%.*]] = zext i32 [[TMP12]] to i641651; IF-EVL-NEXT: [[INDEX_EVL_NEXT]] = add nuw i64 [[TMP19]], [[EVL_BASED_IV]]1652; IF-EVL-NEXT: [[AVL_NEXT]] = sub nuw i64 [[TMP11]], [[TMP19]]1653; IF-EVL-NEXT: [[TMP15:%.*]] = icmp eq i64 [[AVL_NEXT]], 01654; IF-EVL-NEXT: br i1 [[TMP15]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP30:![0-9]+]]1655; IF-EVL: [[MIDDLE_BLOCK]]:1656; IF-EVL-NEXT: br label %[[FINISH_LOOPEXIT:.*]]1657; IF-EVL: [[SCALAR_PH]]:1658; IF-EVL-NEXT: br label %[[LOOP:.*]]1659; IF-EVL: [[LOOP]]:1660; IF-EVL-NEXT: [[LEN:%.*]] = phi i64 [ [[DEC:%.*]], %[[LOOP]] ], [ 0, %[[SCALAR_PH]] ]1661; IF-EVL-NEXT: [[DEC]] = add nsw i64 [[LEN]], 11662; IF-EVL-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[LEN]]1663; IF-EVL-NEXT: [[TMP21:%.*]] = load float, ptr [[ARRAYIDX]], align 41664; IF-EVL-NEXT: [[TMP:%.*]] = fsub fast float [[TMP21]], 3.000000e+001665; IF-EVL-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds float, ptr [[B]], i64 [[LEN]]1666; IF-EVL-NEXT: store float [[TMP]], ptr [[ARRAYIDX1]], align 41667; IF-EVL-NEXT: [[DOTNOT:%.*]] = icmp eq i64 [[DEC]], 1001668; IF-EVL-NEXT: br i1 [[DOTNOT]], label %[[FINISH_LOOPEXIT]], label %[[LOOP]], !llvm.loop [[LOOP31:![0-9]+]]1669; IF-EVL: [[FINISH_LOOPEXIT]]:1670; IF-EVL-NEXT: ret void1671;1672; NO-VP-LABEL: define void @test_fsub(1673; NO-VP-SAME: ptr captures(none) [[A:%.*]], ptr readonly captures(none) [[B:%.*]]) #[[ATTR0]] {1674; NO-VP-NEXT: [[LOOP_PREHEADER:.*]]:1675; NO-VP-NEXT: [[A2:%.*]] = ptrtoint ptr [[A]] to i641676; NO-VP-NEXT: [[B1:%.*]] = ptrtoint ptr [[B]] to i641677; NO-VP-NEXT: [[TMP9:%.*]] = call i64 @llvm.vscale.i64()1678; NO-VP-NEXT: [[TMP1:%.*]] = shl nuw i64 [[TMP9]], 21679; NO-VP-NEXT: [[TMP2:%.*]] = call i64 @llvm.umax.i64(i64 [[TMP1]], i64 16)1680; NO-VP-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 100, [[TMP2]]1681; NO-VP-NEXT: br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_MEMCHECK:.*]]1682; NO-VP: [[VECTOR_MEMCHECK]]:1683; NO-VP-NEXT: [[TMP3:%.*]] = call i64 @llvm.vscale.i64()1684; NO-VP-NEXT: [[TMP4:%.*]] = mul nuw i64 [[TMP3]], 41685; NO-VP-NEXT: [[TMP5:%.*]] = mul i64 [[TMP4]], 41686; NO-VP-NEXT: [[TMP6:%.*]] = sub i64 [[B1]], [[A2]]1687; NO-VP-NEXT: [[DIFF_CHECK:%.*]] = icmp ult i64 [[TMP6]], [[TMP5]]1688; NO-VP-NEXT: br i1 [[DIFF_CHECK]], label %[[SCALAR_PH]], label %[[VECTOR_PH:.*]]1689; NO-VP: [[VECTOR_PH]]:1690; NO-VP-NEXT: [[TMP7:%.*]] = call i64 @llvm.vscale.i64()1691; NO-VP-NEXT: [[TMP8:%.*]] = mul nuw i64 [[TMP7]], 41692; NO-VP-NEXT: [[N_MOD_VF:%.*]] = urem i64 100, [[TMP8]]1693; NO-VP-NEXT: [[N_VEC:%.*]] = sub i64 100, [[N_MOD_VF]]1694; NO-VP-NEXT: br label %[[VECTOR_BODY:.*]]1695; NO-VP: [[VECTOR_BODY]]:1696; NO-VP-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]1697; NO-VP-NEXT: [[TMP11:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[INDEX]]1698; NO-VP-NEXT: [[WIDE_LOAD:%.*]] = load <vscale x 4 x float>, ptr [[TMP11]], align 41699; NO-VP-NEXT: [[TMP12:%.*]] = fsub fast <vscale x 4 x float> [[WIDE_LOAD]], splat (float 3.000000e+00)1700; NO-VP-NEXT: [[TMP13:%.*]] = getelementptr inbounds float, ptr [[B]], i64 [[INDEX]]1701; NO-VP-NEXT: store <vscale x 4 x float> [[TMP12]], ptr [[TMP13]], align 41702; NO-VP-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], [[TMP8]]1703; NO-VP-NEXT: [[TMP14:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]1704; NO-VP-NEXT: br i1 [[TMP14]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP30:![0-9]+]]1705; NO-VP: [[MIDDLE_BLOCK]]:1706; NO-VP-NEXT: [[CMP_N:%.*]] = icmp eq i64 100, [[N_VEC]]1707; NO-VP-NEXT: br i1 [[CMP_N]], label %[[FINISH_LOOPEXIT:.*]], label %[[SCALAR_PH]]1708; NO-VP: [[SCALAR_PH]]:1709; NO-VP-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[LOOP_PREHEADER]] ], [ 0, %[[VECTOR_MEMCHECK]] ]1710; NO-VP-NEXT: br label %[[LOOP:.*]]1711; NO-VP: [[LOOP]]:1712; NO-VP-NEXT: [[LEN:%.*]] = phi i64 [ [[DEC:%.*]], %[[LOOP]] ], [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ]1713; NO-VP-NEXT: [[DEC]] = add nsw i64 [[LEN]], 11714; NO-VP-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[LEN]]1715; NO-VP-NEXT: [[TMP0:%.*]] = load float, ptr [[ARRAYIDX]], align 41716; NO-VP-NEXT: [[TMP:%.*]] = fsub fast float [[TMP0]], 3.000000e+001717; NO-VP-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds float, ptr [[B]], i64 [[LEN]]1718; NO-VP-NEXT: store float [[TMP]], ptr [[ARRAYIDX1]], align 41719; NO-VP-NEXT: [[DOTNOT:%.*]] = icmp eq i64 [[DEC]], 1001720; NO-VP-NEXT: br i1 [[DOTNOT]], label %[[FINISH_LOOPEXIT]], label %[[LOOP]], !llvm.loop [[LOOP31:![0-9]+]]1721; NO-VP: [[FINISH_LOOPEXIT]]:1722; NO-VP-NEXT: ret void1723;1724loop.preheader:1725 br label %loop1726 1727loop:1728 %len = phi i64 [ %dec, %loop ], [ 0, %loop.preheader ]1729 %dec = add nsw i64 %len, 11730 %arrayidx = getelementptr inbounds float, ptr %a, i64 %len1731 %0 = load float, ptr %arrayidx, align 41732 %tmp = fsub fast float %0, 3.000000e+001733 %arrayidx1 = getelementptr inbounds float, ptr %b, i64 %len1734 store float %tmp, ptr %arrayidx1, align 41735 %.not = icmp eq i64 %dec, 1001736 br i1 %.not, label %finish.loopexit, label %loop1737 1738finish.loopexit:1739 ret void1740}1741 1742define void @test_fmul(ptr nocapture %a, ptr nocapture readonly %b) {1743; IF-EVL-LABEL: define void @test_fmul(1744; IF-EVL-SAME: ptr captures(none) [[A:%.*]], ptr readonly captures(none) [[B:%.*]]) #[[ATTR0]] {1745; IF-EVL-NEXT: [[LOOP_PREHEADER:.*:]]1746; IF-EVL-NEXT: [[A2:%.*]] = ptrtoint ptr [[A]] to i641747; IF-EVL-NEXT: [[B1:%.*]] = ptrtoint ptr [[B]] to i641748; IF-EVL-NEXT: br label %[[VECTOR_MEMCHECK:.*]]1749; IF-EVL: [[VECTOR_MEMCHECK]]:1750; IF-EVL-NEXT: [[TMP0:%.*]] = call i64 @llvm.vscale.i64()1751; IF-EVL-NEXT: [[TMP1:%.*]] = mul nuw i64 [[TMP0]], 41752; IF-EVL-NEXT: [[TMP2:%.*]] = mul i64 [[TMP1]], 41753; IF-EVL-NEXT: [[TMP3:%.*]] = sub i64 [[B1]], [[A2]]1754; IF-EVL-NEXT: [[DIFF_CHECK:%.*]] = icmp ult i64 [[TMP3]], [[TMP2]]1755; IF-EVL-NEXT: br i1 [[DIFF_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]1756; IF-EVL: [[VECTOR_PH]]:1757; IF-EVL-NEXT: br label %[[VECTOR_BODY:.*]]1758; IF-EVL: [[VECTOR_BODY]]:1759; IF-EVL-NEXT: [[EVL_BASED_IV:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_EVL_NEXT:%.*]], %[[VECTOR_BODY]] ]1760; IF-EVL-NEXT: [[TMP11:%.*]] = phi i64 [ 100, %[[VECTOR_PH]] ], [ [[AVL_NEXT:%.*]], %[[VECTOR_BODY]] ]1761; IF-EVL-NEXT: [[TMP12:%.*]] = call i32 @llvm.experimental.get.vector.length.i64(i64 [[TMP11]], i32 4, i1 true)1762; IF-EVL-NEXT: [[TMP14:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[EVL_BASED_IV]]1763; IF-EVL-NEXT: [[VP_OP_LOAD:%.*]] = call <vscale x 4 x float> @llvm.vp.load.nxv4f32.p0(ptr align 4 [[TMP14]], <vscale x 4 x i1> splat (i1 true), i32 [[TMP12]])1764; IF-EVL-NEXT: [[VP_OP:%.*]] = fmul fast <vscale x 4 x float> [[VP_OP_LOAD]], splat (float 3.000000e+00)1765; IF-EVL-NEXT: [[TMP17:%.*]] = getelementptr inbounds float, ptr [[B]], i64 [[EVL_BASED_IV]]1766; IF-EVL-NEXT: call void @llvm.vp.store.nxv4f32.p0(<vscale x 4 x float> [[VP_OP]], ptr align 4 [[TMP17]], <vscale x 4 x i1> splat (i1 true), i32 [[TMP12]])1767; IF-EVL-NEXT: [[TMP19:%.*]] = zext i32 [[TMP12]] to i641768; IF-EVL-NEXT: [[INDEX_EVL_NEXT]] = add nuw i64 [[TMP19]], [[EVL_BASED_IV]]1769; IF-EVL-NEXT: [[AVL_NEXT]] = sub nuw i64 [[TMP11]], [[TMP19]]1770; IF-EVL-NEXT: [[TMP15:%.*]] = icmp eq i64 [[AVL_NEXT]], 01771; IF-EVL-NEXT: br i1 [[TMP15]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP32:![0-9]+]]1772; IF-EVL: [[MIDDLE_BLOCK]]:1773; IF-EVL-NEXT: br label %[[FINISH_LOOPEXIT:.*]]1774; IF-EVL: [[SCALAR_PH]]:1775; IF-EVL-NEXT: br label %[[LOOP:.*]]1776; IF-EVL: [[LOOP]]:1777; IF-EVL-NEXT: [[LEN:%.*]] = phi i64 [ [[DEC:%.*]], %[[LOOP]] ], [ 0, %[[SCALAR_PH]] ]1778; IF-EVL-NEXT: [[DEC]] = add nsw i64 [[LEN]], 11779; IF-EVL-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[LEN]]1780; IF-EVL-NEXT: [[TMP21:%.*]] = load float, ptr [[ARRAYIDX]], align 41781; IF-EVL-NEXT: [[TMP:%.*]] = fmul fast float [[TMP21]], 3.000000e+001782; IF-EVL-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds float, ptr [[B]], i64 [[LEN]]1783; IF-EVL-NEXT: store float [[TMP]], ptr [[ARRAYIDX1]], align 41784; IF-EVL-NEXT: [[DOTNOT:%.*]] = icmp eq i64 [[DEC]], 1001785; IF-EVL-NEXT: br i1 [[DOTNOT]], label %[[FINISH_LOOPEXIT]], label %[[LOOP]], !llvm.loop [[LOOP33:![0-9]+]]1786; IF-EVL: [[FINISH_LOOPEXIT]]:1787; IF-EVL-NEXT: ret void1788;1789; NO-VP-LABEL: define void @test_fmul(1790; NO-VP-SAME: ptr captures(none) [[A:%.*]], ptr readonly captures(none) [[B:%.*]]) #[[ATTR0]] {1791; NO-VP-NEXT: [[LOOP_PREHEADER:.*]]:1792; NO-VP-NEXT: [[A2:%.*]] = ptrtoint ptr [[A]] to i641793; NO-VP-NEXT: [[B1:%.*]] = ptrtoint ptr [[B]] to i641794; NO-VP-NEXT: [[TMP9:%.*]] = call i64 @llvm.vscale.i64()1795; NO-VP-NEXT: [[TMP1:%.*]] = shl nuw i64 [[TMP9]], 21796; NO-VP-NEXT: [[TMP2:%.*]] = call i64 @llvm.umax.i64(i64 [[TMP1]], i64 16)1797; NO-VP-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 100, [[TMP2]]1798; NO-VP-NEXT: br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_MEMCHECK:.*]]1799; NO-VP: [[VECTOR_MEMCHECK]]:1800; NO-VP-NEXT: [[TMP3:%.*]] = call i64 @llvm.vscale.i64()1801; NO-VP-NEXT: [[TMP4:%.*]] = mul nuw i64 [[TMP3]], 41802; NO-VP-NEXT: [[TMP5:%.*]] = mul i64 [[TMP4]], 41803; NO-VP-NEXT: [[TMP6:%.*]] = sub i64 [[B1]], [[A2]]1804; NO-VP-NEXT: [[DIFF_CHECK:%.*]] = icmp ult i64 [[TMP6]], [[TMP5]]1805; NO-VP-NEXT: br i1 [[DIFF_CHECK]], label %[[SCALAR_PH]], label %[[VECTOR_PH:.*]]1806; NO-VP: [[VECTOR_PH]]:1807; NO-VP-NEXT: [[TMP7:%.*]] = call i64 @llvm.vscale.i64()1808; NO-VP-NEXT: [[TMP8:%.*]] = mul nuw i64 [[TMP7]], 41809; NO-VP-NEXT: [[N_MOD_VF:%.*]] = urem i64 100, [[TMP8]]1810; NO-VP-NEXT: [[N_VEC:%.*]] = sub i64 100, [[N_MOD_VF]]1811; NO-VP-NEXT: br label %[[VECTOR_BODY:.*]]1812; NO-VP: [[VECTOR_BODY]]:1813; NO-VP-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]1814; NO-VP-NEXT: [[TMP11:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[INDEX]]1815; NO-VP-NEXT: [[WIDE_LOAD:%.*]] = load <vscale x 4 x float>, ptr [[TMP11]], align 41816; NO-VP-NEXT: [[TMP12:%.*]] = fmul fast <vscale x 4 x float> [[WIDE_LOAD]], splat (float 3.000000e+00)1817; NO-VP-NEXT: [[TMP13:%.*]] = getelementptr inbounds float, ptr [[B]], i64 [[INDEX]]1818; NO-VP-NEXT: store <vscale x 4 x float> [[TMP12]], ptr [[TMP13]], align 41819; NO-VP-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], [[TMP8]]1820; NO-VP-NEXT: [[TMP14:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]1821; NO-VP-NEXT: br i1 [[TMP14]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP32:![0-9]+]]1822; NO-VP: [[MIDDLE_BLOCK]]:1823; NO-VP-NEXT: [[CMP_N:%.*]] = icmp eq i64 100, [[N_VEC]]1824; NO-VP-NEXT: br i1 [[CMP_N]], label %[[FINISH_LOOPEXIT:.*]], label %[[SCALAR_PH]]1825; NO-VP: [[SCALAR_PH]]:1826; NO-VP-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[LOOP_PREHEADER]] ], [ 0, %[[VECTOR_MEMCHECK]] ]1827; NO-VP-NEXT: br label %[[LOOP:.*]]1828; NO-VP: [[LOOP]]:1829; NO-VP-NEXT: [[LEN:%.*]] = phi i64 [ [[DEC:%.*]], %[[LOOP]] ], [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ]1830; NO-VP-NEXT: [[DEC]] = add nsw i64 [[LEN]], 11831; NO-VP-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[LEN]]1832; NO-VP-NEXT: [[TMP0:%.*]] = load float, ptr [[ARRAYIDX]], align 41833; NO-VP-NEXT: [[TMP:%.*]] = fmul fast float [[TMP0]], 3.000000e+001834; NO-VP-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds float, ptr [[B]], i64 [[LEN]]1835; NO-VP-NEXT: store float [[TMP]], ptr [[ARRAYIDX1]], align 41836; NO-VP-NEXT: [[DOTNOT:%.*]] = icmp eq i64 [[DEC]], 1001837; NO-VP-NEXT: br i1 [[DOTNOT]], label %[[FINISH_LOOPEXIT]], label %[[LOOP]], !llvm.loop [[LOOP33:![0-9]+]]1838; NO-VP: [[FINISH_LOOPEXIT]]:1839; NO-VP-NEXT: ret void1840;1841loop.preheader:1842 br label %loop1843 1844loop:1845 %len = phi i64 [ %dec, %loop ], [ 0, %loop.preheader ]1846 %dec = add nsw i64 %len, 11847 %arrayidx = getelementptr inbounds float, ptr %a, i64 %len1848 %0 = load float, ptr %arrayidx, align 41849 %tmp = fmul fast float %0, 3.000000e+001850 %arrayidx1 = getelementptr inbounds float, ptr %b, i64 %len1851 store float %tmp, ptr %arrayidx1, align 41852 %.not = icmp eq i64 %dec, 1001853 br i1 %.not, label %finish.loopexit, label %loop1854 1855finish.loopexit:1856 ret void1857}1858 1859define void @test_fdiv(ptr nocapture %a, ptr nocapture readonly %b) {1860; IF-EVL-LABEL: define void @test_fdiv(1861; IF-EVL-SAME: ptr captures(none) [[A:%.*]], ptr readonly captures(none) [[B:%.*]]) #[[ATTR0]] {1862; IF-EVL-NEXT: [[LOOP_PREHEADER:.*:]]1863; IF-EVL-NEXT: [[A2:%.*]] = ptrtoint ptr [[A]] to i641864; IF-EVL-NEXT: [[B1:%.*]] = ptrtoint ptr [[B]] to i641865; IF-EVL-NEXT: br label %[[VECTOR_MEMCHECK:.*]]1866; IF-EVL: [[VECTOR_MEMCHECK]]:1867; IF-EVL-NEXT: [[TMP0:%.*]] = call i64 @llvm.vscale.i64()1868; IF-EVL-NEXT: [[TMP1:%.*]] = mul nuw i64 [[TMP0]], 41869; IF-EVL-NEXT: [[TMP2:%.*]] = mul i64 [[TMP1]], 41870; IF-EVL-NEXT: [[TMP3:%.*]] = sub i64 [[B1]], [[A2]]1871; IF-EVL-NEXT: [[DIFF_CHECK:%.*]] = icmp ult i64 [[TMP3]], [[TMP2]]1872; IF-EVL-NEXT: br i1 [[DIFF_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]1873; IF-EVL: [[VECTOR_PH]]:1874; IF-EVL-NEXT: br label %[[VECTOR_BODY:.*]]1875; IF-EVL: [[VECTOR_BODY]]:1876; IF-EVL-NEXT: [[EVL_BASED_IV:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_EVL_NEXT:%.*]], %[[VECTOR_BODY]] ]1877; IF-EVL-NEXT: [[TMP11:%.*]] = phi i64 [ 100, %[[VECTOR_PH]] ], [ [[AVL_NEXT:%.*]], %[[VECTOR_BODY]] ]1878; IF-EVL-NEXT: [[TMP12:%.*]] = call i32 @llvm.experimental.get.vector.length.i64(i64 [[TMP11]], i32 4, i1 true)1879; IF-EVL-NEXT: [[TMP14:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[EVL_BASED_IV]]1880; IF-EVL-NEXT: [[VP_OP_LOAD:%.*]] = call <vscale x 4 x float> @llvm.vp.load.nxv4f32.p0(ptr align 4 [[TMP14]], <vscale x 4 x i1> splat (i1 true), i32 [[TMP12]])1881; IF-EVL-NEXT: [[VP_OP:%.*]] = fdiv fast <vscale x 4 x float> [[VP_OP_LOAD]], splat (float 3.000000e+00)1882; IF-EVL-NEXT: [[TMP17:%.*]] = getelementptr inbounds float, ptr [[B]], i64 [[EVL_BASED_IV]]1883; IF-EVL-NEXT: call void @llvm.vp.store.nxv4f32.p0(<vscale x 4 x float> [[VP_OP]], ptr align 4 [[TMP17]], <vscale x 4 x i1> splat (i1 true), i32 [[TMP12]])1884; IF-EVL-NEXT: [[TMP19:%.*]] = zext i32 [[TMP12]] to i641885; IF-EVL-NEXT: [[INDEX_EVL_NEXT]] = add nuw i64 [[TMP19]], [[EVL_BASED_IV]]1886; IF-EVL-NEXT: [[AVL_NEXT]] = sub nuw i64 [[TMP11]], [[TMP19]]1887; IF-EVL-NEXT: [[TMP15:%.*]] = icmp eq i64 [[AVL_NEXT]], 01888; IF-EVL-NEXT: br i1 [[TMP15]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP34:![0-9]+]]1889; IF-EVL: [[MIDDLE_BLOCK]]:1890; IF-EVL-NEXT: br label %[[FINISH_LOOPEXIT:.*]]1891; IF-EVL: [[SCALAR_PH]]:1892; IF-EVL-NEXT: br label %[[LOOP:.*]]1893; IF-EVL: [[LOOP]]:1894; IF-EVL-NEXT: [[LEN:%.*]] = phi i64 [ [[DEC:%.*]], %[[LOOP]] ], [ 0, %[[SCALAR_PH]] ]1895; IF-EVL-NEXT: [[DEC]] = add nsw i64 [[LEN]], 11896; IF-EVL-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[LEN]]1897; IF-EVL-NEXT: [[TMP21:%.*]] = load float, ptr [[ARRAYIDX]], align 41898; IF-EVL-NEXT: [[TMP:%.*]] = fdiv fast float [[TMP21]], 3.000000e+001899; IF-EVL-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds float, ptr [[B]], i64 [[LEN]]1900; IF-EVL-NEXT: store float [[TMP]], ptr [[ARRAYIDX1]], align 41901; IF-EVL-NEXT: [[DOTNOT:%.*]] = icmp eq i64 [[DEC]], 1001902; IF-EVL-NEXT: br i1 [[DOTNOT]], label %[[FINISH_LOOPEXIT]], label %[[LOOP]], !llvm.loop [[LOOP35:![0-9]+]]1903; IF-EVL: [[FINISH_LOOPEXIT]]:1904; IF-EVL-NEXT: ret void1905;1906; NO-VP-LABEL: define void @test_fdiv(1907; NO-VP-SAME: ptr captures(none) [[A:%.*]], ptr readonly captures(none) [[B:%.*]]) #[[ATTR0]] {1908; NO-VP-NEXT: [[LOOP_PREHEADER:.*]]:1909; NO-VP-NEXT: [[A2:%.*]] = ptrtoint ptr [[A]] to i641910; NO-VP-NEXT: [[B1:%.*]] = ptrtoint ptr [[B]] to i641911; NO-VP-NEXT: [[TMP9:%.*]] = call i64 @llvm.vscale.i64()1912; NO-VP-NEXT: [[TMP1:%.*]] = shl nuw i64 [[TMP9]], 21913; NO-VP-NEXT: [[TMP2:%.*]] = call i64 @llvm.umax.i64(i64 [[TMP1]], i64 16)1914; NO-VP-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 100, [[TMP2]]1915; NO-VP-NEXT: br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_MEMCHECK:.*]]1916; NO-VP: [[VECTOR_MEMCHECK]]:1917; NO-VP-NEXT: [[TMP3:%.*]] = call i64 @llvm.vscale.i64()1918; NO-VP-NEXT: [[TMP4:%.*]] = mul nuw i64 [[TMP3]], 41919; NO-VP-NEXT: [[TMP5:%.*]] = mul i64 [[TMP4]], 41920; NO-VP-NEXT: [[TMP6:%.*]] = sub i64 [[B1]], [[A2]]1921; NO-VP-NEXT: [[DIFF_CHECK:%.*]] = icmp ult i64 [[TMP6]], [[TMP5]]1922; NO-VP-NEXT: br i1 [[DIFF_CHECK]], label %[[SCALAR_PH]], label %[[VECTOR_PH:.*]]1923; NO-VP: [[VECTOR_PH]]:1924; NO-VP-NEXT: [[TMP7:%.*]] = call i64 @llvm.vscale.i64()1925; NO-VP-NEXT: [[TMP8:%.*]] = mul nuw i64 [[TMP7]], 41926; NO-VP-NEXT: [[N_MOD_VF:%.*]] = urem i64 100, [[TMP8]]1927; NO-VP-NEXT: [[N_VEC:%.*]] = sub i64 100, [[N_MOD_VF]]1928; NO-VP-NEXT: br label %[[VECTOR_BODY:.*]]1929; NO-VP: [[VECTOR_BODY]]:1930; NO-VP-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]1931; NO-VP-NEXT: [[TMP11:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[INDEX]]1932; NO-VP-NEXT: [[WIDE_LOAD:%.*]] = load <vscale x 4 x float>, ptr [[TMP11]], align 41933; NO-VP-NEXT: [[TMP12:%.*]] = fdiv fast <vscale x 4 x float> [[WIDE_LOAD]], splat (float 3.000000e+00)1934; NO-VP-NEXT: [[TMP13:%.*]] = getelementptr inbounds float, ptr [[B]], i64 [[INDEX]]1935; NO-VP-NEXT: store <vscale x 4 x float> [[TMP12]], ptr [[TMP13]], align 41936; NO-VP-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], [[TMP8]]1937; NO-VP-NEXT: [[TMP14:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]1938; NO-VP-NEXT: br i1 [[TMP14]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP34:![0-9]+]]1939; NO-VP: [[MIDDLE_BLOCK]]:1940; NO-VP-NEXT: [[CMP_N:%.*]] = icmp eq i64 100, [[N_VEC]]1941; NO-VP-NEXT: br i1 [[CMP_N]], label %[[FINISH_LOOPEXIT:.*]], label %[[SCALAR_PH]]1942; NO-VP: [[SCALAR_PH]]:1943; NO-VP-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[LOOP_PREHEADER]] ], [ 0, %[[VECTOR_MEMCHECK]] ]1944; NO-VP-NEXT: br label %[[LOOP:.*]]1945; NO-VP: [[LOOP]]:1946; NO-VP-NEXT: [[LEN:%.*]] = phi i64 [ [[DEC:%.*]], %[[LOOP]] ], [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ]1947; NO-VP-NEXT: [[DEC]] = add nsw i64 [[LEN]], 11948; NO-VP-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[LEN]]1949; NO-VP-NEXT: [[TMP0:%.*]] = load float, ptr [[ARRAYIDX]], align 41950; NO-VP-NEXT: [[TMP:%.*]] = fdiv fast float [[TMP0]], 3.000000e+001951; NO-VP-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds float, ptr [[B]], i64 [[LEN]]1952; NO-VP-NEXT: store float [[TMP]], ptr [[ARRAYIDX1]], align 41953; NO-VP-NEXT: [[DOTNOT:%.*]] = icmp eq i64 [[DEC]], 1001954; NO-VP-NEXT: br i1 [[DOTNOT]], label %[[FINISH_LOOPEXIT]], label %[[LOOP]], !llvm.loop [[LOOP35:![0-9]+]]1955; NO-VP: [[FINISH_LOOPEXIT]]:1956; NO-VP-NEXT: ret void1957;1958loop.preheader:1959 br label %loop1960 1961loop:1962 %len = phi i64 [ %dec, %loop ], [ 0, %loop.preheader ]1963 %dec = add nsw i64 %len, 11964 %arrayidx = getelementptr inbounds float, ptr %a, i64 %len1965 %0 = load float, ptr %arrayidx, align 41966 %tmp = fdiv fast float %0, 3.000000e+001967 %arrayidx1 = getelementptr inbounds float, ptr %b, i64 %len1968 store float %tmp, ptr %arrayidx1, align 41969 %.not = icmp eq i64 %dec, 1001970 br i1 %.not, label %finish.loopexit, label %loop1971 1972finish.loopexit:1973 ret void1974}1975 1976define void @test_frem(ptr nocapture %a, ptr nocapture readonly %b) {1977; IF-EVL-LABEL: define void @test_frem(1978; IF-EVL-SAME: ptr captures(none) [[A:%.*]], ptr readonly captures(none) [[B:%.*]]) #[[ATTR0]] {1979; IF-EVL-NEXT: [[LOOP_PREHEADER:.*]]:1980; IF-EVL-NEXT: br label %[[LOOP:.*]]1981; IF-EVL: [[LOOP]]:1982; IF-EVL-NEXT: [[LEN:%.*]] = phi i64 [ [[DEC:%.*]], %[[LOOP]] ], [ 0, %[[LOOP_PREHEADER]] ]1983; IF-EVL-NEXT: [[DEC]] = add nsw i64 [[LEN]], 11984; IF-EVL-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[LEN]]1985; IF-EVL-NEXT: [[TMP0:%.*]] = load float, ptr [[ARRAYIDX]], align 41986; IF-EVL-NEXT: [[TMP:%.*]] = frem fast float [[TMP0]], 3.000000e+001987; IF-EVL-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds float, ptr [[B]], i64 [[LEN]]1988; IF-EVL-NEXT: store float [[TMP]], ptr [[ARRAYIDX1]], align 41989; IF-EVL-NEXT: [[DOTNOT:%.*]] = icmp eq i64 [[DEC]], 1001990; IF-EVL-NEXT: br i1 [[DOTNOT]], label %[[FINISH_LOOPEXIT:.*]], label %[[LOOP]]1991; IF-EVL: [[FINISH_LOOPEXIT]]:1992; IF-EVL-NEXT: ret void1993;1994; NO-VP-LABEL: define void @test_frem(1995; NO-VP-SAME: ptr captures(none) [[A:%.*]], ptr readonly captures(none) [[B:%.*]]) #[[ATTR0]] {1996; NO-VP-NEXT: [[LOOP_PREHEADER:.*]]:1997; NO-VP-NEXT: br label %[[LOOP:.*]]1998; NO-VP: [[LOOP]]:1999; NO-VP-NEXT: [[LEN:%.*]] = phi i64 [ [[DEC:%.*]], %[[LOOP]] ], [ 0, %[[LOOP_PREHEADER]] ]2000; NO-VP-NEXT: [[DEC]] = add nsw i64 [[LEN]], 12001; NO-VP-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[LEN]]2002; NO-VP-NEXT: [[TMP0:%.*]] = load float, ptr [[ARRAYIDX]], align 42003; NO-VP-NEXT: [[TMP:%.*]] = frem fast float [[TMP0]], 3.000000e+002004; NO-VP-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds float, ptr [[B]], i64 [[LEN]]2005; NO-VP-NEXT: store float [[TMP]], ptr [[ARRAYIDX1]], align 42006; NO-VP-NEXT: [[DOTNOT:%.*]] = icmp eq i64 [[DEC]], 1002007; NO-VP-NEXT: br i1 [[DOTNOT]], label %[[FINISH_LOOPEXIT:.*]], label %[[LOOP]]2008; NO-VP: [[FINISH_LOOPEXIT]]:2009; NO-VP-NEXT: ret void2010;2011loop.preheader:2012 br label %loop2013 2014loop:2015 %len = phi i64 [ %dec, %loop ], [ 0, %loop.preheader ]2016 %dec = add nsw i64 %len, 12017 %arrayidx = getelementptr inbounds float, ptr %a, i64 %len2018 %0 = load float, ptr %arrayidx, align 42019 %tmp = frem fast float %0, 3.000000e+002020 %arrayidx1 = getelementptr inbounds float, ptr %b, i64 %len2021 store float %tmp, ptr %arrayidx1, align 42022 %.not = icmp eq i64 %dec, 1002023 br i1 %.not, label %finish.loopexit, label %loop2024 2025finish.loopexit:2026 ret void2027}2028 2029define void @test_fneg(ptr nocapture %a, ptr nocapture readonly %b) {2030; IF-EVL-LABEL: define void @test_fneg(2031; IF-EVL-SAME: ptr captures(none) [[A:%.*]], ptr readonly captures(none) [[B:%.*]]) #[[ATTR0]] {2032; IF-EVL-NEXT: [[LOOP_PREHEADER:.*:]]2033; IF-EVL-NEXT: [[A2:%.*]] = ptrtoint ptr [[A]] to i642034; IF-EVL-NEXT: [[B1:%.*]] = ptrtoint ptr [[B]] to i642035; IF-EVL-NEXT: br label %[[VECTOR_MEMCHECK:.*]]2036; IF-EVL: [[VECTOR_MEMCHECK]]:2037; IF-EVL-NEXT: [[TMP0:%.*]] = call i64 @llvm.vscale.i64()2038; IF-EVL-NEXT: [[TMP1:%.*]] = mul nuw i64 [[TMP0]], 42039; IF-EVL-NEXT: [[TMP2:%.*]] = mul i64 [[TMP1]], 42040; IF-EVL-NEXT: [[TMP3:%.*]] = sub i64 [[B1]], [[A2]]2041; IF-EVL-NEXT: [[DIFF_CHECK:%.*]] = icmp ult i64 [[TMP3]], [[TMP2]]2042; IF-EVL-NEXT: br i1 [[DIFF_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]2043; IF-EVL: [[VECTOR_PH]]:2044; IF-EVL-NEXT: br label %[[VECTOR_BODY:.*]]2045; IF-EVL: [[VECTOR_BODY]]:2046; IF-EVL-NEXT: [[EVL_BASED_IV:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_EVL_NEXT:%.*]], %[[VECTOR_BODY]] ]2047; IF-EVL-NEXT: [[TMP11:%.*]] = phi i64 [ 100, %[[VECTOR_PH]] ], [ [[AVL_NEXT:%.*]], %[[VECTOR_BODY]] ]2048; IF-EVL-NEXT: [[TMP12:%.*]] = call i32 @llvm.experimental.get.vector.length.i64(i64 [[TMP11]], i32 4, i1 true)2049; IF-EVL-NEXT: [[TMP14:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[EVL_BASED_IV]]2050; IF-EVL-NEXT: [[VP_OP_LOAD:%.*]] = call <vscale x 4 x float> @llvm.vp.load.nxv4f32.p0(ptr align 4 [[TMP14]], <vscale x 4 x i1> splat (i1 true), i32 [[TMP12]])2051; IF-EVL-NEXT: [[VP_OP:%.*]] = fneg fast <vscale x 4 x float> [[VP_OP_LOAD]]2052; IF-EVL-NEXT: [[TMP17:%.*]] = getelementptr inbounds float, ptr [[B]], i64 [[EVL_BASED_IV]]2053; IF-EVL-NEXT: call void @llvm.vp.store.nxv4f32.p0(<vscale x 4 x float> [[VP_OP]], ptr align 4 [[TMP17]], <vscale x 4 x i1> splat (i1 true), i32 [[TMP12]])2054; IF-EVL-NEXT: [[TMP19:%.*]] = zext i32 [[TMP12]] to i642055; IF-EVL-NEXT: [[INDEX_EVL_NEXT]] = add nuw i64 [[TMP19]], [[EVL_BASED_IV]]2056; IF-EVL-NEXT: [[AVL_NEXT]] = sub nuw i64 [[TMP11]], [[TMP19]]2057; IF-EVL-NEXT: [[TMP15:%.*]] = icmp eq i64 [[AVL_NEXT]], 02058; IF-EVL-NEXT: br i1 [[TMP15]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP36:![0-9]+]]2059; IF-EVL: [[MIDDLE_BLOCK]]:2060; IF-EVL-NEXT: br label %[[FINISH_LOOPEXIT:.*]]2061; IF-EVL: [[SCALAR_PH]]:2062; IF-EVL-NEXT: br label %[[LOOP:.*]]2063; IF-EVL: [[LOOP]]:2064; IF-EVL-NEXT: [[LEN:%.*]] = phi i64 [ [[DEC:%.*]], %[[LOOP]] ], [ 0, %[[SCALAR_PH]] ]2065; IF-EVL-NEXT: [[DEC]] = add nsw i64 [[LEN]], 12066; IF-EVL-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[LEN]]2067; IF-EVL-NEXT: [[TMP21:%.*]] = load float, ptr [[ARRAYIDX]], align 42068; IF-EVL-NEXT: [[TMP:%.*]] = fneg fast float [[TMP21]]2069; IF-EVL-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds float, ptr [[B]], i64 [[LEN]]2070; IF-EVL-NEXT: store float [[TMP]], ptr [[ARRAYIDX1]], align 42071; IF-EVL-NEXT: [[DOTNOT:%.*]] = icmp eq i64 [[DEC]], 1002072; IF-EVL-NEXT: br i1 [[DOTNOT]], label %[[FINISH_LOOPEXIT]], label %[[LOOP]], !llvm.loop [[LOOP37:![0-9]+]]2073; IF-EVL: [[FINISH_LOOPEXIT]]:2074; IF-EVL-NEXT: ret void2075;2076; NO-VP-LABEL: define void @test_fneg(2077; NO-VP-SAME: ptr captures(none) [[A:%.*]], ptr readonly captures(none) [[B:%.*]]) #[[ATTR0]] {2078; NO-VP-NEXT: [[LOOP_PREHEADER:.*]]:2079; NO-VP-NEXT: [[A2:%.*]] = ptrtoint ptr [[A]] to i642080; NO-VP-NEXT: [[B1:%.*]] = ptrtoint ptr [[B]] to i642081; NO-VP-NEXT: [[TMP9:%.*]] = call i64 @llvm.vscale.i64()2082; NO-VP-NEXT: [[TMP1:%.*]] = shl nuw i64 [[TMP9]], 22083; NO-VP-NEXT: [[TMP2:%.*]] = call i64 @llvm.umax.i64(i64 [[TMP1]], i64 16)2084; NO-VP-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 100, [[TMP2]]2085; NO-VP-NEXT: br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_MEMCHECK:.*]]2086; NO-VP: [[VECTOR_MEMCHECK]]:2087; NO-VP-NEXT: [[TMP3:%.*]] = call i64 @llvm.vscale.i64()2088; NO-VP-NEXT: [[TMP4:%.*]] = mul nuw i64 [[TMP3]], 42089; NO-VP-NEXT: [[TMP5:%.*]] = mul i64 [[TMP4]], 42090; NO-VP-NEXT: [[TMP6:%.*]] = sub i64 [[B1]], [[A2]]2091; NO-VP-NEXT: [[DIFF_CHECK:%.*]] = icmp ult i64 [[TMP6]], [[TMP5]]2092; NO-VP-NEXT: br i1 [[DIFF_CHECK]], label %[[SCALAR_PH]], label %[[VECTOR_PH:.*]]2093; NO-VP: [[VECTOR_PH]]:2094; NO-VP-NEXT: [[TMP7:%.*]] = call i64 @llvm.vscale.i64()2095; NO-VP-NEXT: [[TMP8:%.*]] = mul nuw i64 [[TMP7]], 42096; NO-VP-NEXT: [[N_MOD_VF:%.*]] = urem i64 100, [[TMP8]]2097; NO-VP-NEXT: [[N_VEC:%.*]] = sub i64 100, [[N_MOD_VF]]2098; NO-VP-NEXT: br label %[[VECTOR_BODY:.*]]2099; NO-VP: [[VECTOR_BODY]]:2100; NO-VP-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]2101; NO-VP-NEXT: [[TMP11:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[INDEX]]2102; NO-VP-NEXT: [[WIDE_LOAD:%.*]] = load <vscale x 4 x float>, ptr [[TMP11]], align 42103; NO-VP-NEXT: [[TMP12:%.*]] = fneg fast <vscale x 4 x float> [[WIDE_LOAD]]2104; NO-VP-NEXT: [[TMP13:%.*]] = getelementptr inbounds float, ptr [[B]], i64 [[INDEX]]2105; NO-VP-NEXT: store <vscale x 4 x float> [[TMP12]], ptr [[TMP13]], align 42106; NO-VP-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], [[TMP8]]2107; NO-VP-NEXT: [[TMP14:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]2108; NO-VP-NEXT: br i1 [[TMP14]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP36:![0-9]+]]2109; NO-VP: [[MIDDLE_BLOCK]]:2110; NO-VP-NEXT: [[CMP_N:%.*]] = icmp eq i64 100, [[N_VEC]]2111; NO-VP-NEXT: br i1 [[CMP_N]], label %[[FINISH_LOOPEXIT:.*]], label %[[SCALAR_PH]]2112; NO-VP: [[SCALAR_PH]]:2113; NO-VP-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[LOOP_PREHEADER]] ], [ 0, %[[VECTOR_MEMCHECK]] ]2114; NO-VP-NEXT: br label %[[LOOP:.*]]2115; NO-VP: [[LOOP]]:2116; NO-VP-NEXT: [[LEN:%.*]] = phi i64 [ [[DEC:%.*]], %[[LOOP]] ], [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ]2117; NO-VP-NEXT: [[DEC]] = add nsw i64 [[LEN]], 12118; NO-VP-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[LEN]]2119; NO-VP-NEXT: [[TMP0:%.*]] = load float, ptr [[ARRAYIDX]], align 42120; NO-VP-NEXT: [[TMP:%.*]] = fneg fast float [[TMP0]]2121; NO-VP-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds float, ptr [[B]], i64 [[LEN]]2122; NO-VP-NEXT: store float [[TMP]], ptr [[ARRAYIDX1]], align 42123; NO-VP-NEXT: [[DOTNOT:%.*]] = icmp eq i64 [[DEC]], 1002124; NO-VP-NEXT: br i1 [[DOTNOT]], label %[[FINISH_LOOPEXIT]], label %[[LOOP]], !llvm.loop [[LOOP37:![0-9]+]]2125; NO-VP: [[FINISH_LOOPEXIT]]:2126; NO-VP-NEXT: ret void2127;2128loop.preheader:2129 br label %loop2130 2131loop:2132 %len = phi i64 [ %dec, %loop ], [ 0, %loop.preheader ]2133 %dec = add nsw i64 %len, 12134 %arrayidx = getelementptr inbounds float, ptr %a, i64 %len2135 %0 = load float, ptr %arrayidx, align 42136 %tmp = fneg fast float %02137 %arrayidx1 = getelementptr inbounds float, ptr %b, i64 %len2138 store float %tmp, ptr %arrayidx1, align 42139 %.not = icmp eq i64 %dec, 1002140 br i1 %.not, label %finish.loopexit, label %loop2141 2142finish.loopexit:2143 ret void2144}2145;.2146; IF-EVL: [[LOOP0]] = distinct !{[[LOOP0]], [[META1:![0-9]+]], [[META2:![0-9]+]]}2147; IF-EVL: [[META1]] = !{!"llvm.loop.isvectorized", i32 1}2148; IF-EVL: [[META2]] = !{!"llvm.loop.unroll.runtime.disable"}2149; IF-EVL: [[LOOP3]] = distinct !{[[LOOP3]], [[META1]]}2150; IF-EVL: [[LOOP4]] = distinct !{[[LOOP4]], [[META1]], [[META2]]}2151; IF-EVL: [[LOOP5]] = distinct !{[[LOOP5]], [[META1]]}2152; IF-EVL: [[LOOP6]] = distinct !{[[LOOP6]], [[META1]], [[META2]]}2153; IF-EVL: [[LOOP7]] = distinct !{[[LOOP7]], [[META1]]}2154; IF-EVL: [[LOOP8]] = distinct !{[[LOOP8]], [[META1]], [[META2]]}2155; IF-EVL: [[LOOP9]] = distinct !{[[LOOP9]], [[META1]]}2156; IF-EVL: [[LOOP10]] = distinct !{[[LOOP10]], [[META1]], [[META2]]}2157; IF-EVL: [[LOOP11]] = distinct !{[[LOOP11]], [[META1]]}2158; IF-EVL: [[LOOP12]] = distinct !{[[LOOP12]], [[META1]], [[META2]]}2159; IF-EVL: [[LOOP13]] = distinct !{[[LOOP13]], [[META1]]}2160; IF-EVL: [[LOOP14]] = distinct !{[[LOOP14]], [[META1]], [[META2]]}2161; IF-EVL: [[LOOP15]] = distinct !{[[LOOP15]], [[META1]]}2162; IF-EVL: [[LOOP16]] = distinct !{[[LOOP16]], [[META1]], [[META2]]}2163; IF-EVL: [[LOOP17]] = distinct !{[[LOOP17]], [[META1]]}2164; IF-EVL: [[LOOP18]] = distinct !{[[LOOP18]], [[META1]], [[META2]]}2165; IF-EVL: [[LOOP19]] = distinct !{[[LOOP19]], [[META1]]}2166; IF-EVL: [[LOOP20]] = distinct !{[[LOOP20]], [[META1]], [[META2]]}2167; IF-EVL: [[LOOP21]] = distinct !{[[LOOP21]], [[META1]]}2168; IF-EVL: [[LOOP22]] = distinct !{[[LOOP22]], [[META1]], [[META2]]}2169; IF-EVL: [[LOOP23]] = distinct !{[[LOOP23]], [[META1]]}2170; IF-EVL: [[LOOP24]] = distinct !{[[LOOP24]], [[META1]], [[META2]]}2171; IF-EVL: [[LOOP25]] = distinct !{[[LOOP25]], [[META1]]}2172; IF-EVL: [[LOOP26]] = distinct !{[[LOOP26]], [[META1]], [[META2]]}2173; IF-EVL: [[LOOP27]] = distinct !{[[LOOP27]], [[META1]]}2174; IF-EVL: [[LOOP28]] = distinct !{[[LOOP28]], [[META1]], [[META2]]}2175; IF-EVL: [[LOOP29]] = distinct !{[[LOOP29]], [[META1]]}2176; IF-EVL: [[LOOP30]] = distinct !{[[LOOP30]], [[META1]], [[META2]]}2177; IF-EVL: [[LOOP31]] = distinct !{[[LOOP31]], [[META1]]}2178; IF-EVL: [[LOOP32]] = distinct !{[[LOOP32]], [[META1]], [[META2]]}2179; IF-EVL: [[LOOP33]] = distinct !{[[LOOP33]], [[META1]]}2180; IF-EVL: [[LOOP34]] = distinct !{[[LOOP34]], [[META1]], [[META2]]}2181; IF-EVL: [[LOOP35]] = distinct !{[[LOOP35]], [[META1]]}2182; IF-EVL: [[LOOP36]] = distinct !{[[LOOP36]], [[META1]], [[META2]]}2183; IF-EVL: [[LOOP37]] = distinct !{[[LOOP37]], [[META1]]}2184;.2185; NO-VP: [[LOOP0]] = distinct !{[[LOOP0]], [[META1:![0-9]+]], [[META2:![0-9]+]]}2186; NO-VP: [[META1]] = !{!"llvm.loop.isvectorized", i32 1}2187; NO-VP: [[META2]] = !{!"llvm.loop.unroll.runtime.disable"}2188; NO-VP: [[LOOP3]] = distinct !{[[LOOP3]], [[META1]]}2189; NO-VP: [[LOOP4]] = distinct !{[[LOOP4]], [[META1]], [[META2]]}2190; NO-VP: [[LOOP5]] = distinct !{[[LOOP5]], [[META1]]}2191; NO-VP: [[LOOP6]] = distinct !{[[LOOP6]], [[META1]], [[META2]]}2192; NO-VP: [[LOOP7]] = distinct !{[[LOOP7]], [[META1]]}2193; NO-VP: [[LOOP8]] = distinct !{[[LOOP8]], [[META1]], [[META2]]}2194; NO-VP: [[LOOP9]] = distinct !{[[LOOP9]], [[META1]]}2195; NO-VP: [[LOOP10]] = distinct !{[[LOOP10]], [[META1]], [[META2]]}2196; NO-VP: [[LOOP11]] = distinct !{[[LOOP11]], [[META1]]}2197; NO-VP: [[LOOP12]] = distinct !{[[LOOP12]], [[META1]], [[META2]]}2198; NO-VP: [[LOOP13]] = distinct !{[[LOOP13]], [[META1]]}2199; NO-VP: [[LOOP14]] = distinct !{[[LOOP14]], [[META1]], [[META2]]}2200; NO-VP: [[LOOP15]] = distinct !{[[LOOP15]], [[META1]]}2201; NO-VP: [[LOOP16]] = distinct !{[[LOOP16]], [[META1]], [[META2]]}2202; NO-VP: [[LOOP17]] = distinct !{[[LOOP17]], [[META1]]}2203; NO-VP: [[LOOP18]] = distinct !{[[LOOP18]], [[META1]], [[META2]]}2204; NO-VP: [[LOOP19]] = distinct !{[[LOOP19]], [[META1]]}2205; NO-VP: [[LOOP20]] = distinct !{[[LOOP20]], [[META1]], [[META2]]}2206; NO-VP: [[LOOP21]] = distinct !{[[LOOP21]], [[META1]]}2207; NO-VP: [[LOOP22]] = distinct !{[[LOOP22]], [[META1]], [[META2]]}2208; NO-VP: [[LOOP23]] = distinct !{[[LOOP23]], [[META1]]}2209; NO-VP: [[LOOP24]] = distinct !{[[LOOP24]], [[META1]], [[META2]]}2210; NO-VP: [[LOOP25]] = distinct !{[[LOOP25]], [[META1]]}2211; NO-VP: [[LOOP26]] = distinct !{[[LOOP26]], [[META1]], [[META2]]}2212; NO-VP: [[LOOP27]] = distinct !{[[LOOP27]], [[META1]]}2213; NO-VP: [[LOOP28]] = distinct !{[[LOOP28]], [[META1]], [[META2]]}2214; NO-VP: [[LOOP29]] = distinct !{[[LOOP29]], [[META1]]}2215; NO-VP: [[LOOP30]] = distinct !{[[LOOP30]], [[META1]], [[META2]]}2216; NO-VP: [[LOOP31]] = distinct !{[[LOOP31]], [[META1]]}2217; NO-VP: [[LOOP32]] = distinct !{[[LOOP32]], [[META1]], [[META2]]}2218; NO-VP: [[LOOP33]] = distinct !{[[LOOP33]], [[META1]]}2219; NO-VP: [[LOOP34]] = distinct !{[[LOOP34]], [[META1]], [[META2]]}2220; NO-VP: [[LOOP35]] = distinct !{[[LOOP35]], [[META1]]}2221; NO-VP: [[LOOP36]] = distinct !{[[LOOP36]], [[META1]], [[META2]]}2222; NO-VP: [[LOOP37]] = distinct !{[[LOOP37]], [[META1]]}2223;.2224