brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.0 KiB · e9dcf8f Raw
111 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; 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 10define void @masked_loadstore(ptr noalias %a, ptr noalias %b, i64 %n) {11; IF-EVL-LABEL: @masked_loadstore(12; IF-EVL-NEXT:  entry:13; IF-EVL-NEXT:    br label [[VECTOR_PH:%.*]]14; IF-EVL:       vector.ph:15; IF-EVL-NEXT:    br label [[VECTOR_BODY:%.*]]16; IF-EVL:       vector.body:17; IF-EVL-NEXT:    [[EVL_BASED_IV:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_EVL_NEXT:%.*]], [[VECTOR_BODY]] ]18; IF-EVL-NEXT:    [[TMP9:%.*]] = phi i64 [ [[N:%.*]], [[VECTOR_PH]] ], [ [[AVL_NEXT:%.*]], [[VECTOR_BODY]] ]19; IF-EVL-NEXT:    [[TMP10:%.*]] = call i32 @llvm.experimental.get.vector.length.i64(i64 [[TMP9]], i32 4, i1 true)20; IF-EVL-NEXT:    [[TMP15:%.*]] = getelementptr inbounds i32, ptr [[B:%.*]], i64 [[EVL_BASED_IV]]21; IF-EVL-NEXT:    [[VP_OP_LOAD:%.*]] = call <vscale x 4 x i32> @llvm.vp.load.nxv4i32.p0(ptr align 4 [[TMP15]], <vscale x 4 x i1> splat (i1 true), i32 [[TMP10]])22; IF-EVL-NEXT:    [[TMP17:%.*]] = icmp ne <vscale x 4 x i32> [[VP_OP_LOAD]], zeroinitializer23; IF-EVL-NEXT:    [[TMP19:%.*]] = getelementptr i32, ptr [[A:%.*]], i64 [[EVL_BASED_IV]]24; IF-EVL-NEXT:    [[VP_OP_LOAD3:%.*]] = call <vscale x 4 x i32> @llvm.vp.load.nxv4i32.p0(ptr align 4 [[TMP19]], <vscale x 4 x i1> [[TMP17]], i32 [[TMP10]])25; IF-EVL-NEXT:    [[VP_OP:%.*]] = add <vscale x 4 x i32> [[VP_OP_LOAD]], [[VP_OP_LOAD3]]26; IF-EVL-NEXT:    call void @llvm.vp.store.nxv4i32.p0(<vscale x 4 x i32> [[VP_OP]], ptr align 4 [[TMP19]], <vscale x 4 x i1> [[TMP17]], i32 [[TMP10]])27; IF-EVL-NEXT:    [[TMP21:%.*]] = zext i32 [[TMP10]] to i6428; IF-EVL-NEXT:    [[INDEX_EVL_NEXT]] = add i64 [[TMP21]], [[EVL_BASED_IV]]29; IF-EVL-NEXT:    [[AVL_NEXT]] = sub nuw i64 [[TMP9]], [[TMP21]]30; IF-EVL-NEXT:    [[TMP11:%.*]] = icmp eq i64 [[AVL_NEXT]], 031; IF-EVL-NEXT:    br i1 [[TMP11]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]32; IF-EVL:       middle.block:33; IF-EVL-NEXT:    br label [[FOR_INC:%.*]]34; IF-EVL:       exit:35; IF-EVL-NEXT:    ret void36;37; NO-VP-LABEL: @masked_loadstore(38; NO-VP-NEXT:  entry:39; NO-VP-NEXT:    [[TMP11:%.*]] = call i64 @llvm.vscale.i64()40; NO-VP-NEXT:    [[TMP12:%.*]] = shl nuw i64 [[TMP11]], 241; NO-VP-NEXT:    [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[N:%.*]], [[TMP12]]42; NO-VP-NEXT:    br i1 [[MIN_ITERS_CHECK]], label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]]43; NO-VP:       vector.ph:44; NO-VP-NEXT:    [[TMP2:%.*]] = call i64 @llvm.vscale.i64()45; NO-VP-NEXT:    [[TMP3:%.*]] = mul nuw i64 [[TMP2]], 446; NO-VP-NEXT:    [[N_MOD_VF:%.*]] = urem i64 [[N]], [[TMP3]]47; NO-VP-NEXT:    [[INC:%.*]] = sub i64 [[N]], [[N_MOD_VF]]48; NO-VP-NEXT:    br label [[FOR_BODY:%.*]]49; NO-VP:       vector.body:50; NO-VP-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[FOR_BODY]] ]51; NO-VP-NEXT:    [[TMP6:%.*]] = getelementptr inbounds i32, ptr [[B:%.*]], i64 [[INDEX]]52; NO-VP-NEXT:    [[WIDE_LOAD:%.*]] = load <vscale x 4 x i32>, ptr [[TMP6]], align 453; NO-VP-NEXT:    [[TMP7:%.*]] = icmp ne <vscale x 4 x i32> [[WIDE_LOAD]], zeroinitializer54; NO-VP-NEXT:    [[TMP8:%.*]] = getelementptr i32, ptr [[A:%.*]], i64 [[INDEX]]55; NO-VP-NEXT:    [[WIDE_MASKED_LOAD:%.*]] = call <vscale x 4 x i32> @llvm.masked.load.nxv4i32.p0(ptr align 4 [[TMP8]], <vscale x 4 x i1> [[TMP7]], <vscale x 4 x i32> poison)56; NO-VP-NEXT:    [[TMP9:%.*]] = add <vscale x 4 x i32> [[WIDE_LOAD]], [[WIDE_MASKED_LOAD]]57; NO-VP-NEXT:    call void @llvm.masked.store.nxv4i32.p0(<vscale x 4 x i32> [[TMP9]], ptr align 4 [[TMP8]], <vscale x 4 x i1> [[TMP7]])58; NO-VP-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], [[TMP3]]59; NO-VP-NEXT:    [[TMP10:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[INC]]60; NO-VP-NEXT:    br i1 [[TMP10]], label [[FOR_INC:%.*]], label [[FOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]61; NO-VP:       middle.block:62; NO-VP-NEXT:    [[CMP_N:%.*]] = icmp eq i64 [[N]], [[INC]]63; NO-VP-NEXT:    br i1 [[CMP_N]], label [[EXIT:%.*]], label [[SCALAR_PH]]64; NO-VP:       scalar.ph:65; NO-VP-NEXT:    [[I_011:%.*]] = phi i64 [ [[INC]], [[FOR_INC]] ], [ 0, [[ENTRY:%.*]] ]66; NO-VP-NEXT:    br label [[FOR_BODY1:%.*]]67; NO-VP:       for.body:68; NO-VP-NEXT:    [[I_11:%.*]] = phi i64 [ [[INC1:%.*]], [[FOR_INC1:%.*]] ], [ [[I_011]], [[SCALAR_PH]] ]69; NO-VP-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[I_11]]70; NO-VP-NEXT:    [[TMP0:%.*]] = load i32, ptr [[ARRAYIDX]], align 471; NO-VP-NEXT:    [[CMP1:%.*]] = icmp ne i32 [[TMP0]], 072; NO-VP-NEXT:    br i1 [[CMP1]], label [[IF_THEN:%.*]], label [[FOR_INC1]]73; NO-VP:       if.then:74; NO-VP-NEXT:    [[ARRAYIDX3:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[I_11]]75; NO-VP-NEXT:    [[TMP1:%.*]] = load i32, ptr [[ARRAYIDX3]], align 476; NO-VP-NEXT:    [[ADD:%.*]] = add i32 [[TMP0]], [[TMP1]]77; NO-VP-NEXT:    store i32 [[ADD]], ptr [[ARRAYIDX3]], align 478; NO-VP-NEXT:    br label [[FOR_INC1]]79; NO-VP:       for.inc:80; NO-VP-NEXT:    [[INC1]] = add nuw nsw i64 [[I_11]], 181; NO-VP-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i64 [[INC1]], [[N]]82; NO-VP-NEXT:    br i1 [[EXITCOND_NOT]], label [[EXIT]], label [[FOR_BODY1]], !llvm.loop [[LOOP3:![0-9]+]]83; NO-VP:       exit:84; NO-VP-NEXT:    ret void85;86entry:87  br label %for.body88 89for.body:90  %i.011 = phi i64 [ %inc, %for.inc ], [ 0, %entry ]91  %arrayidx = getelementptr inbounds i32, ptr %b, i64 %i.01192  %0 = load i32, ptr %arrayidx, align 493  %cmp1 = icmp ne i32 %0, 094  br i1 %cmp1, label %if.then, label %for.inc95 96if.then:97  %arrayidx3 = getelementptr inbounds i32, ptr %a, i64 %i.01198  %1 = load i32, ptr %arrayidx3, align 499  %add = add i32 %0, %1100  store i32 %add, ptr %arrayidx3, align 4101  br label %for.inc102 103for.inc:104  %inc = add nuw nsw i64 %i.011, 1105  %exitcond.not = icmp eq i64 %inc, %n106  br i1 %exitcond.not, label %exit, label %for.body107 108exit:109  ret void110}111