mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-17 08:06:40 +00:00
[VPlan] Add VF as operand to VPScalarIVStepsRecipe.
Similarly to other recipes, update VPScalarIVStepsRecipe to also take the runtime VF as argument. This removes some unnecessary runtime VF computations for scalable vectors. It will also allow dropping the UF == 1 restriction for narrowing interleave groups required in 577631f0a528.
This commit is contained in:
parent
3026fa0eb6
commit
783a846507
@ -262,9 +262,10 @@ public:
|
||||
|
||||
VPScalarIVStepsRecipe *
|
||||
createScalarIVSteps(Instruction::BinaryOps InductionOpcode,
|
||||
FPMathOperator *FPBinOp, VPValue *IV, VPValue *Step) {
|
||||
FPMathOperator *FPBinOp, VPValue *IV, VPValue *Step,
|
||||
VPValue *VF) {
|
||||
return tryInsertInstruction(new VPScalarIVStepsRecipe(
|
||||
IV, Step, InductionOpcode,
|
||||
IV, Step, VF, InductionOpcode,
|
||||
FPBinOp ? FPBinOp->getFastMathFlags() : FastMathFlags()));
|
||||
}
|
||||
|
||||
|
@ -3069,20 +3069,20 @@ public:
|
||||
/// A recipe for handling phi nodes of integer and floating-point inductions,
|
||||
/// producing their scalar values.
|
||||
class VPScalarIVStepsRecipe : public VPRecipeWithIRFlags,
|
||||
public VPUnrollPartAccessor<2> {
|
||||
public VPUnrollPartAccessor<3> {
|
||||
Instruction::BinaryOps InductionOpcode;
|
||||
|
||||
public:
|
||||
VPScalarIVStepsRecipe(VPValue *IV, VPValue *Step,
|
||||
VPScalarIVStepsRecipe(VPValue *IV, VPValue *Step, VPValue *VF,
|
||||
Instruction::BinaryOps Opcode, FastMathFlags FMFs)
|
||||
: VPRecipeWithIRFlags(VPDef::VPScalarIVStepsSC,
|
||||
ArrayRef<VPValue *>({IV, Step}), FMFs),
|
||||
ArrayRef<VPValue *>({IV, Step, VF}), FMFs),
|
||||
InductionOpcode(Opcode) {}
|
||||
|
||||
VPScalarIVStepsRecipe(const InductionDescriptor &IndDesc, VPValue *IV,
|
||||
VPValue *Step)
|
||||
VPValue *Step, VPValue *VF)
|
||||
: VPScalarIVStepsRecipe(
|
||||
IV, Step, IndDesc.getInductionOpcode(),
|
||||
IV, Step, VF, IndDesc.getInductionOpcode(),
|
||||
dyn_cast_or_null<FPMathOperator>(IndDesc.getInductionBinOp())
|
||||
? IndDesc.getInductionBinOp()->getFastMathFlags()
|
||||
: FastMathFlags()) {}
|
||||
@ -3091,7 +3091,7 @@ public:
|
||||
|
||||
VPScalarIVStepsRecipe *clone() override {
|
||||
return new VPScalarIVStepsRecipe(
|
||||
getOperand(0), getOperand(1), InductionOpcode,
|
||||
getOperand(0), getOperand(1), getOperand(2), InductionOpcode,
|
||||
hasFastMathFlags() ? getFastMathFlags() : FastMathFlags());
|
||||
}
|
||||
|
||||
|
@ -2071,8 +2071,18 @@ void VPScalarIVStepsRecipe::execute(VPTransformState &State) {
|
||||
StartLane = State.Lane->getKnownLane();
|
||||
EndLane = StartLane + 1;
|
||||
}
|
||||
Value *StartIdx0 =
|
||||
createStepForVF(Builder, IntStepTy, State.VF, getUnrollPart(*this));
|
||||
Value *StartIdx0;
|
||||
if (getUnrollPart(*this) == 0)
|
||||
StartIdx0 = ConstantInt::get(IntStepTy, 0);
|
||||
else {
|
||||
StartIdx0 = State.get(getOperand(2), true);
|
||||
if (getUnrollPart(*this) != 1) {
|
||||
StartIdx0 =
|
||||
Builder.CreateMul(StartIdx0, ConstantInt::get(StartIdx0->getType(),
|
||||
getUnrollPart(*this)));
|
||||
}
|
||||
StartIdx0 = Builder.CreateTrunc(StartIdx0, IntStepTy);
|
||||
}
|
||||
|
||||
if (!FirstLaneOnly && State.VF.isScalable()) {
|
||||
auto *SplatStartIdx = Builder.CreateVectorSplat(State.VF, StartIdx0);
|
||||
|
@ -575,7 +575,8 @@ createScalarIVSteps(VPlan &Plan, InductionDescriptor::InductionKind Kind,
|
||||
Builder.setInsertPoint(VecPreheader);
|
||||
Step = Builder.createScalarCast(Instruction::Trunc, Step, ResultTy, DL);
|
||||
}
|
||||
return Builder.createScalarIVSteps(InductionOpcode, FPBinOp, BaseIV, Step);
|
||||
return Builder.createScalarIVSteps(InductionOpcode, FPBinOp, BaseIV, Step,
|
||||
&Plan.getVF());
|
||||
}
|
||||
|
||||
static SmallVector<VPUser *> collectUsersRecursively(VPValue *V) {
|
||||
|
@ -299,10 +299,9 @@ define void @gather_nxv4i32_ind64_stride2(ptr noalias nocapture %a, ptr noalias
|
||||
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
|
||||
; CHECK: vector.body:
|
||||
; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
|
||||
; CHECK-NEXT: [[TMP9:%.*]] = call i64 @llvm.vscale.i64()
|
||||
; CHECK-NEXT: [[DOTIDX1:%.*]] = shl i64 [[INDEX]], 3
|
||||
; CHECK-NEXT: [[TMP10:%.*]] = getelementptr inbounds i8, ptr [[B:%.*]], i64 [[DOTIDX1]]
|
||||
; CHECK-NEXT: [[DOTIDX3:%.*]] = shl nuw nsw i64 [[TMP9]], 5
|
||||
; CHECK-NEXT: [[DOTIDX3:%.*]] = shl nuw nsw i64 [[TMP3]], 5
|
||||
; CHECK-NEXT: [[TMP11:%.*]] = getelementptr i8, ptr [[B]], i64 [[DOTIDX3]]
|
||||
; CHECK-NEXT: [[DOTIDX4:%.*]] = shl i64 [[INDEX]], 3
|
||||
; CHECK-NEXT: [[TMP15:%.*]] = getelementptr i8, ptr [[TMP11]], i64 [[DOTIDX4]]
|
||||
|
@ -10,6 +10,7 @@ target triple = "aarch64-unknown-linux-gnu"
|
||||
|
||||
; VPLANS-LABEL: Checking a loop in 'simple_memset'
|
||||
; VPLANS: VPlan 'Initial VPlan for VF={vscale x 1,vscale x 2,vscale x 4},UF>=1' {
|
||||
; VPLANS-NEXT: Live-in vp<[[VF:%.+]]> = VF
|
||||
; VPLANS-NEXT: Live-in vp<[[VFxUF:%.+]]> = VF * UF
|
||||
; VPLANS: vp<[[TC:%[0-9]+]]> = original trip-count
|
||||
; VPLANS-EMPTY:
|
||||
@ -19,15 +20,15 @@ target triple = "aarch64-unknown-linux-gnu"
|
||||
; VPLANS-EMPTY:
|
||||
; VPLANS-NEXT: vector.ph:
|
||||
; VPLANS-NEXT: EMIT vp<[[NEWTC:%[0-9]+]]> = TC > VF ? TC - VF : 0 vp<[[TC]]>
|
||||
; VPLANS-NEXT: EMIT vp<[[VF:%.+]]> = VF * Part + ir<0>
|
||||
; VPLANS-NEXT: EMIT vp<[[LANEMASK_ENTRY:%.+]]> = active lane mask vp<[[VF]]>, vp<[[TC]]>
|
||||
; VPLANS-NEXT: EMIT vp<[[VF_PER_PART:%.+]]> = VF * Part + ir<0>
|
||||
; VPLANS-NEXT: EMIT vp<[[LANEMASK_ENTRY:%.+]]> = active lane mask vp<[[VF_PER_PART]]>, vp<[[TC]]>
|
||||
; VPLANS-NEXT: Successor(s): vector loop
|
||||
; VPLANS-EMPTY:
|
||||
; VPLANS-NEXT: <x1> vector loop: {
|
||||
; VPLANS-NEXT: vector.body:
|
||||
; VPLANS-NEXT: EMIT vp<[[INDV:%[0-9]+]]> = CANONICAL-INDUCTION
|
||||
; VPLANS-NEXT: ACTIVE-LANE-MASK-PHI vp<[[LANEMASK_PHI:%[0-9]+]]> = phi vp<[[LANEMASK_ENTRY]]>, vp<[[LANEMASK_LOOP:%.+]]>
|
||||
; VPLANS-NEXT: vp<[[STEP:%[0-9]+]]> = SCALAR-STEPS vp<[[INDV]]>, ir<1>
|
||||
; VPLANS-NEXT: vp<[[STEP:%[0-9]+]]> = SCALAR-STEPS vp<[[INDV]]>, ir<1>, vp<[[VF]]>
|
||||
; VPLANS-NEXT: CLONE ir<%gep> = getelementptr ir<%ptr>, vp<[[STEP]]>
|
||||
; VPLANS-NEXT: vp<[[VEC_PTR:%[0-9]+]]> = vector-pointer ir<%gep>
|
||||
; VPLANS-NEXT: WIDEN store vp<[[VEC_PTR]]>, ir<%val>, vp<[[LANEMASK_PHI]]>
|
||||
|
@ -9,6 +9,7 @@ target triple = "aarch64-unknown-linux-gnu"
|
||||
; CHECK-NOT: LV: Found {{.*}} scalar instruction: %ptr.iv.2.next = getelementptr inbounds i8, ptr %ptr.iv.2, i64 1
|
||||
;
|
||||
; CHECK: VPlan 'Initial VPlan for VF={vscale x 2},UF>=1' {
|
||||
; CHECK-NEXT: Live-in vp<[[VF:%.+]]> = VF
|
||||
; CHECK-NEXT: Live-in vp<[[VFxUF:%.+]]> = VF * UF
|
||||
; CHECK-NEXT: Live-in vp<[[VEC_TC:%.+]]> = vector-trip-count
|
||||
; CHECK-NEXT: Live-in ir<%N> = original trip-count
|
||||
@ -26,7 +27,7 @@ target triple = "aarch64-unknown-linux-gnu"
|
||||
; CHECK-NEXT: EMIT vp<[[CAN_IV:%.+]]> = CANONICAL-INDUCTION
|
||||
; CHECK-NEXT: EMIT ir<%ptr.iv.2> = WIDEN-POINTER-INDUCTION ir<%start.2>, ir<1>
|
||||
; CHECK-NEXT: vp<[[PTR_IDX:%.+]]> = DERIVED-IV ir<0> + vp<[[CAN_IV]]> * ir<8>
|
||||
; CHECK-NEXT: vp<[[PTR_IDX_STEPS:%.+]]> = SCALAR-STEPS vp<[[PTR_IDX]]>, ir<8>
|
||||
; CHECK-NEXT: vp<[[PTR_IDX_STEPS:%.+]]> = SCALAR-STEPS vp<[[PTR_IDX]]>, ir<8>, vp<[[VF]]>
|
||||
; CHECK-NEXT: EMIT vp<[[PTR_IV_1:%.+]]> = ptradd ir<%start.1>, vp<[[PTR_IDX_STEPS]]>
|
||||
; CHECK-NEXT: WIDEN-GEP Var[Inv] ir<%ptr.iv.2.next> = getelementptr inbounds ir<%ptr.iv.2>, ir<1>
|
||||
; CHECK-NEXT: vp<[[VEC_PTR:%.+]]> = vector-pointer vp<[[PTR_IV_1]]>
|
||||
|
@ -33,8 +33,7 @@ define void @widen_ptr_phi_unrolled(ptr noalias nocapture %a, ptr noalias nocapt
|
||||
; CHECK: vector.body:
|
||||
; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
|
||||
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = shl i64 [[INDEX]], 3
|
||||
; CHECK-NEXT: [[TMP6:%.*]] = call i64 @llvm.vscale.i64()
|
||||
; CHECK-NEXT: [[TMP7:%.*]] = shl nuw nsw i64 [[TMP6]], 5
|
||||
; CHECK-NEXT: [[TMP7:%.*]] = shl nuw nsw i64 [[TMP4]], 5
|
||||
; CHECK-NEXT: [[NEXT_GEP:%.*]] = getelementptr i8, ptr [[C]], i64 [[OFFSET_IDX]]
|
||||
; CHECK-NEXT: [[TMP8:%.*]] = getelementptr i8, ptr [[C]], i64 [[OFFSET_IDX]]
|
||||
; CHECK-NEXT: [[NEXT_GEP2:%.*]] = getelementptr i8, ptr [[TMP8]], i64 [[TMP7]]
|
||||
|
@ -12,6 +12,7 @@ target triple = "aarch64-unknown-linux-gnu"
|
||||
|
||||
;; Check that the scalar plan contains the original instructions.
|
||||
; CHECK: VPlan 'Initial VPlan for VF={1},UF>=1' {
|
||||
; CHECK-NEXT: Live-in [[VF:.*]] = VF
|
||||
; CHECK-NEXT: Live-in [[VFxUF:.*]] = VF * UF
|
||||
; CHECK-NEXT: Live-in [[VTC:.*]] = vector-trip-count
|
||||
; CHECK-NEXT: Live-in [[OTC:.*]] = original trip-count
|
||||
@ -25,7 +26,7 @@ target triple = "aarch64-unknown-linux-gnu"
|
||||
; CHECK-NEXT: <x1> vector loop: {
|
||||
; CHECK-NEXT: vector.body:
|
||||
; CHECK-NEXT: EMIT [[IV:.*]] = CANONICAL-INDUCTION ir<0>, [[IV_NEXT:.*]]
|
||||
; CHECK-NEXT: [[STEPS:vp.*]] = SCALAR-STEPS [[IV]], ir<1>
|
||||
; CHECK-NEXT: [[STEPS:vp.*]] = SCALAR-STEPS [[IV]], ir<1>, [[VF]]
|
||||
; CHECK-NEXT: CLONE [[GEP_IDX:.*]] = getelementptr inbounds ir<%indices>, [[STEPS]]
|
||||
; CHECK-NEXT: CLONE [[IDX:.*]] = load [[GEP_IDX]]
|
||||
; CHECK-NEXT: CLONE [[EXT_IDX:.*]] = zext [[IDX]]
|
||||
@ -59,6 +60,7 @@ target triple = "aarch64-unknown-linux-gnu"
|
||||
|
||||
;; Check that the vectorized plan contains a histogram recipe instead.
|
||||
; CHECK: VPlan 'Initial VPlan for VF={vscale x 2,vscale x 4},UF>=1' {
|
||||
; CHECK-NEXT: Live-in [[VF:.*]] = VF
|
||||
; CHECK-NEXT: Live-in [[VFxUF:.*]] = VF * UF
|
||||
; CHECK-NEXT: Live-in [[VTC:.*]] = vector-trip-count
|
||||
; CHECK-NEXT: Live-in [[OTC:.*]] = original trip-count
|
||||
@ -72,7 +74,7 @@ target triple = "aarch64-unknown-linux-gnu"
|
||||
; CHECK-NEXT: <x1> vector loop: {
|
||||
; CHECK-NEXT: vector.body:
|
||||
; CHECK-NEXT: EMIT [[IV:.*]] = CANONICAL-INDUCTION ir<0>, [[IV_NEXT:.*]]
|
||||
; CHECK-NEXT: [[STEPS:vp.*]] = SCALAR-STEPS [[IV]], ir<1>
|
||||
; CHECK-NEXT: [[STEPS:vp.*]] = SCALAR-STEPS [[IV]], ir<1>, [[VF]]
|
||||
; CHECK-NEXT: CLONE [[GEP_IDX:.*]] = getelementptr inbounds ir<%indices>, [[STEPS]]
|
||||
; CHECK-NEXT: [[VECP_IDX:vp.*]] = vector-pointer [[GEP_IDX]]
|
||||
; CHECK-NEXT: WIDEN [[IDX:.*]] = load [[VECP_IDX]]
|
||||
|
@ -10,6 +10,7 @@ target triple = "aarch64-unknown-linux-gnu"
|
||||
|
||||
; CHECK-LABEL: LV: Checking a loop in 'test_v4_v4m'
|
||||
; CHECK: VPlan 'Initial VPlan for VF={2},UF>=1' {
|
||||
; CHECK-NEXT: Live-in vp<[[VF:%.+]]> = VF
|
||||
; CHECK-NEXT: Live-in vp<[[VFxUF:%.+]]> = VF * UF
|
||||
; CHECK-NEXT: Live-in vp<[[VTC:%.+]]> = vector-trip-count
|
||||
; CHECK-NEXT: Live-in ir<1024> = original trip-count
|
||||
@ -23,7 +24,7 @@ target triple = "aarch64-unknown-linux-gnu"
|
||||
; CHECK-NEXT: <x1> vector loop: {
|
||||
; CHECK-NEXT: vector.body:
|
||||
; CHECK-NEXT: EMIT vp<[[CAN_IV:%.+]]> = CANONICAL-INDUCTION
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>, vp<[[VF]]>
|
||||
; CHECK-NEXT: CLONE ir<%gep> = getelementptr ir<%b>, vp<[[STEPS]]>
|
||||
; CHECK-NEXT: vp<[[VEC_PTR:%.+]]> = vector-pointer ir<%gep>
|
||||
; CHECK-NEXT: WIDEN ir<%load> = load vp<[[VEC_PTR]]>
|
||||
@ -56,6 +57,7 @@ target triple = "aarch64-unknown-linux-gnu"
|
||||
; CHECK-NEXT: }
|
||||
|
||||
; CHECK: VPlan 'Initial VPlan for VF={4},UF>=1' {
|
||||
; CHECK-NEXT: Live-in vp<[[VF:%.+]]> = VF
|
||||
; CHECK-NEXT: Live-in vp<[[VFxUF:%.+]]> = VF * UF
|
||||
; CHECK-NEXT: Live-in vp<[[VTC:%.+]]> = vector-trip-count
|
||||
; CHECK-NEXT: Live-in ir<1024> = original trip-count
|
||||
@ -69,7 +71,7 @@ target triple = "aarch64-unknown-linux-gnu"
|
||||
; CHECK-NEXT: <x1> vector loop: {
|
||||
; CHECK-NEXT: vector.body:
|
||||
; CHECK-NEXT: EMIT vp<[[CAN_IV:%.+]]> = CANONICAL-INDUCTION
|
||||
; CHECK-NEXT: vp<[[STEPS]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>
|
||||
; CHECK-NEXT: vp<[[STEPS]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>, vp<[[VF]]>
|
||||
; CHECK-NEXT: CLONE ir<%gep> = getelementptr ir<%b>, vp<[[STEPS]]>
|
||||
; CHECK-NEXT: vp<[[VEC_PTR:%.+]]> = vector-pointer ir<%gep>
|
||||
; CHECK-NEXT: WIDEN ir<%load> = load vp<[[VEC_PTR]]>
|
||||
@ -107,6 +109,7 @@ target triple = "aarch64-unknown-linux-gnu"
|
||||
|
||||
; CHECK-LABEL: LV: Checking a loop in 'test_v2_v4m'
|
||||
; CHECK: VPlan 'Initial VPlan for VF={2},UF>=1' {
|
||||
; CHECK-NEXT: Live-in vp<[[VFxUF:%.+]]> = VF
|
||||
; CHECK-NEXT: Live-in vp<[[VFxUF:%.+]]> = VF * UF
|
||||
; CHECK-NEXT: Live-in vp<[[VTC:%.+]]> = vector-trip-count
|
||||
; CHECK-NEXT: Live-in ir<1024> = original trip-count
|
||||
@ -120,7 +123,7 @@ target triple = "aarch64-unknown-linux-gnu"
|
||||
; CHECK-NEXT: <x1> vector loop: {
|
||||
; CHECK-NEXT: vector.body:
|
||||
; CHECK-NEXT: EMIT vp<[[CAN_IV:%.+]]> = CANONICAL-INDUCTION
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>, vp<[[VF]]>
|
||||
; CHECK-NEXT: CLONE ir<%gep> = getelementptr ir<%b>, vp<[[STEPS]]>
|
||||
; CHECK-NEXT: vp<[[VEC_PTR:%.+]]> = vector-pointer ir<%gep>
|
||||
; CHECK-NEXT: WIDEN ir<%load> = load vp<[[VEC_PTR]]>
|
||||
@ -153,6 +156,7 @@ target triple = "aarch64-unknown-linux-gnu"
|
||||
; CHECK-NEXT: }
|
||||
|
||||
; CHECK: VPlan 'Initial VPlan for VF={4},UF>=1' {
|
||||
; CHECK-NEXT: Live-in vp<[[VFxUF:%.+]]> = VF
|
||||
; CHECK-NEXT: Live-in vp<[[VFxUF:%.+]]> = VF * UF
|
||||
; CHECK-NEXT: Live-in vp<[[VTC:%.+]]> = vector-trip-count
|
||||
; CHECK-NEXT: Live-in ir<1024> = original trip-count
|
||||
@ -166,7 +170,7 @@ target triple = "aarch64-unknown-linux-gnu"
|
||||
; CHECK-NEXT: <x1> vector loop: {
|
||||
; CHECK-NEXT: vector.body:
|
||||
; CHECK-NEXT: EMIT vp<[[CAN_IV:%.+]]> = CANONICAL-INDUCTION
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>, vp<[[VF]]>
|
||||
; CHECK-NEXT: CLONE ir<%gep> = getelementptr ir<%b>, vp<[[STEPS]]>
|
||||
; CHECK-NEXT: vp<[[VEC_PTR:%.+]]> = vector-pointer ir<%gep>
|
||||
; CHECK-NEXT: WIDEN ir<%load> = load vp<[[VEC_PTR]]>
|
||||
@ -203,6 +207,7 @@ target triple = "aarch64-unknown-linux-gnu"
|
||||
|
||||
; CHECK-LABEL: LV: Checking a loop in 'test_v2_v4'
|
||||
; CHECK: VPlan 'Initial VPlan for VF={2},UF>=1' {
|
||||
; CHECK-NEXT: Live-in vp<[[VFxUF:%.+]]> = VF
|
||||
; CHECK-NEXT: Live-in vp<[[VFxUF:%.+]]> = VF * UF
|
||||
; CHECK-NEXT: Live-in vp<[[VTC:%.+]]> = vector-trip-count
|
||||
; CHECK-NEXT: Live-in ir<1024> = original trip-count
|
||||
@ -216,7 +221,7 @@ target triple = "aarch64-unknown-linux-gnu"
|
||||
; CHECK-NEXT: <x1> vector loop: {
|
||||
; CHECK-NEXT: vector.body:
|
||||
; CHECK-NEXT: EMIT vp<[[CAN_IV:%.+]]> = CANONICAL-INDUCTION
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>, vp<[[VF]]>
|
||||
; CHECK-NEXT: CLONE ir<%gep> = getelementptr ir<%b>, vp<[[STEPS]]>
|
||||
; CHECK-NEXT: vp<[[VEC_PTR:%.+]]> = vector-pointer ir<%gep>
|
||||
; CHECK-NEXT: WIDEN ir<%load> = load vp<[[VEC_PTR]]>
|
||||
@ -249,6 +254,7 @@ target triple = "aarch64-unknown-linux-gnu"
|
||||
; CHECK-NEXT: }
|
||||
|
||||
; CHECK: VPlan 'Initial VPlan for VF={4},UF>=1' {
|
||||
; CHECK-NEXT: Live-in vp<[[VF:%.+]]> = VF
|
||||
; CHECK-NEXT: Live-in vp<[[VFxUF:%.+]]> = VF * UF
|
||||
; CHECK-NEXT: Live-in vp<[[VTC:%.+]]> = vector-trip-count
|
||||
; CHECK-NEXT: Live-in ir<1024> = original trip-count
|
||||
@ -262,7 +268,7 @@ target triple = "aarch64-unknown-linux-gnu"
|
||||
; CHECK-NEXT: <x1> vector loop: {
|
||||
; CHECK-NEXT: vector.body:
|
||||
; CHECK-NEXT: EMIT vp<[[CAN_IV:%.+]]> = CANONICAL-INDUCTION
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>, vp<[[VF]]>
|
||||
; CHECK-NEXT: CLONE ir<%gep> = getelementptr ir<%b>, vp<[[STEPS]]>
|
||||
; CHECK-NEXT: vp<[[VEC_PTR:%.+]]> = vector-pointer ir<%gep>
|
||||
; CHECK-NEXT: WIDEN ir<%load> = load vp<[[VEC_PTR]]>
|
||||
|
@ -8,6 +8,7 @@ target triple = "aarch64-none-unknown-elf"
|
||||
|
||||
define i32 @print_partial_reduction(ptr %a, ptr %b) {
|
||||
; CHECK: VPlan 'Initial VPlan for VF={8,16},UF>=1' {
|
||||
; CHECK-NEXT: Live-in vp<[[VF:%.]]> = VF
|
||||
; CHECK-NEXT: Live-in vp<[[VFxUF:%.]]> = VF * UF
|
||||
; CHECK-NEXT: Live-in vp<[[VEC_TC:%.+]]> = vector-trip-count
|
||||
; CHECK-NEXT: Live-in ir<1024> = original trip-count
|
||||
@ -22,7 +23,7 @@ define i32 @print_partial_reduction(ptr %a, ptr %b) {
|
||||
; CHECK-NEXT: vector.body:
|
||||
; CHECK-NEXT: EMIT vp<[[CAN_IV:%.+]]> = CANONICAL-INDUCTION ir<0>, vp<[[CAN_IV_NEXT:%.+]]>
|
||||
; CHECK-NEXT: WIDEN-REDUCTION-PHI ir<[[ACC:%.+]]> = phi ir<0>, ir<[[REDUCE:%.+]]> (VF scaled by 1/4)
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>, vp<[[VF]]>
|
||||
; CHECK-NEXT: CLONE ir<%gep.a> = getelementptr ir<%a>, vp<[[STEPS]]>
|
||||
; CHECK-NEXT: vp<[[PTR_A:%.+]]> = vector-pointer ir<%gep.a>
|
||||
; CHECK-NEXT: WIDEN ir<%load.a> = load vp<[[PTR_A]]>
|
||||
@ -42,7 +43,7 @@ define i32 @print_partial_reduction(ptr %a, ptr %b) {
|
||||
; CHECK-NEXT: middle.block:
|
||||
; CHECK-NEXT: EMIT vp<[[RED_RESULT:%.+]]> = compute-reduction-result ir<[[ACC]]>, ir<[[REDUCE]]>
|
||||
; CHECK-NEXT: EMIT vp<[[EXTRACT:%.+]]> = extract-from-end vp<[[RED_RESULT]]>, ir<1>
|
||||
; CHECK-NEXT: EMIT vp<[[CMP:%.+]]> = icmp eq ir<1024>, vp<%1>
|
||||
; CHECK-NEXT: EMIT vp<[[CMP:%.+]]> = icmp eq ir<1024>, vp<[[VEC_TC]]>
|
||||
; CHECK-NEXT: EMIT branch-on-cond vp<[[CMP]]>
|
||||
; CHECK-NEXT: Successor(s): ir-bb<exit>, scalar.ph
|
||||
; CHECK-EMPTY:
|
||||
|
@ -7,6 +7,7 @@ target triple = "arm64-apple-ios"
|
||||
|
||||
; CHECK-LABEL: LV: Checking a loop in 'test'
|
||||
; CHECK: VPlan 'Initial VPlan for VF={2},UF>=1' {
|
||||
; CHECK-NEXT: Live-in vp<[[VF:%.+]]> = VF
|
||||
; CHECK-NEXT: Live-in vp<[[VFxUF:%.+]]> = VF * UF
|
||||
; CHECK-NEXT: Live-in vp<[[VTC:%.+]]> = vector-trip-count
|
||||
|
||||
@ -21,7 +22,7 @@ target triple = "arm64-apple-ios"
|
||||
; CHECK-NEXT: <x1> vector loop: {
|
||||
; CHECK-NEXT: vector.body:
|
||||
; CHECK-NEXT: EMIT vp<[[CAN_IV:%.+]]> = CANONICAL-INDUCTION
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>, vp<[[VF]]>
|
||||
; CHECK-NEXT: CLONE ir<%gep.src> = getelementptr inbounds ir<%src>, vp<[[STEPS]]>
|
||||
; CHECK-NEXT: vp<[[VEC_PTR:%.+]]> = vector-pointer ir<%gep.src>
|
||||
; CHECK-NEXT: WIDEN ir<%l> = load vp<[[VEC_PTR]]>
|
||||
@ -54,6 +55,7 @@ target triple = "arm64-apple-ios"
|
||||
; CHECK-NEXT: }
|
||||
|
||||
; CHECK: VPlan 'Initial VPlan for VF={4},UF>=1' {
|
||||
; CHECK-NEXT: Live-in vp<[[VF:%.+]]> = VF
|
||||
; CHECK-NEXT: Live-in vp<[[VFxUF:%.+]]> = VF * UF
|
||||
; CHECK-NEXT: Live-in vp<[[VTC:%.+]]> = vector-trip-count
|
||||
; CHECK-NEXT: Live-in ir<1024> = original trip-count
|
||||
@ -67,7 +69,7 @@ target triple = "arm64-apple-ios"
|
||||
; CHECK-NEXT: <x1> vector loop: {
|
||||
; CHECK-NEXT: vector.body:
|
||||
; CHECK-NEXT: EMIT vp<[[CAN_IV:%.+]]> = CANONICAL-INDUCTION
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>, vp<[[VF]]>
|
||||
; CHECK-NEXT: CLONE ir<%gep.src> = getelementptr inbounds ir<%src>, vp<[[STEPS]]>
|
||||
; CHECK-NEXT: vp<[[VEC_PTR:%.+]]> = vector-pointer ir<%gep.src>
|
||||
; CHECK-NEXT: WIDEN ir<%l> = load vp<[[VEC_PTR]]>
|
||||
|
@ -76,6 +76,7 @@ for.cond.cleanup:
|
||||
|
||||
define void @safe_dep(ptr %p) {
|
||||
; CHECK-LABEL: VPlan 'Initial VPlan for VF={2},UF>=1' {
|
||||
; CHECK-NEXT: Live-in vp<[[VF:%.+]]> = VF
|
||||
; CHECK-NEXT: Live-in vp<[[VFxUF:%.+]]> = VF * UF
|
||||
; CHECK-NEXT: Live-in vp<[[VTC:%.+]]> = vector-trip-count
|
||||
; CHECK-NEXT: Live-in ir<512> = original trip-count
|
||||
@ -89,7 +90,7 @@ define void @safe_dep(ptr %p) {
|
||||
; CHECK-NEXT: <x1> vector loop: {
|
||||
; CHECK-NEXT: vector.body:
|
||||
; CHECK-NEXT: EMIT vp<[[CAN_IV:%.+]]> = CANONICAL-INDUCTION ir<0>, vp<[[CAN_INC:%.+]]>
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>, vp<[[VF]]>
|
||||
; CHECK-NEXT: CLONE ir<%a1> = getelementptr ir<%p>, vp<[[STEPS]]>
|
||||
; CHECK-NEXT: vp<[[VPTR1:%.+]]> = vector-pointer ir<%a1>
|
||||
; CHECK-NEXT: WIDEN ir<%v> = load vp<[[VPTR1]]>
|
||||
|
@ -96,12 +96,11 @@ define void @interleave(ptr noalias %a, ptr noalias %b, i64 %N) {
|
||||
; NO-VP-NEXT: [[N_MOD_VF:%.*]] = urem i64 [[N]], [[TMP3]]
|
||||
; NO-VP-NEXT: [[N_VEC:%.*]] = sub i64 [[N]], [[N_MOD_VF]]
|
||||
; NO-VP-NEXT: [[TMP4:%.*]] = call i64 @llvm.vscale.i64()
|
||||
; NO-VP-NEXT: [[TMP5:%.*]] = mul i64 [[TMP4]], 8
|
||||
; NO-VP-NEXT: [[TMP8:%.*]] = mul i64 [[TMP4]], 4
|
||||
; NO-VP-NEXT: [[TMP5:%.*]] = mul i64 [[TMP8]], 2
|
||||
; NO-VP-NEXT: br label [[VECTOR_BODY:%.*]]
|
||||
; NO-VP: vector.body:
|
||||
; NO-VP-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
|
||||
; NO-VP-NEXT: [[TMP7:%.*]] = call i64 @llvm.vscale.i64()
|
||||
; NO-VP-NEXT: [[TMP8:%.*]] = mul i64 [[TMP7]], 4
|
||||
; NO-VP-NEXT: [[TMP9:%.*]] = add i64 [[TMP8]], 0
|
||||
; NO-VP-NEXT: [[TMP10:%.*]] = mul i64 [[TMP9]], 1
|
||||
; NO-VP-NEXT: [[TMP11:%.*]] = add i64 [[INDEX]], [[TMP10]]
|
||||
|
@ -10,6 +10,7 @@ define void @vp_smax(ptr %a, ptr %b, ptr %c, i64 %N) {
|
||||
; IF-EVL-NOT: EXPLICIT-VECTOR-LENGTH-BASED-IV-PHI
|
||||
;
|
||||
; IF-EVL: VPlan 'Initial VPlan for VF={vscale x 1,vscale x 2,vscale x 4},UF={1}' {
|
||||
; IF-EVL-NEXT: Live-in vp<[[VF:%[0-9]+]]> = VF
|
||||
; IF-EVL-NEXT: Live-in vp<[[VFUF:%[0-9]+]]> = VF * UF
|
||||
; IF-EVL-NEXT: Live-in vp<[[VTC:%[0-9]+]]> = vector-trip-count
|
||||
; IF-EVL-NEXT: Live-in ir<%N> = original trip-count
|
||||
@ -23,7 +24,7 @@ define void @vp_smax(ptr %a, ptr %b, ptr %c, i64 %N) {
|
||||
; IF-EVL-NEXT: EXPLICIT-VECTOR-LENGTH-BASED-IV-PHI vp<[[EVL_PHI:%[0-9]+]]> = phi ir<0>, vp<[[IV_NEXT:%.+]]>
|
||||
; IF-EVL-NEXT: EMIT vp<[[AVL:%.+]]> = sub ir<%N>, vp<[[EVL_PHI]]>
|
||||
; IF-EVL-NEXT: EMIT vp<[[EVL:%.+]]> = EXPLICIT-VECTOR-LENGTH vp<[[AVL]]>
|
||||
; IF-EVL-NEXT: vp<[[ST:%[0-9]+]]> = SCALAR-STEPS vp<[[EVL_PHI]]>, ir<1>
|
||||
; IF-EVL-NEXT: vp<[[ST:%[0-9]+]]> = SCALAR-STEPS vp<[[EVL_PHI]]>, ir<1>, vp<[[VF]]
|
||||
; IF-EVL-NEXT: CLONE ir<[[GEP1:%.+]]> = getelementptr inbounds ir<%b>, vp<[[ST]]>
|
||||
; IF-EVL-NEXT: vp<[[PTR1:%[0-9]+]]> = vector-pointer ir<[[GEP1]]>
|
||||
; IF-EVL-NEXT: WIDEN ir<[[LD1:%.+]]> = vp.load vp<[[PTR1]]>, vp<[[EVL]]>
|
||||
@ -66,6 +67,7 @@ define void @vp_smin(ptr %a, ptr %b, ptr %c, i64 %N) {
|
||||
; IF-EVL-NOT: EXPLICIT-VECTOR-LENGTH-BASED-IV-PHI
|
||||
;
|
||||
; IF-EVL: VPlan 'Initial VPlan for VF={vscale x 1,vscale x 2,vscale x 4},UF={1}' {
|
||||
; IF-EVL-NEXT: Live-in vp<[[VF:%[0-9]+]]> = VF
|
||||
; IF-EVL-NEXT: Live-in vp<[[VFUF:%[0-9]+]]> = VF * UF
|
||||
; IF-EVL-NEXT: Live-in vp<[[VTC:%[0-9]+]]> = vector-trip-count
|
||||
; IF-EVL-NEXT: Live-in ir<%N> = original trip-count
|
||||
@ -79,7 +81,7 @@ define void @vp_smin(ptr %a, ptr %b, ptr %c, i64 %N) {
|
||||
; IF-EVL-NEXT: EXPLICIT-VECTOR-LENGTH-BASED-IV-PHI vp<[[EVL_PHI:%[0-9]+]]> = phi ir<0>, vp<[[IV_NEXT:%.+]]>
|
||||
; IF-EVL-NEXT: EMIT vp<[[AVL:%.+]]> = sub ir<%N>, vp<[[EVL_PHI]]>
|
||||
; IF-EVL-NEXT: EMIT vp<[[EVL:%.+]]> = EXPLICIT-VECTOR-LENGTH vp<[[AVL]]>
|
||||
; IF-EVL-NEXT: vp<[[ST:%[0-9]+]]> = SCALAR-STEPS vp<[[EVL_PHI]]>, ir<1>
|
||||
; IF-EVL-NEXT: vp<[[ST:%[0-9]+]]> = SCALAR-STEPS vp<[[EVL_PHI]]>, ir<1>, vp<[[VF]]>
|
||||
; IF-EVL-NEXT: CLONE ir<[[GEP1:%.+]]> = getelementptr inbounds ir<%b>, vp<[[ST]]>
|
||||
; IF-EVL-NEXT: vp<[[PTR1:%[0-9]+]]> = vector-pointer ir<[[GEP1]]>
|
||||
; IF-EVL-NEXT: WIDEN ir<[[LD1:%.+]]> = vp.load vp<[[PTR1]]>, vp<[[EVL]]>
|
||||
@ -122,6 +124,7 @@ define void @vp_umax(ptr %a, ptr %b, ptr %c, i64 %N) {
|
||||
; IF-EVL-NOT: EXPLICIT-VECTOR-LENGTH-BASED-IV-PHI
|
||||
;
|
||||
; IF-EVL: VPlan 'Initial VPlan for VF={vscale x 1,vscale x 2,vscale x 4},UF={1}' {
|
||||
; IF-EVL-NEXT: Live-in vp<[[VF:%[0-9]+]]> = VF
|
||||
; IF-EVL-NEXT: Live-in vp<[[VFUF:%[0-9]+]]> = VF * UF
|
||||
; IF-EVL-NEXT: Live-in vp<[[VTC:%[0-9]+]]> = vector-trip-count
|
||||
; IF-EVL-NEXT: Live-in ir<%N> = original trip-count
|
||||
@ -135,7 +138,7 @@ define void @vp_umax(ptr %a, ptr %b, ptr %c, i64 %N) {
|
||||
; IF-EVL-NEXT: EXPLICIT-VECTOR-LENGTH-BASED-IV-PHI vp<[[EVL_PHI:%[0-9]+]]> = phi ir<0>, vp<[[IV_NEXT:%.+]]>
|
||||
; IF-EVL-NEXT: EMIT vp<[[AVL:%.+]]> = sub ir<%N>, vp<[[EVL_PHI]]>
|
||||
; IF-EVL-NEXT: EMIT vp<[[EVL:%.+]]> = EXPLICIT-VECTOR-LENGTH vp<[[AVL]]>
|
||||
; IF-EVL-NEXT: vp<[[ST:%[0-9]+]]> = SCALAR-STEPS vp<[[EVL_PHI]]>, ir<1>
|
||||
; IF-EVL-NEXT: vp<[[ST:%[0-9]+]]> = SCALAR-STEPS vp<[[EVL_PHI]]>, ir<1>, vp<[[VF]]>
|
||||
; IF-EVL-NEXT: CLONE ir<[[GEP1:%.+]]> = getelementptr inbounds ir<%b>, vp<[[ST]]>
|
||||
; IF-EVL-NEXT: vp<[[PTR1:%[0-9]+]]> = vector-pointer ir<[[GEP1]]>
|
||||
; IF-EVL-NEXT: WIDEN ir<[[LD1:%.+]]> = vp.load vp<[[PTR1]]>, vp<[[EVL]]>
|
||||
@ -178,6 +181,7 @@ define void @vp_umin(ptr %a, ptr %b, ptr %c, i64 %N) {
|
||||
; IF-EVL-NOT: EXPLICIT-VECTOR-LENGTH-BASED-IV-PHI
|
||||
;
|
||||
; IF-EVL: VPlan 'Initial VPlan for VF={vscale x 1,vscale x 2,vscale x 4},UF={1}' {
|
||||
; IF-EVL-NEXT: Live-in vp<[[VF:%[0-9]+]]> = VF
|
||||
; IF-EVL-NEXT: Live-in vp<[[VFUF:%[0-9]+]]> = VF * UF
|
||||
; IF-EVL-NEXT: Live-in vp<[[VTC:%[0-9]+]]> = vector-trip-count
|
||||
; IF-EVL-NEXT: Live-in ir<%N> = original trip-count
|
||||
@ -191,7 +195,7 @@ define void @vp_umin(ptr %a, ptr %b, ptr %c, i64 %N) {
|
||||
; IF-EVL-NEXT: EXPLICIT-VECTOR-LENGTH-BASED-IV-PHI vp<[[EVL_PHI:%[0-9]+]]> = phi ir<0>, vp<[[IV_NEXT:%.+]]>
|
||||
; IF-EVL-NEXT: EMIT vp<[[AVL:%.+]]> = sub ir<%N>, vp<[[EVL_PHI]]>
|
||||
; IF-EVL-NEXT: EMIT vp<[[EVL:%.+]]> = EXPLICIT-VECTOR-LENGTH vp<[[AVL]]>
|
||||
; IF-EVL-NEXT: vp<[[ST:%[0-9]+]]> = SCALAR-STEPS vp<[[EVL_PHI]]>, ir<1>
|
||||
; IF-EVL-NEXT: vp<[[ST:%[0-9]+]]> = SCALAR-STEPS vp<[[EVL_PHI]]>, ir<1>, vp<[[VF]]
|
||||
; IF-EVL-NEXT: CLONE ir<[[GEP1:%.+]]> = getelementptr inbounds ir<%b>, vp<[[ST]]>
|
||||
; IF-EVL-NEXT: vp<[[PTR1:%[0-9]+]]> = vector-pointer ir<[[GEP1]]>
|
||||
; IF-EVL-NEXT: WIDEN ir<[[LD1:%.+]]> = vp.load vp<[[PTR1]]>, vp<[[EVL]]>
|
||||
@ -234,6 +238,7 @@ define void @vp_ctlz(ptr %a, ptr %b, i64 %N) {
|
||||
; IF-EVL-NOT: EXPLICIT-VECTOR-LENGTH-BASED-IV-PHI
|
||||
;
|
||||
; IF-EVL: VPlan 'Initial VPlan for VF={vscale x 1,vscale x 2,vscale x 4},UF={1}' {
|
||||
; IF-EVL-NEXT: Live-in vp<[[VF:%[0-9]+]]> = VF
|
||||
; IF-EVL-NEXT: Live-in vp<[[VFUF:%[0-9]+]]> = VF * UF
|
||||
; IF-EVL-NEXT: Live-in vp<[[VTC:%[0-9]+]]> = vector-trip-count
|
||||
; IF-EVL-NEXT: Live-in ir<%N> = original trip-count
|
||||
@ -247,7 +252,7 @@ define void @vp_ctlz(ptr %a, ptr %b, i64 %N) {
|
||||
; IF-EVL-NEXT: EXPLICIT-VECTOR-LENGTH-BASED-IV-PHI vp<[[EVL_PHI:%[0-9]+]]> = phi ir<0>, vp<[[IV_NEXT:%.+]]>
|
||||
; IF-EVL-NEXT: EMIT vp<[[AVL:%.+]]> = sub ir<%N>, vp<[[EVL_PHI]]>
|
||||
; IF-EVL-NEXT: EMIT vp<[[EVL:%.+]]> = EXPLICIT-VECTOR-LENGTH vp<[[AVL]]>
|
||||
; IF-EVL-NEXT: vp<[[ST:%[0-9]+]]> = SCALAR-STEPS vp<[[EVL_PHI]]>, ir<1>
|
||||
; IF-EVL-NEXT: vp<[[ST:%[0-9]+]]> = SCALAR-STEPS vp<[[EVL_PHI]]>, ir<1>, vp<[[VF]]>
|
||||
; IF-EVL-NEXT: CLONE ir<[[GEP1:%.+]]> = getelementptr inbounds ir<%b>, vp<[[ST]]>
|
||||
; IF-EVL-NEXT: vp<[[PTR1:%[0-9]+]]> = vector-pointer ir<[[GEP1]]>
|
||||
; IF-EVL-NEXT: WIDEN ir<[[LD1:%.+]]> = vp.load vp<[[PTR1]]>, vp<[[EVL]]>
|
||||
@ -285,6 +290,7 @@ define void @vp_cttz(ptr %a, ptr %b, i64 %N) {
|
||||
; IF-EVL-NOT: EXPLICIT-VECTOR-LENGTH-BASED-IV-PHI
|
||||
;
|
||||
; IF-EVL: VPlan 'Initial VPlan for VF={vscale x 1,vscale x 2,vscale x 4},UF={1}' {
|
||||
; IF-EVL-NEXT: Live-in vp<[[VF:%[0-9]+]]> = VF
|
||||
; IF-EVL-NEXT: Live-in vp<[[VFUF:%[0-9]+]]> = VF * UF
|
||||
; IF-EVL-NEXT: Live-in vp<[[VTC:%[0-9]+]]> = vector-trip-count
|
||||
; IF-EVL-NEXT: Live-in ir<%N> = original trip-count
|
||||
@ -298,7 +304,7 @@ define void @vp_cttz(ptr %a, ptr %b, i64 %N) {
|
||||
; IF-EVL-NEXT: EXPLICIT-VECTOR-LENGTH-BASED-IV-PHI vp<[[EVL_PHI:%[0-9]+]]> = phi ir<0>, vp<[[IV_NEXT:%.+]]>
|
||||
; IF-EVL-NEXT: EMIT vp<[[AVL:%.+]]> = sub ir<%N>, vp<[[EVL_PHI]]>
|
||||
; IF-EVL-NEXT: EMIT vp<[[EVL:%.+]]> = EXPLICIT-VECTOR-LENGTH vp<[[AVL]]>
|
||||
; IF-EVL-NEXT: vp<[[ST:%[0-9]+]]> = SCALAR-STEPS vp<[[EVL_PHI]]>, ir<1>
|
||||
; IF-EVL-NEXT: vp<[[ST:%[0-9]+]]> = SCALAR-STEPS vp<[[EVL_PHI]]>, ir<1>, vp<[[VF]]>
|
||||
; IF-EVL-NEXT: CLONE ir<[[GEP1:%.+]]> = getelementptr inbounds ir<%b>, vp<[[ST]]>
|
||||
; IF-EVL-NEXT: vp<[[PTR1:%[0-9]+]]> = vector-pointer ir<[[GEP1]]>
|
||||
; IF-EVL-NEXT: WIDEN ir<[[LD1:%.+]]> = vp.load vp<[[PTR1]]>, vp<[[EVL]]>
|
||||
@ -336,6 +342,7 @@ define void @vp_lrint(ptr %a, ptr %b, i64 %N) {
|
||||
; IF-EVL-NOT: EXPLICIT-VECTOR-LENGTH-BASED-IV-PHI
|
||||
;
|
||||
; IF-EVL: VPlan 'Initial VPlan for VF={vscale x 1,vscale x 2,vscale x 4},UF={1}' {
|
||||
; IF-EVL-NEXT: Live-in vp<[[VF:%[0-9]+]]> = VF
|
||||
; IF-EVL-NEXT: Live-in vp<[[VFUF:%[0-9]+]]> = VF * UF
|
||||
; IF-EVL-NEXT: Live-in vp<[[VTC:%[0-9]+]]> = vector-trip-count
|
||||
; IF-EVL-NEXT: Live-in ir<%N> = original trip-count
|
||||
@ -349,7 +356,7 @@ define void @vp_lrint(ptr %a, ptr %b, i64 %N) {
|
||||
; IF-EVL-NEXT: EXPLICIT-VECTOR-LENGTH-BASED-IV-PHI vp<[[EVL_PHI:%[0-9]+]]> = phi ir<0>, vp<[[IV_NEXT:%.+]]>
|
||||
; IF-EVL-NEXT: EMIT vp<[[AVL:%.+]]> = sub ir<%N>, vp<[[EVL_PHI]]>
|
||||
; IF-EVL-NEXT: EMIT vp<[[EVL:%.+]]> = EXPLICIT-VECTOR-LENGTH vp<[[AVL]]>
|
||||
; IF-EVL-NEXT: vp<[[ST:%[0-9]+]]> = SCALAR-STEPS vp<[[EVL_PHI]]>, ir<1>
|
||||
; IF-EVL-NEXT: vp<[[ST:%[0-9]+]]> = SCALAR-STEPS vp<[[EVL_PHI]]>, ir<1>, vp<[[VF]]>
|
||||
; IF-EVL-NEXT: CLONE ir<[[GEP1:%.+]]> = getelementptr inbounds ir<%b>, vp<[[ST]]>
|
||||
; IF-EVL-NEXT: vp<[[PTR1:%[0-9]+]]> = vector-pointer ir<[[GEP1]]>
|
||||
; IF-EVL-NEXT: WIDEN ir<[[LD1:%.+]]> = vp.load vp<[[PTR1]]>, vp<[[EVL]]>
|
||||
@ -391,6 +398,7 @@ define void @vp_llrint(ptr %a, ptr %b, i64 %N) {
|
||||
; IF-EVL-NOT: EXPLICIT-VECTOR-LENGTH-BASED-IV-PHI
|
||||
;
|
||||
; IF-EVL: VPlan 'Initial VPlan for VF={vscale x 1,vscale x 2,vscale x 4},UF={1}' {
|
||||
; IF-EVL-NEXT: Live-in vp<[[VF:%[0-9]+]]> = VF
|
||||
; IF-EVL-NEXT: Live-in vp<[[VFUF:%[0-9]+]]> = VF * UF
|
||||
; IF-EVL-NEXT: Live-in vp<[[VTC:%[0-9]+]]> = vector-trip-count
|
||||
; IF-EVL-NEXT: Live-in ir<%N> = original trip-count
|
||||
@ -404,7 +412,7 @@ define void @vp_llrint(ptr %a, ptr %b, i64 %N) {
|
||||
; IF-EVL-NEXT: EXPLICIT-VECTOR-LENGTH-BASED-IV-PHI vp<[[EVL_PHI:%[0-9]+]]> = phi ir<0>, vp<[[IV_NEXT:%.+]]>
|
||||
; IF-EVL-NEXT: EMIT vp<[[AVL:%.+]]> = sub ir<%N>, vp<[[EVL_PHI]]>
|
||||
; IF-EVL-NEXT: EMIT vp<[[EVL:%.+]]> = EXPLICIT-VECTOR-LENGTH vp<[[AVL]]>
|
||||
; IF-EVL-NEXT: vp<[[ST:%[0-9]+]]> = SCALAR-STEPS vp<[[EVL_PHI]]>, ir<1>
|
||||
; IF-EVL-NEXT: vp<[[ST:%[0-9]+]]> = SCALAR-STEPS vp<[[EVL_PHI]]>, ir<1>, vp<[[VF]]>
|
||||
; IF-EVL-NEXT: CLONE ir<[[GEP1:%.+]]> = getelementptr inbounds ir<%b>, vp<[[ST]]>
|
||||
; IF-EVL-NEXT: vp<[[PTR1:%[0-9]+]]> = vector-pointer ir<[[GEP1]]>
|
||||
; IF-EVL-NEXT: WIDEN ir<[[LD1:%.+]]> = vp.load vp<[[PTR1]]>, vp<[[EVL]]>
|
||||
@ -446,6 +454,7 @@ define void @vp_abs(ptr %a, ptr %b, i64 %N) {
|
||||
; IF-EVL-NOT: EXPLICIT-VECTOR-LENGTH-BASED-IV-PHI
|
||||
;
|
||||
; IF-EVL: VPlan 'Initial VPlan for VF={vscale x 1,vscale x 2,vscale x 4},UF={1}' {
|
||||
; IF-EVL-NEXT: Live-in vp<[[VF:%[0-9]+]]> = VF
|
||||
; IF-EVL-NEXT: Live-in vp<[[VFUF:%[0-9]+]]> = VF * UF
|
||||
; IF-EVL-NEXT: Live-in vp<[[VTC:%[0-9]+]]> = vector-trip-count
|
||||
; IF-EVL-NEXT: Live-in ir<%N> = original trip-count
|
||||
@ -459,7 +468,7 @@ define void @vp_abs(ptr %a, ptr %b, i64 %N) {
|
||||
; IF-EVL-NEXT: EXPLICIT-VECTOR-LENGTH-BASED-IV-PHI vp<[[EVL_PHI:%[0-9]+]]> = phi ir<0>, vp<[[IV_NEXT:%.+]]>
|
||||
; IF-EVL-NEXT: EMIT vp<[[AVL:%.+]]> = sub ir<%N>, vp<[[EVL_PHI]]>
|
||||
; IF-EVL-NEXT: EMIT vp<[[EVL:%.+]]> = EXPLICIT-VECTOR-LENGTH vp<[[AVL]]>
|
||||
; IF-EVL-NEXT: vp<[[ST:%[0-9]+]]> = SCALAR-STEPS vp<[[EVL_PHI]]>, ir<1>
|
||||
; IF-EVL-NEXT: vp<[[ST:%[0-9]+]]> = SCALAR-STEPS vp<[[EVL_PHI]]>, ir<1>, vp<[[VF]]>
|
||||
; IF-EVL-NEXT: CLONE ir<[[GEP1:%.+]]> = getelementptr inbounds ir<%b>, vp<[[ST]]>
|
||||
; IF-EVL-NEXT: vp<[[PTR1:%[0-9]+]]> = vector-pointer ir<[[GEP1]]>
|
||||
; IF-EVL-NEXT: WIDEN ir<[[LD1:%.+]]> = vp.load vp<[[PTR1]]>, vp<[[EVL]]>
|
||||
|
@ -9,6 +9,7 @@ define void @vp_sext(ptr %a, ptr %b, i64 %N) {
|
||||
; IF-EVL-NOT: EXPLICIT-VECTOR-LENGTH-BASED-IV-PHI
|
||||
;
|
||||
; IF-EVL: VPlan 'Initial VPlan for VF={vscale x 1,vscale x 2},UF={1}' {
|
||||
; IF-EVL-NEXT: Live-in vp<[[VF:%[0-9]+]]> = VF
|
||||
; IF-EVL-NEXT: Live-in vp<[[VFUF:%[0-9]+]]> = VF * UF
|
||||
; IF-EVL-NEXT: Live-in vp<[[VTC:%[0-9]+]]> = vector-trip-count
|
||||
; IF-EVL-NEXT: Live-in ir<%N> = original trip-count
|
||||
@ -22,7 +23,7 @@ define void @vp_sext(ptr %a, ptr %b, i64 %N) {
|
||||
; IF-EVL-NEXT: EXPLICIT-VECTOR-LENGTH-BASED-IV-PHI vp<[[EVL_PHI:%[0-9]+]]> = phi ir<0>, vp<[[IV_NEXT:%.+]]>
|
||||
; IF-EVL-NEXT: EMIT vp<[[AVL:%.+]]> = sub ir<%N>, vp<[[EVL_PHI]]>
|
||||
; IF-EVL-NEXT: EMIT vp<[[EVL:%.+]]> = EXPLICIT-VECTOR-LENGTH vp<[[AVL]]>
|
||||
; IF-EVL-NEXT: vp<[[ST:%[0-9]+]]> = SCALAR-STEPS vp<[[EVL_PHI]]>, ir<1>
|
||||
; IF-EVL-NEXT: vp<[[ST:%[0-9]+]]> = SCALAR-STEPS vp<[[EVL_PHI]]>, ir<1>, vp<[[VF]]>
|
||||
; IF-EVL-NEXT: CLONE ir<[[GEP1:%.+]]> = getelementptr inbounds ir<%b>, vp<[[ST]]>
|
||||
; IF-EVL-NEXT: vp<[[PTR1:%[0-9]+]]> = vector-pointer ir<[[GEP1]]>
|
||||
; IF-EVL-NEXT: WIDEN ir<[[LD1:%.+]]> = vp.load vp<[[PTR1]]>, vp<[[EVL]]>
|
||||
@ -62,6 +63,7 @@ define void @vp_zext(ptr %a, ptr %b, i64 %N) {
|
||||
; IF-EVL-NOT: EXPLICIT-VECTOR-LENGTH-BASED-IV-PHI
|
||||
;
|
||||
; IF-EVL: VPlan 'Initial VPlan for VF={vscale x 1,vscale x 2},UF={1}' {
|
||||
; IF-EVL-NEXT: Live-in vp<[[VF:%[0-9]+]]> = VF
|
||||
; IF-EVL-NEXT: Live-in vp<[[VFUF:%[0-9]+]]> = VF * UF
|
||||
; IF-EVL-NEXT: Live-in vp<[[VTC:%[0-9]+]]> = vector-trip-count
|
||||
; IF-EVL-NEXT: Live-in ir<%N> = original trip-count
|
||||
@ -75,7 +77,7 @@ define void @vp_zext(ptr %a, ptr %b, i64 %N) {
|
||||
; IF-EVL-NEXT: EXPLICIT-VECTOR-LENGTH-BASED-IV-PHI vp<[[EVL_PHI:%[0-9]+]]> = phi ir<0>, vp<[[IV_NEXT:%.+]]>
|
||||
; IF-EVL-NEXT: EMIT vp<[[AVL:%.+]]> = sub ir<%N>, vp<[[EVL_PHI]]>
|
||||
; IF-EVL-NEXT: EMIT vp<[[EVL:%.+]]> = EXPLICIT-VECTOR-LENGTH vp<[[AVL]]>
|
||||
; IF-EVL-NEXT: vp<[[ST:%[0-9]+]]> = SCALAR-STEPS vp<[[EVL_PHI]]>, ir<1>
|
||||
; IF-EVL-NEXT: vp<[[ST:%[0-9]+]]> = SCALAR-STEPS vp<[[EVL_PHI]]>, ir<1>, vp<[[VF]]>
|
||||
; IF-EVL-NEXT: CLONE ir<[[GEP1:%.+]]> = getelementptr inbounds ir<%b>, vp<[[ST]]>
|
||||
; IF-EVL-NEXT: vp<[[PTR1:%[0-9]+]]> = vector-pointer ir<[[GEP1]]>
|
||||
; IF-EVL-NEXT: WIDEN ir<[[LD1:%.+]]> = vp.load vp<[[PTR1]]>, vp<[[EVL]]>
|
||||
@ -113,6 +115,7 @@ define void @vp_trunc(ptr %a, ptr %b, i64 %N) {
|
||||
; IF-EVL-NOT: EXPLICIT-VECTOR-LENGTH-BASED-IV-PHI
|
||||
;
|
||||
; IF-EVL: VPlan 'Initial VPlan for VF={vscale x 1,vscale x 2,vscale x 4},UF={1}' {
|
||||
; IF-EVL-NEXT: Live-in vp<[[VF:%[0-9]+]]> = VF
|
||||
; IF-EVL-NEXT: Live-in vp<[[VFUF:%[0-9]+]]> = VF * UF
|
||||
; IF-EVL-NEXT: Live-in vp<[[VTC:%[0-9]+]]> = vector-trip-count
|
||||
; IF-EVL-NEXT: Live-in ir<%N> = original trip-count
|
||||
@ -126,7 +129,7 @@ define void @vp_trunc(ptr %a, ptr %b, i64 %N) {
|
||||
; IF-EVL-NEXT: EXPLICIT-VECTOR-LENGTH-BASED-IV-PHI vp<[[EVL_PHI:%[0-9]+]]> = phi ir<0>, vp<[[IV_NEXT:%.+]]>
|
||||
; IF-EVL-NEXT: EMIT vp<[[AVL:%.+]]> = sub ir<%N>, vp<[[EVL_PHI]]>
|
||||
; IF-EVL-NEXT: EMIT vp<[[EVL:%.+]]> = EXPLICIT-VECTOR-LENGTH vp<[[AVL]]>
|
||||
; IF-EVL-NEXT: vp<[[ST:%[0-9]+]]> = SCALAR-STEPS vp<[[EVL_PHI]]>, ir<1>
|
||||
; IF-EVL-NEXT: vp<[[ST:%[0-9]+]]> = SCALAR-STEPS vp<[[EVL_PHI]]>, ir<1>, vp<[[VF]]>
|
||||
; IF-EVL-NEXT: CLONE ir<[[GEP1:%.+]]> = getelementptr inbounds ir<%b>, vp<[[ST]]>
|
||||
; IF-EVL-NEXT: vp<[[PTR1:%[0-9]+]]> = vector-pointer ir<[[GEP1]]>
|
||||
; IF-EVL-NEXT: WIDEN ir<[[LD1:%.+]]> = vp.load vp<[[PTR1]]>, vp<[[EVL]]>
|
||||
@ -164,6 +167,7 @@ define void @vp_fpext(ptr %a, ptr %b, i64 %N) {
|
||||
; IF-EVL-NOT: EXPLICIT-VECTOR-LENGTH-BASED-IV-PHI
|
||||
;
|
||||
; IF-EVL: VPlan 'Initial VPlan for VF={vscale x 1,vscale x 2},UF={1}' {
|
||||
; IF-EVL-NEXT: Live-in vp<[[VF:%[0-9]+]]> = VF
|
||||
; IF-EVL-NEXT: Live-in vp<[[VFUF:%[0-9]+]]> = VF * UF
|
||||
; IF-EVL-NEXT: Live-in vp<[[VTC:%[0-9]+]]> = vector-trip-count
|
||||
; IF-EVL-NEXT: Live-in ir<%N> = original trip-count
|
||||
@ -177,7 +181,7 @@ define void @vp_fpext(ptr %a, ptr %b, i64 %N) {
|
||||
; IF-EVL-NEXT: EXPLICIT-VECTOR-LENGTH-BASED-IV-PHI vp<[[EVL_PHI:%[0-9]+]]> = phi ir<0>, vp<[[IV_NEXT:%.+]]>
|
||||
; IF-EVL-NEXT: EMIT vp<[[AVL:%.+]]> = sub ir<%N>, vp<[[EVL_PHI]]>
|
||||
; IF-EVL-NEXT: EMIT vp<[[EVL:%.+]]> = EXPLICIT-VECTOR-LENGTH vp<[[AVL]]>
|
||||
; IF-EVL-NEXT: vp<[[ST:%[0-9]+]]> = SCALAR-STEPS vp<[[EVL_PHI]]>, ir<1>
|
||||
; IF-EVL-NEXT: vp<[[ST:%[0-9]+]]> = SCALAR-STEPS vp<[[EVL_PHI]]>, ir<1>, vp<[[VF]]>
|
||||
; IF-EVL-NEXT: CLONE ir<[[GEP1:%.+]]> = getelementptr inbounds ir<%b>, vp<[[ST]]>
|
||||
; IF-EVL-NEXT: vp<[[PTR1:%[0-9]+]]> = vector-pointer ir<[[GEP1]]>
|
||||
; IF-EVL-NEXT: WIDEN ir<[[LD1:%.+]]> = vp.load vp<[[PTR1]]>, vp<[[EVL]]>
|
||||
@ -215,6 +219,7 @@ define void @vp_fptrunc(ptr %a, ptr %b, i64 %N) {
|
||||
; IF-EVL-NOT: EXPLICIT-VECTOR-LENGTH-BASED-IV-PHI
|
||||
;
|
||||
; IF-EVL: VPlan 'Initial VPlan for VF={vscale x 1,vscale x 2},UF={1}' {
|
||||
; IF-EVL-NEXT: Live-in vp<[[VF:%[0-9]+]]> = VF
|
||||
; IF-EVL-NEXT: Live-in vp<[[VFUF:%[0-9]+]]> = VF * UF
|
||||
; IF-EVL-NEXT: Live-in vp<[[VTC:%[0-9]+]]> = vector-trip-count
|
||||
; IF-EVL-NEXT: Live-in ir<%N> = original trip-count
|
||||
@ -228,7 +233,7 @@ define void @vp_fptrunc(ptr %a, ptr %b, i64 %N) {
|
||||
; IF-EVL-NEXT: EXPLICIT-VECTOR-LENGTH-BASED-IV-PHI vp<[[EVL_PHI:%[0-9]+]]> = phi ir<0>, vp<[[IV_NEXT:%.+]]>
|
||||
; IF-EVL-NEXT: EMIT vp<[[AVL:%.+]]> = sub ir<%N>, vp<[[EVL_PHI]]>
|
||||
; IF-EVL-NEXT: EMIT vp<[[EVL:%.+]]> = EXPLICIT-VECTOR-LENGTH vp<[[AVL]]>
|
||||
; IF-EVL-NEXT: vp<[[ST:%[0-9]+]]> = SCALAR-STEPS vp<[[EVL_PHI]]>, ir<1>
|
||||
; IF-EVL-NEXT: vp<[[ST:%[0-9]+]]> = SCALAR-STEPS vp<[[EVL_PHI]]>, ir<1>, vp<[[VF]]>
|
||||
; IF-EVL-NEXT: CLONE ir<[[GEP1:%.+]]> = getelementptr inbounds ir<%b>, vp<[[ST]]>
|
||||
; IF-EVL-NEXT: vp<[[PTR1:%[0-9]+]]> = vector-pointer ir<[[GEP1]]>
|
||||
; IF-EVL-NEXT: WIDEN ir<[[LD1:%.+]]> = vp.load vp<[[PTR1]]>, vp<[[EVL]]>
|
||||
@ -266,6 +271,7 @@ define void @vp_sitofp(ptr %a, ptr %b, i64 %N) {
|
||||
; IF-EVL-NOT: EXPLICIT-VECTOR-LENGTH-BASED-IV-PHI
|
||||
;
|
||||
; IF-EVL: VPlan 'Initial VPlan for VF={vscale x 1,vscale x 2,vscale x 4},UF={1}' {
|
||||
; IF-EVL-NEXT: Live-in vp<[[VF:%[0-9]+]]> = VF
|
||||
; IF-EVL-NEXT: Live-in vp<[[VFUF:%[0-9]+]]> = VF * UF
|
||||
; IF-EVL-NEXT: Live-in vp<[[VTC:%[0-9]+]]> = vector-trip-count
|
||||
; IF-EVL-NEXT: Live-in ir<%N> = original trip-count
|
||||
@ -279,7 +285,7 @@ define void @vp_sitofp(ptr %a, ptr %b, i64 %N) {
|
||||
; IF-EVL-NEXT: EXPLICIT-VECTOR-LENGTH-BASED-IV-PHI vp<[[EVL_PHI:%[0-9]+]]> = phi ir<0>, vp<[[IV_NEXT:%.+]]>
|
||||
; IF-EVL-NEXT: EMIT vp<[[AVL:%.+]]> = sub ir<%N>, vp<[[EVL_PHI]]>
|
||||
; IF-EVL-NEXT: EMIT vp<[[EVL:%.+]]> = EXPLICIT-VECTOR-LENGTH vp<[[AVL]]>
|
||||
; IF-EVL-NEXT: vp<[[ST:%[0-9]+]]> = SCALAR-STEPS vp<[[EVL_PHI]]>, ir<1>
|
||||
; IF-EVL-NEXT: vp<[[ST:%[0-9]+]]> = SCALAR-STEPS vp<[[EVL_PHI]]>, ir<1>, vp<[[VF]]>
|
||||
; IF-EVL-NEXT: CLONE ir<[[GEP1:%.+]]> = getelementptr inbounds ir<%b>, vp<[[ST]]>
|
||||
; IF-EVL-NEXT: vp<[[PTR1:%[0-9]+]]> = vector-pointer ir<[[GEP1]]>
|
||||
; IF-EVL-NEXT: WIDEN ir<[[LD1:%.+]]> = vp.load vp<[[PTR1]]>, vp<[[EVL]]>
|
||||
@ -317,6 +323,7 @@ define void @vp_uitofp(ptr %a, ptr %b, i64 %N) {
|
||||
; IF-EVL-NOT: EXPLICIT-VECTOR-LENGTH-BASED-IV-PHI
|
||||
;
|
||||
; IF-EVL: VPlan 'Initial VPlan for VF={vscale x 1,vscale x 2,vscale x 4},UF={1}' {
|
||||
; IF-EVL-NEXT: Live-in vp<[[VF:%[0-9]+]]> = VF
|
||||
; IF-EVL-NEXT: Live-in vp<[[VFUF:%[0-9]+]]> = VF * UF
|
||||
; IF-EVL-NEXT: Live-in vp<[[VTC:%[0-9]+]]> = vector-trip-count
|
||||
; IF-EVL-NEXT: Live-in ir<%N> = original trip-count
|
||||
@ -330,7 +337,7 @@ define void @vp_uitofp(ptr %a, ptr %b, i64 %N) {
|
||||
; IF-EVL-NEXT: EXPLICIT-VECTOR-LENGTH-BASED-IV-PHI vp<[[EVL_PHI:%[0-9]+]]> = phi ir<0>, vp<[[IV_NEXT:%.+]]>
|
||||
; IF-EVL-NEXT: EMIT vp<[[AVL:%.+]]> = sub ir<%N>, vp<[[EVL_PHI]]>
|
||||
; IF-EVL-NEXT: EMIT vp<[[EVL:%.+]]> = EXPLICIT-VECTOR-LENGTH vp<[[AVL]]>
|
||||
; IF-EVL-NEXT: vp<[[ST:%[0-9]+]]> = SCALAR-STEPS vp<[[EVL_PHI]]>, ir<1>
|
||||
; IF-EVL-NEXT: vp<[[ST:%[0-9]+]]> = SCALAR-STEPS vp<[[EVL_PHI]]>, ir<1>, vp<[[VF]]
|
||||
; IF-EVL-NEXT: CLONE ir<[[GEP1:%.+]]> = getelementptr inbounds ir<%b>, vp<[[ST]]>
|
||||
; IF-EVL-NEXT: vp<[[PTR1:%[0-9]+]]> = vector-pointer ir<[[GEP1]]>
|
||||
; IF-EVL-NEXT: WIDEN ir<[[LD1:%.+]]> = vp.load vp<[[PTR1]]>, vp<[[EVL]]>
|
||||
@ -368,6 +375,7 @@ define void @vp_fptosi(ptr %a, ptr %b, i64 %N) {
|
||||
; IF-EVL-NOT: EXPLICIT-VECTOR-LENGTH-BASED-IV-PHI
|
||||
;
|
||||
; IF-EVL: VPlan 'Initial VPlan for VF={vscale x 1,vscale x 2,vscale x 4},UF={1}' {
|
||||
; IF-EVL-NEXT: Live-in vp<[[VF:%[0-9]+]]> = VF
|
||||
; IF-EVL-NEXT: Live-in vp<[[VFUF:%[0-9]+]]> = VF * UF
|
||||
; IF-EVL-NEXT: Live-in vp<[[VTC:%[0-9]+]]> = vector-trip-count
|
||||
; IF-EVL-NEXT: Live-in ir<%N> = original trip-count
|
||||
@ -381,7 +389,7 @@ define void @vp_fptosi(ptr %a, ptr %b, i64 %N) {
|
||||
; IF-EVL-NEXT: EXPLICIT-VECTOR-LENGTH-BASED-IV-PHI vp<[[EVL_PHI:%[0-9]+]]> = phi ir<0>, vp<[[IV_NEXT:%.+]]>
|
||||
; IF-EVL-NEXT: EMIT vp<[[AVL:%.+]]> = sub ir<%N>, vp<[[EVL_PHI]]>
|
||||
; IF-EVL-NEXT: EMIT vp<[[EVL:%.+]]> = EXPLICIT-VECTOR-LENGTH vp<[[AVL]]>
|
||||
; IF-EVL-NEXT: vp<[[ST:%[0-9]+]]> = SCALAR-STEPS vp<[[EVL_PHI]]>, ir<1>
|
||||
; IF-EVL-NEXT: vp<[[ST:%[0-9]+]]> = SCALAR-STEPS vp<[[EVL_PHI]]>, ir<1>, vp<[[VF]]>
|
||||
; IF-EVL-NEXT: CLONE ir<[[GEP1:%.+]]> = getelementptr inbounds ir<%b>, vp<[[ST]]>
|
||||
; IF-EVL-NEXT: vp<[[PTR1:%[0-9]+]]> = vector-pointer ir<[[GEP1]]>
|
||||
; IF-EVL-NEXT: WIDEN ir<[[LD1:%.+]]> = vp.load vp<[[PTR1]]>, vp<[[EVL]]>
|
||||
@ -419,6 +427,7 @@ define void @vp_fptoui(ptr %a, ptr %b, i64 %N) {
|
||||
; IF-EVL-NOT: EXPLICIT-VECTOR-LENGTH-BASED-IV-PHI
|
||||
;
|
||||
; IF-EVL: VPlan 'Initial VPlan for VF={vscale x 1,vscale x 2,vscale x 4},UF={1}' {
|
||||
; IF-EVL-NEXT: Live-in vp<[[VF:%[0-9]+]]> = VF
|
||||
; IF-EVL-NEXT: Live-in vp<[[VFUF:%[0-9]+]]> = VF * UF
|
||||
; IF-EVL-NEXT: Live-in vp<[[VTC:%[0-9]+]]> = vector-trip-count
|
||||
; IF-EVL-NEXT: Live-in ir<%N> = original trip-count
|
||||
@ -432,7 +441,7 @@ define void @vp_fptoui(ptr %a, ptr %b, i64 %N) {
|
||||
; IF-EVL-NEXT: EXPLICIT-VECTOR-LENGTH-BASED-IV-PHI vp<[[EVL_PHI:%[0-9]+]]> = phi ir<0>, vp<[[IV_NEXT:%.+]]>
|
||||
; IF-EVL-NEXT: EMIT vp<[[AVL:%.+]]> = sub ir<%N>, vp<[[EVL_PHI]]>
|
||||
; IF-EVL-NEXT: EMIT vp<[[EVL:%.+]]> = EXPLICIT-VECTOR-LENGTH vp<[[AVL]]>
|
||||
; IF-EVL-NEXT: vp<[[ST:%[0-9]+]]> = SCALAR-STEPS vp<[[EVL_PHI]]>, ir<1>
|
||||
; IF-EVL-NEXT: vp<[[ST:%[0-9]+]]> = SCALAR-STEPS vp<[[EVL_PHI]]>, ir<1>, vp<[[VF]]>
|
||||
; IF-EVL-NEXT: CLONE ir<[[GEP1:%.+]]> = getelementptr inbounds ir<%b>, vp<[[ST]]>
|
||||
; IF-EVL-NEXT: vp<[[PTR1:%[0-9]+]]> = vector-pointer ir<[[GEP1]]>
|
||||
; IF-EVL-NEXT: WIDEN ir<[[LD1:%.+]]> = vp.load vp<[[PTR1]]>, vp<[[EVL]]>
|
||||
@ -470,6 +479,7 @@ define void @vp_inttoptr(ptr %a, ptr %b, i64 %N) {
|
||||
; IF-EVL-NOT: EXPLICIT-VECTOR-LENGTH-BASED-IV-PHI
|
||||
;
|
||||
; IF-EVL: VPlan 'Initial VPlan for VF={vscale x 1,vscale x 2},UF={1}' {
|
||||
; IF-EVL-NEXT: Live-in vp<[[VF:%[0-9]+]]> = VF
|
||||
; IF-EVL-NEXT: Live-in vp<[[VFUF:%[0-9]+]]> = VF * UF
|
||||
; IF-EVL-NEXT: Live-in vp<[[VTC:%[0-9]+]]> = vector-trip-count
|
||||
; IF-EVL-NEXT: Live-in ir<%N> = original trip-count
|
||||
@ -483,7 +493,7 @@ define void @vp_inttoptr(ptr %a, ptr %b, i64 %N) {
|
||||
; IF-EVL-NEXT: EXPLICIT-VECTOR-LENGTH-BASED-IV-PHI vp<[[EVL_PHI:%[0-9]+]]> = phi ir<0>, vp<[[IV_NEXT:%.+]]>
|
||||
; IF-EVL-NEXT: EMIT vp<[[AVL:%.+]]> = sub ir<%N>, vp<[[EVL_PHI]]>
|
||||
; IF-EVL-NEXT: EMIT vp<[[EVL:%.+]]> = EXPLICIT-VECTOR-LENGTH vp<[[AVL]]>
|
||||
; IF-EVL-NEXT: vp<[[ST:%[0-9]+]]> = SCALAR-STEPS vp<[[EVL_PHI]]>, ir<1>
|
||||
; IF-EVL-NEXT: vp<[[ST:%[0-9]+]]> = SCALAR-STEPS vp<[[EVL_PHI]]>, ir<1>, vp<[[VF]]>
|
||||
; IF-EVL-NEXT: CLONE ir<[[GEP1:%.+]]> = getelementptr inbounds ir<%b>, vp<[[ST]]>
|
||||
; IF-EVL-NEXT: vp<[[PTR1:%[0-9]+]]> = vector-pointer ir<[[GEP1]]>
|
||||
; IF-EVL-NEXT: WIDEN ir<[[LD1:%.+]]> = vp.load vp<[[PTR1]]>, vp<[[EVL]]>
|
||||
|
@ -28,6 +28,7 @@ define i32 @reduction(ptr %a, i64 %n, i32 %start) {
|
||||
; IF-EVL-NOT: EXPLICIT-VECTOR-LENGTH-BASED-IV-PHI
|
||||
|
||||
; IF-EVL-OUTLOOP: VPlan 'Initial VPlan for VF={vscale x 1,vscale x 2,vscale x 4},UF={1}' {
|
||||
; IF-EVL-OUTLOOP-NEXT: Live-in vp<[[VF:%[0-9]+]]> = VF
|
||||
; IF-EVL-OUTLOOP-NEXT: Live-in vp<[[VFUF:%[0-9]+]]> = VF * UF
|
||||
; IF-EVL-OUTLOOP-NEXT: Live-in vp<[[VTC:%[0-9]+]]> = vector-trip-count
|
||||
; IF-EVL-OUTLOOP-NEXT: Live-in ir<%n> = original trip-count
|
||||
@ -45,7 +46,7 @@ define i32 @reduction(ptr %a, i64 %n, i32 %start) {
|
||||
; IF-EVL-OUTLOOP-NEXT: WIDEN-REDUCTION-PHI ir<[[RDX_PHI:%.+]]> = phi ir<%start>, vp<[[RDX_SELECT:%.+]]>
|
||||
; IF-EVL-OUTLOOP-NEXT: EMIT vp<[[AVL:%.+]]> = sub ir<%n>, vp<[[EVL_PHI]]>
|
||||
; IF-EVL-OUTLOOP-NEXT: EMIT vp<[[EVL:%.+]]> = EXPLICIT-VECTOR-LENGTH vp<[[AVL]]>
|
||||
; IF-EVL-OUTLOOP-NEXT: vp<[[ST:%[0-9]+]]> = SCALAR-STEPS vp<[[EVL_PHI]]>, ir<1>
|
||||
; IF-EVL-OUTLOOP-NEXT: vp<[[ST:%[0-9]+]]> = SCALAR-STEPS vp<[[EVL_PHI]]>, ir<1>, vp<[[VF]]>
|
||||
; IF-EVL-OUTLOOP-NEXT: CLONE ir<[[GEP1:%.+]]> = getelementptr inbounds ir<%a>, vp<[[ST]]>
|
||||
; IF-EVL-OUTLOOP-NEXT: vp<[[PTR1:%[0-9]+]]> = vector-pointer ir<[[GEP1]]>
|
||||
; IF-EVL-OUTLOOP-NEXT: WIDEN ir<[[LD1:%.+]]> = vp.load vp<[[PTR1]]>, vp<[[EVL]]>
|
||||
@ -83,6 +84,7 @@ define i32 @reduction(ptr %a, i64 %n, i32 %start) {
|
||||
;
|
||||
|
||||
; IF-EVL-INLOOP: VPlan 'Initial VPlan for VF={vscale x 1,vscale x 2,vscale x 4},UF={1}' {
|
||||
; IF-EVL-INLOOP-NEXT: Live-in vp<[[VF:%[0-9]+]]> = VF
|
||||
; IF-EVL-INLOOP-NEXT: Live-in vp<[[VFUF:%[0-9]+]]> = VF * UF
|
||||
; IF-EVL-INLOOP-NEXT: Live-in vp<[[VTC:%[0-9]+]]> = vector-trip-count
|
||||
; IF-EVL-INLOOP-NEXT: Live-in ir<%n> = original trip-count
|
||||
@ -97,7 +99,7 @@ define i32 @reduction(ptr %a, i64 %n, i32 %start) {
|
||||
; IF-EVL-INLOOP-NEXT: WIDEN-REDUCTION-PHI ir<[[RDX_PHI:%.+]]> = phi ir<%start>, ir<[[RDX_NEXT:%.+]]>
|
||||
; IF-EVL-INLOOP-NEXT: EMIT vp<[[AVL:%.+]]> = sub ir<%n>, vp<[[EVL_PHI]]>
|
||||
; IF-EVL-INLOOP-NEXT: EMIT vp<[[EVL:%.+]]> = EXPLICIT-VECTOR-LENGTH vp<[[AVL]]>
|
||||
; IF-EVL-INLOOP-NEXT: vp<[[ST:%[0-9]+]]> = SCALAR-STEPS vp<[[EVL_PHI]]>, ir<1>
|
||||
; IF-EVL-INLOOP-NEXT: vp<[[ST:%[0-9]+]]> = SCALAR-STEPS vp<[[EVL_PHI]]>, ir<1>, vp<[[VF]]>
|
||||
; IF-EVL-INLOOP-NEXT: CLONE ir<[[GEP1:%.+]]> = getelementptr inbounds ir<%a>, vp<[[ST]]>
|
||||
; IF-EVL-INLOOP-NEXT: vp<[[PTR1:%[0-9]+]]> = vector-pointer ir<[[GEP1]]>
|
||||
; IF-EVL-INLOOP-NEXT: WIDEN ir<[[LD1:%.+]]> = vp.load vp<[[PTR1]]>, vp<[[EVL]]>
|
||||
@ -134,6 +136,7 @@ define i32 @reduction(ptr %a, i64 %n, i32 %start) {
|
||||
;
|
||||
|
||||
; NO-VP-OUTLOOP: VPlan 'Initial VPlan for VF={vscale x 1,vscale x 2,vscale x 4},UF>=1' {
|
||||
; NO-VP-OUTLOOP-NEXT: Live-in vp<[[VF:%[0-9]+]]> = VF
|
||||
; NO-VP-OUTLOOP-NEXT: Live-in vp<[[VFUF:%[0-9]+]]> = VF * UF
|
||||
; NO-VP-OUTLOOP-NEXT: Live-in vp<[[VTC:%[0-9]+]]> = vector-trip-count
|
||||
; NO-VP-OUTLOOP-NEXT: Live-in ir<%n> = original trip-count
|
||||
@ -145,7 +148,7 @@ define i32 @reduction(ptr %a, i64 %n, i32 %start) {
|
||||
; NO-VP-OUTLOOP-NEXT: vector.body:
|
||||
; NO-VP-OUTLOOP-NEXT: EMIT vp<[[IV:%[0-9]+]]> = CANONICAL-INDUCTION
|
||||
; NO-VP-OUTLOOP-NEXT: WIDEN-REDUCTION-PHI ir<[[RDX_PHI:%.+]]> = phi ir<%start>, ir<[[RDX_NEXT:%.+]]>
|
||||
; NO-VP-OUTLOOP-NEXT: vp<[[ST:%[0-9]+]]> = SCALAR-STEPS vp<[[IV]]>, ir<1>
|
||||
; NO-VP-OUTLOOP-NEXT: vp<[[ST:%[0-9]+]]> = SCALAR-STEPS vp<[[IV]]>, ir<1>, vp<[[VF]]>
|
||||
; NO-VP-OUTLOOP-NEXT: CLONE ir<[[GEP1:%.+]]> = getelementptr inbounds ir<%a>, vp<[[ST]]>
|
||||
; NO-VP-OUTLOOP-NEXT: vp<[[PTR1:%[0-9]+]]> = vector-pointer ir<[[GEP1]]>
|
||||
; NO-VP-OUTLOOP-NEXT: WIDEN ir<[[LD1:%.+]]> = load vp<[[PTR1]]>
|
||||
@ -181,6 +184,7 @@ define i32 @reduction(ptr %a, i64 %n, i32 %start) {
|
||||
;
|
||||
|
||||
; NO-VP-INLOOP: VPlan 'Initial VPlan for VF={vscale x 1,vscale x 2,vscale x 4},UF>=1' {
|
||||
; NO-VP-INLOOP-NEXT: Live-in vp<[[VF:%[0-9]+]]> = VF
|
||||
; NO-VP-INLOOP-NEXT: Live-in vp<[[VFUF:%[0-9]+]]> = VF * UF
|
||||
; NO-VP-INLOOP-NEXT: Live-in vp<[[VTC:%[0-9]+]]> = vector-trip-count
|
||||
; NO-VP-INLOOP-NEXT: Live-in ir<%n> = original trip-count
|
||||
@ -192,7 +196,7 @@ define i32 @reduction(ptr %a, i64 %n, i32 %start) {
|
||||
; NO-VP-INLOOP-NEXT: vector.body:
|
||||
; NO-VP-INLOOP-NEXT: EMIT vp<[[IV:%[0-9]+]]> = CANONICAL-INDUCTION
|
||||
; NO-VP-INLOOP-NEXT: WIDEN-REDUCTION-PHI ir<[[RDX_PHI:%.+]]> = phi ir<%start>, ir<[[RDX_NEXT:%.+]]>
|
||||
; NO-VP-INLOOP-NEXT: vp<[[ST:%[0-9]+]]> = SCALAR-STEPS vp<[[IV]]>, ir<1>
|
||||
; NO-VP-INLOOP-NEXT: vp<[[ST:%[0-9]+]]> = SCALAR-STEPS vp<[[IV]]>, ir<1>, vp<[[VF]]>
|
||||
; NO-VP-INLOOP-NEXT: CLONE ir<[[GEP1:%.+]]> = getelementptr inbounds ir<%a>, vp<[[ST]]>
|
||||
; NO-VP-INLOOP-NEXT: vp<[[PTR1:%[0-9]+]]> = vector-pointer ir<[[GEP1]]>
|
||||
; NO-VP-INLOOP-NEXT: WIDEN ir<[[LD1:%.+]]> = load vp<[[PTR1]]>
|
||||
|
@ -15,6 +15,7 @@ define void @foo(ptr noalias %a, ptr noalias %b, ptr noalias %c, i64 %N) {
|
||||
; IF-EVL-NOT: EXPLICIT-VECTOR-LENGTH-BASED-IV-PHI
|
||||
;
|
||||
; IF-EVL: VPlan 'Initial VPlan for VF={vscale x 1,vscale x 2,vscale x 4},UF={1}' {
|
||||
; IF-EVL-NEXT: Live-in vp<[[VF:%[0-9]+]]> = VF
|
||||
; IF-EVL-NEXT: Live-in vp<[[VFUF:%[0-9]+]]> = VF * UF
|
||||
; IF-EVL-NEXT: Live-in vp<[[VTC:%[0-9]+]]> = vector-trip-count
|
||||
; IF-EVL-NEXT: Live-in ir<%N> = original trip-count
|
||||
@ -28,7 +29,7 @@ define void @foo(ptr noalias %a, ptr noalias %b, ptr noalias %c, i64 %N) {
|
||||
; IF-EVL-NEXT: EXPLICIT-VECTOR-LENGTH-BASED-IV-PHI vp<[[EVL_PHI:%[0-9]+]]> = phi ir<0>, vp<[[IV_NEXT:%.+]]>
|
||||
; IF-EVL-NEXT: EMIT vp<[[AVL:%.+]]> = sub ir<%N>, vp<[[EVL_PHI]]>
|
||||
; IF-EVL-NEXT: EMIT vp<[[EVL:%.+]]> = EXPLICIT-VECTOR-LENGTH vp<[[AVL]]>
|
||||
; IF-EVL-NEXT: vp<[[ST:%[0-9]+]]> = SCALAR-STEPS vp<[[EVL_PHI]]>, ir<1>
|
||||
; IF-EVL-NEXT: vp<[[ST:%[0-9]+]]> = SCALAR-STEPS vp<[[EVL_PHI]]>, ir<1>, vp<[[VF]]>
|
||||
; IF-EVL-NEXT: CLONE ir<[[GEP1:%.+]]> = getelementptr inbounds ir<%b>, vp<[[ST]]>
|
||||
; IF-EVL-NEXT: vp<[[PTR1:%[0-9]+]]> = vector-pointer ir<[[GEP1]]>
|
||||
; IF-EVL-NEXT: WIDEN ir<[[LD1:%.+]]> = vp.load vp<[[PTR1]]>, vp<[[EVL]]>
|
||||
@ -47,6 +48,7 @@ define void @foo(ptr noalias %a, ptr noalias %b, ptr noalias %c, i64 %N) {
|
||||
; IF-EVL-NEXT: }
|
||||
|
||||
; NO-VP: VPlan 'Initial VPlan for VF={vscale x 1,vscale x 2,vscale x 4},UF>=1' {
|
||||
; NO-VP-NEXT: Live-in vp<[[VF:%[0-9]+]]> = VF
|
||||
; NO-VP-NEXT: Live-in vp<[[VFUF:%[0-9]+]]> = VF * UF
|
||||
; NO-VP-NEXT: Live-in vp<[[VTC:%[0-9]+]]> = vector-trip-count
|
||||
; NO-VP-NEXT: Live-in ir<%N> = original trip-count
|
||||
@ -57,7 +59,7 @@ define void @foo(ptr noalias %a, ptr noalias %b, ptr noalias %c, i64 %N) {
|
||||
; NO-VP-NEXT: <x1> vector loop: {
|
||||
; NO-VP-NEXT: vector.body:
|
||||
; NO-VP-NEXT: EMIT vp<[[IV:%[0-9]+]]> = CANONICAL-INDUCTION
|
||||
; NO-VP-NEXT: vp<[[ST:%[0-9]+]]> = SCALAR-STEPS vp<[[IV]]>, ir<1>
|
||||
; NO-VP-NEXT: vp<[[ST:%[0-9]+]]> = SCALAR-STEPS vp<[[IV]]>, ir<1>, vp<[[VF]]>
|
||||
; NO-VP-NEXT: CLONE ir<[[GEP1:%.+]]> = getelementptr inbounds ir<%b>, vp<[[ST]]>
|
||||
; NO-VP-NEXT: vp<[[PTR1:%[0-9]+]]> = vector-pointer ir<[[GEP1]]>
|
||||
; NO-VP-NEXT: WIDEN ir<[[LD1:%.+]]> = load vp<[[PTR1]]>
|
||||
@ -95,6 +97,7 @@ for.cond.cleanup:
|
||||
|
||||
define void @safe_dep(ptr %p) {
|
||||
; CHECK: VPlan 'Initial VPlan for VF={vscale x 1,vscale x 2},UF>=1' {
|
||||
; CHECK-NEXT: Live-in vp<[[VFUF:%[0-9]+]]> = VF
|
||||
; CHECK-NEXT: Live-in vp<[[VFUF:%[0-9]+]]> = VF * UF
|
||||
; CHECK-NEXT: Live-in vp<[[VTC:%[0-9]+]]> = vector-trip-count
|
||||
; CHECK-NEXT: Live-in ir<512> = original trip-count
|
||||
@ -105,7 +108,7 @@ define void @safe_dep(ptr %p) {
|
||||
; CHECK-NEXT: <x1> vector loop: {
|
||||
; CHECK-NEXT: vector.body:
|
||||
; CHECK-NEXT: EMIT vp<[[IV:%[0-9]+]]> = CANONICAL-INDUCTION
|
||||
; CHECK-NEXT: vp<[[ST:%[0-9]+]]> = SCALAR-STEPS vp<[[IV]]>, ir<1>
|
||||
; CHECK-NEXT: vp<[[ST:%[0-9]+]]> = SCALAR-STEPS vp<[[IV]]>, ir<1>, vp<[[VF]]>
|
||||
; CHECK-NEXT: CLONE ir<[[GEP1:%.+]]> = getelementptr ir<%p>, vp<[[ST]]>
|
||||
; CHECK-NEXT: vp<[[PTR1:%[0-9]+]]> = vector-pointer ir<[[GEP1]]>
|
||||
; CHECK-NEXT: WIDEN ir<[[V:%.+]]> = load vp<[[PTR1]]>
|
||||
|
@ -12,6 +12,7 @@
|
||||
|
||||
define void @foo(ptr noalias %a, ptr noalias %b, ptr noalias %c, i64 %N) {
|
||||
; IF-EVL: VPlan 'Initial VPlan for VF={4},UF>=1' {
|
||||
; IF-EVL-NEXT: Live-in vp<[[VF:%[0-9]+]]> = VF
|
||||
; IF-EVL-NEXT: Live-in vp<[[VFUF:%[0-9]+]]> = VF * UF
|
||||
; IF-EVL-NEXT: Live-in vp<[[VTC:%[0-9]+]]> = vector-trip-count
|
||||
; IF-EVL-NEXT: Live-in vp<[[BETC:%[0-9]+]]> = backedge-taken count
|
||||
@ -23,7 +24,7 @@ define void @foo(ptr noalias %a, ptr noalias %b, ptr noalias %c, i64 %N) {
|
||||
; IF-EVL-NEXT: <x1> vector loop: {
|
||||
; IF-EVL-NEXT: vector.body:
|
||||
; IF-EVL-NEXT: EMIT vp<[[IV:%[0-9]+]]> = CANONICAL-INDUCTION
|
||||
; IF-EVL-NEXT: vp<[[ST:%[0-9]+]]> = SCALAR-STEPS vp<[[IV]]>, ir<1>
|
||||
; IF-EVL-NEXT: vp<[[ST:%[0-9]+]]> = SCALAR-STEPS vp<[[IV]]>, ir<1>, vp<[[VF]]>
|
||||
; IF-EVL-NEXT: EMIT vp<[[VIV:%[0-9]+]]> = WIDEN-CANONICAL-INDUCTION vp<[[IV]]>
|
||||
; IF-EVL-NEXT: EMIT vp<[[MASK:%[0-9]+]]> = icmp ule vp<[[VIV]]>, vp<[[BETC]]>
|
||||
; IF-EVL-NEXT: CLONE ir<[[GEP1:%.+]]> = getelementptr inbounds ir<%b>, vp<[[ST]]>
|
||||
@ -42,6 +43,7 @@ define void @foo(ptr noalias %a, ptr noalias %b, ptr noalias %c, i64 %N) {
|
||||
; IF-EVL-NEXT: }
|
||||
|
||||
; NO-VP: VPlan 'Initial VPlan for VF={4},UF>=1' {
|
||||
; NO-VP-NEXT: Live-in vp<[[VF:%[0-9]+]]> = VF
|
||||
; NO-VP-NEXT: Live-in vp<[[VFUF:%[0-9]+]]> = VF * UF
|
||||
; NO-VP-NEXT: Live-in vp<[[VTC:%[0-9]+]]> = vector-trip-count
|
||||
; NO-VP-NEXT: Live-in ir<%N> = original trip-count
|
||||
@ -52,7 +54,7 @@ define void @foo(ptr noalias %a, ptr noalias %b, ptr noalias %c, i64 %N) {
|
||||
; NO-VP-NEXT: <x1> vector loop: {
|
||||
; NO-VP-NEXT: vector.body:
|
||||
; NO-VP-NEXT: EMIT vp<[[IV:%[0-9]+]]> = CANONICAL-INDUCTION
|
||||
; NO-VP-NEXT: vp<[[ST:%[0-9]+]]> = SCALAR-STEPS vp<[[IV]]>, ir<1>
|
||||
; NO-VP-NEXT: vp<[[ST:%[0-9]+]]> = SCALAR-STEPS vp<[[IV]]>, ir<1>, vp<[[VF]]>
|
||||
; NO-VP-NEXT: CLONE ir<[[GEP1:%.+]]> = getelementptr inbounds ir<%b>, vp<[[ST]]>
|
||||
; NO-VP-NEXT: vp<[[PTR1:%[0-9]+]]> = vector-pointer ir<[[GEP1]]>
|
||||
; NO-VP-NEXT: WIDEN ir<[[LD1:%.+]]> = load vp<[[PTR1]]>
|
||||
|
@ -5,6 +5,7 @@
|
||||
define void @test_chained_first_order_recurrences_1(ptr %ptr) {
|
||||
; CHECK-LABEL: 'test_chained_first_order_recurrences_1'
|
||||
; CHECK: VPlan 'Initial VPlan for VF={4},UF>=1' {
|
||||
; CHECK-NEXT: Live-in vp<[[VF:%.+]]> = VF
|
||||
; CHECK-NEXT: Live-in vp<[[VFxUF:%.+]]> = VF * UF
|
||||
; CHECK-NEXT: Live-in vp<[[VTC:%.+]]> = vector-trip-count
|
||||
; CHECK-NEXT: Live-in ir<1000> = original trip-count
|
||||
@ -20,7 +21,7 @@ define void @test_chained_first_order_recurrences_1(ptr %ptr) {
|
||||
; CHECK-NEXT: EMIT vp<[[CAN_IV:%.+]]> = CANONICAL-INDUCTION
|
||||
; CHECK-NEXT: FIRST-ORDER-RECURRENCE-PHI ir<%for.1> = phi ir<22>, ir<%for.1.next>
|
||||
; CHECK-NEXT: FIRST-ORDER-RECURRENCE-PHI ir<%for.2> = phi ir<33>, vp<[[FOR1_SPLICE:%.+]]>
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>, vp<[[VF]]>
|
||||
; CHECK-NEXT: CLONE ir<%gep.ptr> = getelementptr inbounds ir<%ptr>, vp<[[STEPS]]>
|
||||
; CHECK-NEXT: vp<[[VEC_PTR:%.+]]> = vector-pointer ir<%gep.ptr>
|
||||
; CHECK-NEXT: WIDEN ir<%for.1.next> = load vp<[[VEC_PTR]]>
|
||||
@ -81,6 +82,7 @@ exit:
|
||||
define void @test_chained_first_order_recurrences_3(ptr %ptr) {
|
||||
; CHECK-LABEL: 'test_chained_first_order_recurrences_3'
|
||||
; CHECK: VPlan 'Initial VPlan for VF={4},UF>=1' {
|
||||
; CHECK-NEXT: Live-in vp<[[VF:%.+]]> = VF
|
||||
; CHECK-NEXT: Live-in vp<[[VFxUF:%.+]]> = VF * UF
|
||||
; CHECK-NEXT: Live-in vp<[[VTC:%.+]]> = vector-trip-count
|
||||
; CHECK-NEXT: Live-in ir<1000> = original trip-count
|
||||
@ -97,7 +99,7 @@ define void @test_chained_first_order_recurrences_3(ptr %ptr) {
|
||||
; CHECK-NEXT: FIRST-ORDER-RECURRENCE-PHI ir<%for.1> = phi ir<22>, ir<%for.1.next>
|
||||
; CHECK-NEXT: FIRST-ORDER-RECURRENCE-PHI ir<%for.2> = phi ir<33>, vp<[[FOR1_SPLICE:%.+]]>
|
||||
; CHECK-NEXT: FIRST-ORDER-RECURRENCE-PHI ir<%for.3> = phi ir<33>, vp<[[FOR2_SPLICE:%.+]]>
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>, vp<[[VF]]>
|
||||
; CHECK-NEXT: CLONE ir<%gep.ptr> = getelementptr inbounds ir<%ptr>, vp<[[STEPS]]>
|
||||
; CHECK-NEXT: vp<[[VEC_PTR:%.+]]> = vector-pointer ir<%gep.ptr>
|
||||
; CHECK-NEXT: WIDEN ir<%for.1.next> = load vp<[[VEC_PTR]]>
|
||||
@ -169,6 +171,7 @@ exit:
|
||||
define i32 @test_chained_first_order_recurrences_4(ptr %base, i64 %x) {
|
||||
; CHECK-LABEL: 'test_chained_first_order_recurrences_4'
|
||||
; CHECK: VPlan 'Initial VPlan for VF={4},UF>=1' {
|
||||
; CHECK-NEXT: Live-in vp<[[VF:%.+]]> = VF
|
||||
; CHECK-NEXT: Live-in vp<[[VFxUF:%.+]]> = VF * UF
|
||||
; CHECK-NEXT: Live-in vp<[[VTC:%.+]]> = vector-trip-count
|
||||
; CHECK-NEXT: Live-in ir<4098> = original trip-count
|
||||
@ -185,7 +188,7 @@ define i32 @test_chained_first_order_recurrences_4(ptr %base, i64 %x) {
|
||||
; CHECK-NEXT: EMIT vp<[[CAN_IV:%.+]]> = CANONICAL-INDUCTION ir<0>, vp<[[CAN_IV_NEXT:%.+]]>
|
||||
; CHECK-NEXT: FIRST-ORDER-RECURRENCE-PHI ir<%for.x> = phi ir<0>, ir<%for.x.next>
|
||||
; CHECK-NEXT: FIRST-ORDER-RECURRENCE-PHI ir<%for.y> = phi ir<0>, ir<%for.x.prev>
|
||||
; CHECK-NEXT: vp<[[SCALAR_STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>
|
||||
; CHECK-NEXT: vp<[[SCALAR_STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>, vp<[[VF]]>
|
||||
; CHECK-NEXT: CLONE ir<%gep> = getelementptr ir<%base>, vp<[[SCALAR_STEPS]]>
|
||||
; CHECK-NEXT: EMIT vp<[[SPLICE_X:%.]]> = first-order splice ir<%for.x>, ir<%for.x.next>
|
||||
; CHECK-NEXT: WIDEN-CAST ir<%for.x.prev> = trunc vp<[[SPLICE_X]]> to i32
|
||||
@ -245,6 +248,7 @@ ret:
|
||||
define i32 @test_chained_first_order_recurrences_5_hoist_to_load(ptr %base) {
|
||||
; CHECK-LABEL: 'test_chained_first_order_recurrences_5_hoist_to_load'
|
||||
; CHECK: VPlan 'Initial VPlan for VF={4},UF>=1' {
|
||||
; CHECK-NEXT: Live-in vp<[[VF:%.+]]> = VF
|
||||
; CHECK-NEXT: Live-in vp<[[VFxUF:%.+]]> = VF * UF
|
||||
; CHECK-NEXT: Live-in vp<[[VTC:%.+]]> = vector-trip-count
|
||||
; CHECK-NEXT: Live-in ir<4098> = original trip-count
|
||||
@ -260,7 +264,7 @@ define i32 @test_chained_first_order_recurrences_5_hoist_to_load(ptr %base) {
|
||||
; CHECK-NEXT: EMIT vp<[[CAN_IV:%.+]]> = CANONICAL-INDUCTION ir<0>, vp<[[CAN_IV_NEXT:%.+]]>
|
||||
; CHECK-NEXT: FIRST-ORDER-RECURRENCE-PHI ir<%for.x> = phi ir<0>, ir<%for.x.next>
|
||||
; CHECK-NEXT: FIRST-ORDER-RECURRENCE-PHI ir<%for.y> = phi ir<0>, ir<%for.x.prev>
|
||||
; CHECK-NEXT: vp<[[SCALAR_STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>
|
||||
; CHECK-NEXT: vp<[[SCALAR_STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>, vp<[[VF]]>
|
||||
; CHECK-NEXT: CLONE ir<%gep> = getelementptr ir<%base>, vp<[[SCALAR_STEPS]]>
|
||||
; CHECK-NEXT: vp<[[VEC_PTR:%.+]]> = vector-pointer ir<%gep>
|
||||
; CHECK-NEXT: WIDEN ir<%l> = load vp<[[VEC_PTR]]>
|
||||
|
@ -499,6 +499,7 @@ exit: ; preds = %loop
|
||||
define void @need_new_block_after_sinking_pr56146(i32 %x, ptr %src, ptr noalias %dst) {
|
||||
; CHECK-LABEL: need_new_block_after_sinking_pr56146
|
||||
; CHECK: VPlan 'Initial VPlan for VF={2},UF>=1' {
|
||||
; CHECK-NEXT: Live-in vp<[[VF:%.+]]> = VF
|
||||
; CHECK-NEXT: Live-in vp<[[VFxUF:%.+]]> = VF * UF
|
||||
; CHECK-NEXT: Live-in vp<[[VEC_TC:%.+]]> = vector-trip-count
|
||||
; CHECK-NEXT: Live-in vp<[[BTC:%.+]]> = backedge-taken count
|
||||
@ -528,7 +529,7 @@ define void @need_new_block_after_sinking_pr56146(i32 %x, ptr %src, ptr noalias
|
||||
; CHECK-NEXT: Successor(s): pred.store.if, pred.store.continue
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: pred.store.if:
|
||||
; CHECK-NEXT: vp<[[SCALAR_STEPS:%.+]]> = SCALAR-STEPS vp<[[DERIVED_IV]]>, ir<1>
|
||||
; CHECK-NEXT: vp<[[SCALAR_STEPS:%.+]]> = SCALAR-STEPS vp<[[DERIVED_IV]]>, ir<1>, vp<[[VF]]>
|
||||
; CHECK-NEXT: REPLICATE ir<%gep.dst> = getelementptr ir<%dst>, vp<[[SCALAR_STEPS]]>
|
||||
; CHECK-NEXT: REPLICATE ir<%val> = sdiv vp<[[SPLICE]]>, ir<%x>
|
||||
; CHECK-NEXT: REPLICATE store ir<%val>, ir<%gep.dst>
|
||||
|
@ -5,6 +5,7 @@
|
||||
|
||||
; DBG-LABEL: 'test_scalarize_call'
|
||||
; DBG: VPlan 'Initial VPlan for VF={1},UF>=1' {
|
||||
; DBG-NEXT: Live-in vp<[[VF:%.+]]> = VF
|
||||
; DBG-NEXT: Live-in vp<[[VFxUF:%.+]]> = VF * UF
|
||||
; DBG-NEXT: Live-in vp<[[VEC_TC:%.+]]> = vector-trip-count
|
||||
; DBG-NEXT: vp<[[TC:%.+]]> = original trip-count
|
||||
@ -21,7 +22,7 @@
|
||||
; DBG-NEXT: vector.body:
|
||||
; DBG-NEXT: EMIT vp<[[CAN_IV:%.+]]> = CANONICAL-INDUCTION
|
||||
; DBG-NEXT: vp<[[DERIVED_IV:%.+]]> = DERIVED-IV ir<%start> + vp<[[CAN_IV]]> * ir<1>
|
||||
; DBG-NEXT: vp<[[IV_STEPS:%.]]> = SCALAR-STEPS vp<[[DERIVED_IV]]>, ir<1>
|
||||
; DBG-NEXT: vp<[[IV_STEPS:%.]]> = SCALAR-STEPS vp<[[DERIVED_IV]]>, ir<1>, vp<[[VF]]>
|
||||
; DBG-NEXT: CLONE ir<%min> = call @llvm.smin.i32(vp<[[IV_STEPS]]>, ir<65535>)
|
||||
; DBG-NEXT: CLONE ir<%arrayidx> = getelementptr inbounds ir<%dst>, vp<[[IV_STEPS]]>
|
||||
; DBG-NEXT: CLONE store ir<%min>, ir<%arrayidx>
|
||||
@ -191,6 +192,7 @@ exit:
|
||||
|
||||
; DBG-LABEL: 'first_order_recurrence_using_induction'
|
||||
; DBG: VPlan 'Initial VPlan for VF={1},UF>=1' {
|
||||
; DBG-NEXT: Live-in vp<[[VF:%.+]]> = VF
|
||||
; DBG-NEXT: Live-in vp<[[VFxUF:%.+]]> = VF * UF
|
||||
; DBG-NEXT: Live-in vp<[[VTC:%.+]]> = vector-trip-count
|
||||
; DBG-NEXT: vp<[[TC:%.+]]> = original trip-count
|
||||
@ -208,7 +210,7 @@ exit:
|
||||
; DBG-NEXT: EMIT vp<[[CAN_IV:%.+]]> = CANONICAL-INDUCTION
|
||||
; DBG-NEXT: FIRST-ORDER-RECURRENCE-PHI ir<%for> = phi ir<0>, vp<[[SCALAR_STEPS:.+]]>
|
||||
; DBG-NEXT: SCALAR-CAST vp<[[TRUNC_IV:%.+]]> = trunc vp<[[CAN_IV]]> to i32
|
||||
; DBG-NEXT: vp<[[SCALAR_STEPS]]> = SCALAR-STEPS vp<[[TRUNC_IV]]>, vp<[[CAST]]>
|
||||
; DBG-NEXT: vp<[[SCALAR_STEPS]]> = SCALAR-STEPS vp<[[TRUNC_IV]]>, vp<[[CAST]]>, vp<[[VF]]
|
||||
; DBG-NEXT: EMIT vp<[[SPLICE:%.+]]> = first-order splice ir<%for>, vp<[[SCALAR_STEPS]]>
|
||||
; DBG-NEXT: CLONE store vp<[[SPLICE]]>, ir<%dst>
|
||||
; DBG-NEXT: EMIT vp<[[IV_INC:%.+]]> = add nuw vp<[[CAN_IV]]>, vp<[[VFxUF]]>
|
||||
|
@ -8,6 +8,7 @@ declare void @init(ptr)
|
||||
define i64 @multi_exiting_to_different_exits_live_in_exit_values() {
|
||||
; CHECK: multi_exiting_to_different_exits_live_in_exit_values
|
||||
; CHECK-LABEL: VPlan 'Initial VPlan for VF={4},UF>=1' {
|
||||
; CHECK-NEXT: Live-in vp<[[VF:%.+]]> = VF
|
||||
; CHECK-NEXT: Live-in vp<[[VFxUF:%.+]]> = VF * UF
|
||||
; CHECK-NEXT: Live-in vp<[[VTC:%.+]]> = vector-trip-count
|
||||
; CHECK-NEXT: Live-in ir<128> = original trip-count
|
||||
@ -23,8 +24,8 @@ define i64 @multi_exiting_to_different_exits_live_in_exit_values() {
|
||||
; CHECK-NEXT: <x1> vector loop: {
|
||||
; CHECK-NEXT: vector.body:
|
||||
; CHECK-NEXT: EMIT vp<[[CAN_IV:%.+]]> = CANONICAL-INDUCTION ir<0>, vp<%index.next>
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>
|
||||
; CHECK-NEXT: CLONE ir<%gep.src> = getelementptr inbounds ir<%src>, vp<%3>
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>, vp<[[VF]]
|
||||
; CHECK-NEXT: CLONE ir<%gep.src> = getelementptr inbounds ir<%src>, vp<[[STEPS]]>
|
||||
; CHECK-NEXT: vp<[[VEC_PTR:%.+]]> = vector-pointer ir<%gep.src>
|
||||
; CHECK-NEXT: WIDEN ir<%l> = load vp<[[VEC_PTR]]>
|
||||
; CHECK-NEXT: WIDEN ir<%c.1> = icmp eq ir<%l>, ir<10>
|
||||
@ -94,6 +95,7 @@ e2:
|
||||
define i64 @multi_exiting_to_same_exit_live_in_exit_values() {
|
||||
; CHECK: multi_exiting_to_same_exit_live_in_exit_values
|
||||
; CHECK-LABEL: VPlan 'Initial VPlan for VF={4},UF>=1' {
|
||||
; CHECK-NEXT: Live-in vp<[[VF:%.+]]> = VF
|
||||
; CHECK-NEXT: Live-in vp<[[VFxUF:%.+]]> = VF * UF
|
||||
; CHECK-NEXT: Live-in vp<[[VTC:%.+]]> = vector-trip-count
|
||||
; CHECK-NEXT: Live-in ir<128> = original trip-count
|
||||
@ -109,8 +111,8 @@ define i64 @multi_exiting_to_same_exit_live_in_exit_values() {
|
||||
; CHECK-NEXT: <x1> vector loop: {
|
||||
; CHECK-NEXT: vector.body:
|
||||
; CHECK-NEXT: EMIT vp<[[CAN_IV:%.+]]> = CANONICAL-INDUCTION ir<0>, vp<%index.next>
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>
|
||||
; CHECK-NEXT: CLONE ir<%gep.src> = getelementptr inbounds ir<%src>, vp<%3>
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>, vp<[[VF]]>
|
||||
; CHECK-NEXT: CLONE ir<%gep.src> = getelementptr inbounds ir<%src>, vp<[[STEPS]]>
|
||||
; CHECK-NEXT: vp<[[VEC_PTR:%.+]]> = vector-pointer ir<%gep.src>
|
||||
; CHECK-NEXT: WIDEN ir<%l> = load vp<[[VEC_PTR]]>
|
||||
; CHECK-NEXT: WIDEN ir<%c.1> = icmp eq ir<%l>, ir<10>
|
||||
@ -173,6 +175,7 @@ exit:
|
||||
define i64 @multi_exiting_to_same_exit_live_in_exit_values_2() {
|
||||
; CHECK: multi_exiting_to_same_exit_live_in_exit_values_2
|
||||
; CHECK-LABEL: VPlan 'Initial VPlan for VF={4},UF>=1' {
|
||||
; CHECK-NEXT: Live-in vp<[[VF:%.+]]> = VF
|
||||
; CHECK-NEXT: Live-in vp<[[VFxUF:%.+]]> = VF * UF
|
||||
; CHECK-NEXT: Live-in vp<[[VTC:%.+]]> = vector-trip-count
|
||||
; CHECK-NEXT: Live-in ir<128> = original trip-count
|
||||
@ -188,8 +191,8 @@ define i64 @multi_exiting_to_same_exit_live_in_exit_values_2() {
|
||||
; CHECK-NEXT: <x1> vector loop: {
|
||||
; CHECK-NEXT: vector.body:
|
||||
; CHECK-NEXT: EMIT vp<[[CAN_IV:%.+]]> = CANONICAL-INDUCTION ir<0>, vp<%index.next>
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>
|
||||
; CHECK-NEXT: CLONE ir<%gep.src> = getelementptr inbounds ir<%src>, vp<%3>
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>, vp<[[VF]]>
|
||||
; CHECK-NEXT: CLONE ir<%gep.src> = getelementptr inbounds ir<%src>, vp<[[STEPS]]>
|
||||
; CHECK-NEXT: vp<[[VEC_PTR:%.+]]> = vector-pointer ir<%gep.src>
|
||||
; CHECK-NEXT: WIDEN ir<%l> = load vp<[[VEC_PTR]]>
|
||||
; CHECK-NEXT: WIDEN ir<%c.1> = icmp eq ir<%l>, ir<10>
|
||||
|
@ -8,7 +8,7 @@ target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f3
|
||||
|
||||
define void @print_call_and_memory(i64 %n, ptr noalias %y, ptr noalias %x) nounwind uwtable {
|
||||
; CHECK: digraph VPlan {
|
||||
; CHECK-NEXT: graph [labelloc=t, fontsize=30; label="Vectorization Plan\nInitial VPlan for VF=\{4\},UF\>=1\nLive-in vp\<[[VFxUF:%.+]]\> = VF * UF\nLive-in vp\<[[VEC_TC:%.+]]\> = vector-trip-count\nLive-in ir\<%n\> = original trip-count\n"]
|
||||
; CHECK-NEXT: graph [labelloc=t, fontsize=30; label="Vectorization Plan\nInitial VPlan for VF=\{4\},UF\>=1\nLive-in vp\<[[VF:%.+]]\> = VF\nLive-in vp\<[[VFxUF:%.+]]\> = VF * UF\nLive-in vp\<[[VEC_TC:%.+]]\> = vector-trip-count\nLive-in ir\<%n\> = original trip-count\n"]
|
||||
; CHECK-NEXT: node [shape=rect, fontname=Courier, fontsize=30]
|
||||
; CHECK-NEXT: edge [fontname=Courier, fontsize=30]
|
||||
; CHECK-NEXT: compound=true
|
||||
@ -28,7 +28,7 @@ define void @print_call_and_memory(i64 %n, ptr noalias %y, ptr noalias %x) nounw
|
||||
; CHECK-NEXT: N2 [label =
|
||||
; CHECK-NEXT: "vector.body:\l" +
|
||||
; CHECK-NEXT: " EMIT vp\<[[CAN_IV:%.+]]\> = CANONICAL-INDUCTION ir\<0\>, vp\<[[CAN_IV_NEXT:%.+]]\>\l" +
|
||||
; CHECK-NEXT: " vp\<[[STEPS:%.+]]\> = SCALAR-STEPS vp\<[[CAN_IV]]\>, ir\<1\>\l" +
|
||||
; CHECK-NEXT: " vp\<[[STEPS:%.+]]\> = SCALAR-STEPS vp\<[[CAN_IV]]\>, ir\<1\>, vp\<[[VF]]\>\l" +
|
||||
; CHECK-NEXT: " CLONE ir\<%arrayidx\> = getelementptr inbounds ir\<%y\>, vp\<[[STEPS]]\>\l" +
|
||||
; CHECK-NEXT: " vp\<[[VEC_PTR:%.+]]\> = vector-pointer ir\<%arrayidx\>\l" +
|
||||
; CHECK-NEXT: " WIDEN ir\<%lv\> = load vp\<[[VEC_PTR]]\>\l" +
|
||||
|
@ -3,6 +3,7 @@
|
||||
|
||||
define void @switch4_default_common_dest_with_case(ptr %start, ptr %end) {
|
||||
; CHECK: VPlan 'Final VPlan for VF={2},UF={1}' {
|
||||
; CHECK-NEXT: Live-in ir<[[VF:.+]]> = VF
|
||||
; CHECK-NEXT: Live-in ir<[[VFxUF:.+]]> = VF * UF
|
||||
; CHECK-NEXT: Live-in ir<[[VTC:%.+]]> = vector-trip-count
|
||||
; CHECK-NEXT: ir<%0> = original trip-count
|
||||
@ -19,7 +20,7 @@ define void @switch4_default_common_dest_with_case(ptr %start, ptr %end) {
|
||||
; CHECK-NEXT: <x1> vector loop: {
|
||||
; CHECK-NEXT: vector.body:
|
||||
; CHECK-NEXT: EMIT vp<[[CAN_IV:%.+]]> = phi ir<0>, vp<[[CAN_IV_NEXT:%.+]]>
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>, ir<2>
|
||||
; CHECK-NEXT: EMIT vp<[[PTR:%.+]]> = ptradd ir<%start>, vp<[[STEPS]]>
|
||||
; CHECK-NEXT: vp<[[WIDE_PTR:%.+]]> = vector-pointer vp<[[PTR]]>
|
||||
; CHECK-NEXT: WIDEN ir<%l> = load vp<[[WIDE_PTR]]>
|
||||
|
@ -9,6 +9,7 @@ target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
|
||||
define void @test_tc_less_than_16(ptr %A, i64 %N) {
|
||||
; CHECK: LV: Scalarizing: %cmp =
|
||||
; CHECK: VPlan 'Initial VPlan for VF={8},UF>=1' {
|
||||
; CHECK-NEXT: Live-in vp<[[VF:%.+]]> = VF
|
||||
; CHECK-NEXT: Live-in vp<[[VFxUF:%.+]]> = VF * UF
|
||||
; CHECK-NEXT: Live-in vp<[[VTC:%.+]]> = vector-trip-count
|
||||
; CHECK-NEXT: vp<[[TC:%.+]]> = original trip-count
|
||||
@ -26,7 +27,7 @@ define void @test_tc_less_than_16(ptr %A, i64 %N) {
|
||||
; CHECK-NEXT: <x1> vector loop: {
|
||||
; CHECK-NEXT: vector.body:
|
||||
; CHECK-NEXT: EMIT vp<[[CAN_IV:%.+]]> = CANONICAL-INDUCTION ir<0>, vp<[[CAN_IV_NEXT:%.+]]>
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>, vp<[[VF]]>
|
||||
; CHECK-NEXT: EMIT vp<[[PADD:%.+]]> = ptradd ir<%A>, vp<[[STEPS]]>
|
||||
; CHECK-NEXT: vp<[[VPTR:%.]]> = vector-pointer vp<[[PADD]]>
|
||||
; CHECK-NEXT: WIDEN ir<%l> = load vp<[[VPTR]]>
|
||||
|
@ -7,6 +7,7 @@
|
||||
define float @print_reduction(i64 %n, ptr noalias %y) {
|
||||
; CHECK-LABEL: Checking a loop in 'print_reduction'
|
||||
; CHECK: VPlan 'Initial VPlan for VF={4},UF>=1' {
|
||||
; CHECK-NEXT: Live-in vp<[[VF:%.]]> = VF
|
||||
; CHECK-NEXT: Live-in vp<[[VFxUF:%.]]> = VF * UF
|
||||
; CHECK-NEXT: Live-in vp<[[VTC:%.+]]> = vector-trip-count
|
||||
; CHECK-NEXT: Live-in ir<%n> = original trip-count
|
||||
@ -21,7 +22,7 @@ define float @print_reduction(i64 %n, ptr noalias %y) {
|
||||
; CHECK-NEXT: vector.body:
|
||||
; CHECK-NEXT: EMIT vp<[[CAN_IV:%.+]]> = CANONICAL-INDUCTION ir<0>, vp<[[CAN_IV_NEXT:%.+]]>
|
||||
; CHECK-NEXT: WIDEN-REDUCTION-PHI ir<%red> = phi ir<0.000000e+00>, ir<%red.next>
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>, vp<[[VF]]>
|
||||
; CHECK-NEXT: CLONE ir<%arrayidx> = getelementptr inbounds ir<%y>, vp<[[STEPS]]>
|
||||
; CHECK-NEXT: vp<[[VEC_PTR:%.+]]> = vector-pointer ir<%arrayidx>
|
||||
; CHECK-NEXT: WIDEN ir<%lv> = load vp<[[VEC_PTR]]>
|
||||
@ -74,6 +75,7 @@ exit: ; preds = %loop, %entry
|
||||
define void @print_reduction_with_invariant_store(i64 %n, ptr noalias %y, ptr noalias %dst) {
|
||||
; CHECK-LABEL: Checking a loop in 'print_reduction_with_invariant_store'
|
||||
; CHECK: VPlan 'Initial VPlan for VF={4},UF>=1' {
|
||||
; CHECK-NEXT: Live-in vp<[[VF:%.]]> = VF
|
||||
; CHECK-NEXT: Live-in vp<[[VFxUF:%.]]> = VF * UF
|
||||
; CHECK-NEXT: Live-in vp<[[VTC:%.+]]> = vector-trip-count
|
||||
; CHECK-NEXT: Live-in ir<%n> = original trip-count
|
||||
@ -88,7 +90,7 @@ define void @print_reduction_with_invariant_store(i64 %n, ptr noalias %y, ptr no
|
||||
; CHECK-NEXT: vector.body:
|
||||
; CHECK-NEXT: EMIT vp<[[CAN_IV:%.+]]> = CANONICAL-INDUCTION ir<0>, vp<[[CAN_IV_NEXT:%.+]]>
|
||||
; CHECK-NEXT: WIDEN-REDUCTION-PHI ir<%red> = phi ir<0.000000e+00>, ir<%red.next>
|
||||
; CHECK-NEXT: vp<[[IV:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>
|
||||
; CHECK-NEXT: vp<[[IV:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>, vp<[[VF]]>
|
||||
; CHECK-NEXT: CLONE ir<%arrayidx> = getelementptr inbounds ir<%y>, vp<[[IV]]>
|
||||
; CHECK-NEXT: vp<[[VEC_PTR:%.+]]> = vector-pointer ir<%arrayidx>
|
||||
; CHECK-NEXT: WIDEN ir<%lv> = load vp<[[VEC_PTR]]>
|
||||
@ -142,6 +144,7 @@ exit: ; preds = %loop, %entry
|
||||
define float @print_fmuladd_strict(ptr %a, ptr %b, i64 %n) {
|
||||
; CHECK-LABEL: Checking a loop in 'print_fmuladd_strict'
|
||||
; CHECK: VPlan 'Initial VPlan for VF={4},UF>=1' {
|
||||
; CHECK-NEXT: Live-in vp<[[VF:%.]]> = VF
|
||||
; CHECK-NEXT: Live-in vp<[[VFxUF:%.]]> = VF * UF
|
||||
; CHECK-NEXT: Live-in vp<[[VTC:%.+]]> = vector-trip-count
|
||||
; CHECK-NEXT: Live-in ir<%n> = original trip-count
|
||||
@ -156,7 +159,7 @@ define float @print_fmuladd_strict(ptr %a, ptr %b, i64 %n) {
|
||||
; CHECK-NEXT: vector.body:
|
||||
; CHECK-NEXT: EMIT vp<[[CAN_IV:%.+]]> = CANONICAL-INDUCTION ir<0>, vp<[[CAN_IV_NEXT:%.+]]>
|
||||
; CHECK-NEXT: WIDEN-REDUCTION-PHI ir<%sum.07> = phi ir<0.000000e+00>, ir<%muladd>
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>, vp<[[VF]]>
|
||||
; CHECK-NEXT: CLONE ir<%arrayidx> = getelementptr inbounds ir<%a>, vp<[[STEPS]]>
|
||||
; CHECK-NEXT: vp<[[VEC_PTR:%.+]]> = vector-pointer ir<%arrayidx>
|
||||
; CHECK-NEXT: WIDEN ir<%l.a> = load vp<[[VEC_PTR]]>
|
||||
|
@ -9,6 +9,7 @@ target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f3
|
||||
define void @print_call_and_memory(i64 %n, ptr noalias %y, ptr noalias %x) nounwind uwtable {
|
||||
; CHECK-LABEL: Checking a loop in 'print_call_and_memory'
|
||||
; CHECK: VPlan 'Initial VPlan for VF={4},UF>=1' {
|
||||
; CHECK-NEXT: Live-in vp<[[VF:%.]]> = VF
|
||||
; CHECK-NEXT: Live-in vp<[[VFxUF:%.]]> = VF * UF
|
||||
; CHECK-NEXT: Live-in vp<[[VTC:%.+]]> = vector-trip-count
|
||||
; CHECK-NEXT: Live-in ir<%n> = original trip-count
|
||||
@ -22,7 +23,7 @@ define void @print_call_and_memory(i64 %n, ptr noalias %y, ptr noalias %x) nounw
|
||||
; CHECK-NEXT: <x1> vector loop: {
|
||||
; CHECK-NEXT: vector.body:
|
||||
; CHECK-NEXT: EMIT vp<[[CAN_IV:%.+]]> = CANONICAL-INDUCTION ir<0>, vp<[[CAN_IV_NEXT:%.+]]>
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>, vp<[[VF]]>
|
||||
; CHECK-NEXT: CLONE ir<%arrayidx> = getelementptr inbounds ir<%y>, vp<[[STEPS]]>
|
||||
; CHECK-NEXT: vp<[[VEC_PTR:%.+]]> = vector-pointer ir<%arrayidx>
|
||||
; CHECK-NEXT: WIDEN ir<%lv> = load vp<[[VEC_PTR]]>
|
||||
@ -243,6 +244,7 @@ for.end: ; preds = %for.inc
|
||||
define void @print_interleave_groups(i32 %C, i32 %D) {
|
||||
; CHECK-LABEL: Checking a loop in 'print_interleave_groups'
|
||||
; CHECK: VPlan 'Initial VPlan for VF={4},UF>=1' {
|
||||
; CHECK-NEXT: Live-in vp<[[VF:%.]]> = VF
|
||||
; CHECK-NEXT: Live-in vp<[[VFxUF:%.]]> = VF * UF
|
||||
; CHECK-NEXT: Live-in vp<[[VTC:%.+]]> = vector-trip-count
|
||||
; CHECK-NEXT: Live-in ir<256> = original trip-count
|
||||
@ -258,7 +260,7 @@ define void @print_interleave_groups(i32 %C, i32 %D) {
|
||||
; CHECK-NEXT: vector.body:
|
||||
; CHECK-NEXT: EMIT vp<[[CAN_IV:%.+]]> = CANONICAL-INDUCTION ir<0>, vp<[[CAN_IV_NEXT:%.+]]>
|
||||
; CHECK-NEXT: vp<[[DERIVED_IV:%.+]]> = DERIVED-IV ir<0> + vp<[[CAN_IV]]> * ir<4>
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[DERIVED_IV]]>, ir<4>
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[DERIVED_IV]]>, ir<4>, vp<[[VF]]>
|
||||
; CHECK-NEXT: CLONE ir<%gep.AB.0> = getelementptr inbounds ir<@AB>, ir<0>, vp<[[STEPS]]>
|
||||
; CHECK-NEXT: INTERLEAVE-GROUP with factor 4 at %AB.0, ir<%gep.AB.0>
|
||||
; CHECK-NEXT: ir<%AB.0> = load from index 0
|
||||
@ -329,6 +331,7 @@ for.end:
|
||||
define void @debug_loc_vpinstruction(ptr nocapture %asd, ptr nocapture %bsd) !dbg !5 {
|
||||
; CHECK-LABEL: Checking a loop in 'debug_loc_vpinstruction'
|
||||
; CHECK: VPlan 'Initial VPlan for VF={4},UF>=1' {
|
||||
; CHECK-NEXT: Live-in vp<[[VF:%.]]> = VF
|
||||
; CHECK-NEXT: Live-in vp<[[VFxUF:%.]]> = VF * UF
|
||||
; CHECK-NEXT: Live-in vp<[[VTC:%.+]]> = vector-trip-count
|
||||
; CHECK-NEXT: Live-in ir<128> = original trip-count
|
||||
@ -342,7 +345,7 @@ define void @debug_loc_vpinstruction(ptr nocapture %asd, ptr nocapture %bsd) !db
|
||||
; CHECK-NEXT: <x1> vector loop: {
|
||||
; CHECK-NEXT: vector.body:
|
||||
; CHECK-NEXT: EMIT vp<[[CAN_IV:%.+]]> = CANONICAL-INDUCTION ir<0>, vp<[[CAN_IV_NEXT:%.+]]>
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>, vp<[[VF]]>
|
||||
; CHECK-NEXT: CLONE ir<%isd> = getelementptr inbounds ir<%asd>, vp<[[STEPS]]>
|
||||
; CHECK-NEXT: vp<[[VEC_PTR:%.+]]> = vector-pointer ir<%isd>
|
||||
; CHECK-NEXT: WIDEN ir<%lsd> = load vp<[[VEC_PTR]]>
|
||||
@ -573,6 +576,7 @@ exit:
|
||||
define void @print_fast_math_flags(i64 %n, ptr noalias %y, ptr noalias %x, ptr %z) {
|
||||
; CHECK-LABEL: Checking a loop in 'print_fast_math_flags'
|
||||
; CHECK: VPlan 'Initial VPlan for VF={4},UF>=1' {
|
||||
; CHECK-NEXT: Live-in vp<[[VF:%.]]> = VF
|
||||
; CHECK-NEXT: Live-in vp<[[VFxUF:%.]]> = VF * UF
|
||||
; CHECK-NEXT: Live-in vp<[[VTC:%.+]]> = vector-trip-count
|
||||
; CHECK-NEXT: Live-in ir<%n> = original trip-count
|
||||
@ -586,7 +590,7 @@ define void @print_fast_math_flags(i64 %n, ptr noalias %y, ptr noalias %x, ptr %
|
||||
; CHECK-NEXT: <x1> vector loop: {
|
||||
; CHECK-NEXT: vector.body:
|
||||
; CHECK-NEXT: EMIT vp<[[CAN_IV:%.+]]> = CANONICAL-INDUCTION ir<0>, vp<[[CAN_IV_NEXT:%.+]]>
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>, vp<[[VF]]>
|
||||
; CHECK-NEXT: CLONE ir<%gep.y> = getelementptr inbounds ir<%y>, vp<[[STEPS]]>
|
||||
; CHECK-NEXT: vp<[[VEC_PTR:%.+]]> = vector-pointer ir<%gep.y>
|
||||
; CHECK-NEXT: WIDEN ir<%lv> = load vp<[[VEC_PTR]]>
|
||||
@ -643,6 +647,7 @@ exit:
|
||||
define void @print_exact_flags(i64 %n, ptr noalias %x) {
|
||||
; CHECK-LABEL: Checking a loop in 'print_exact_flags'
|
||||
; CHECK: VPlan 'Initial VPlan for VF={4},UF>=1' {
|
||||
; CHECK-NEXT: Live-in vp<[[VF:%.]]> = VF
|
||||
; CHECK-NEXT: Live-in vp<[[VFxUF:%.]]> = VF * UF
|
||||
; CHECK-NEXT: Live-in vp<[[VTC:%.+]]> = vector-trip-count
|
||||
; CHECK-NEXT: Live-in ir<%n> = original trip-count
|
||||
@ -656,7 +661,7 @@ define void @print_exact_flags(i64 %n, ptr noalias %x) {
|
||||
; CHECK-NEXT: <x1> vector loop: {
|
||||
; CHECK-NEXT: vector.body:
|
||||
; CHECK-NEXT: EMIT vp<[[CAN_IV:%.+]]> = CANONICAL-INDUCTION ir<0>, vp<[[CAN_IV_NEXT:%.+]]>
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>, vp<[[VF]]>
|
||||
; CHECK-NEXT: CLONE ir<%gep.x> = getelementptr inbounds ir<%x>, vp<[[STEPS]]>
|
||||
; CHECK-NEXT: vp<[[VEC_PTR:%.+]]> = vector-pointer ir<%gep.x>
|
||||
; CHECK-NEXT: WIDEN ir<%lv> = load vp<[[VEC_PTR]]>
|
||||
@ -711,6 +716,7 @@ exit:
|
||||
define void @print_call_flags(ptr readonly %src, ptr noalias %dest, i64 %n) {
|
||||
; CHECK-LABEL: Checking a loop in 'print_call_flags'
|
||||
; CHECK: VPlan 'Initial VPlan for VF={4},UF>=1' {
|
||||
; CHECK-NEXT: Live-in vp<[[VF:%.]]> = VF
|
||||
; CHECK-NEXT: Live-in vp<[[VFxUF:%.]]> = VF * UF
|
||||
; CHECK-NEXT: Live-in vp<[[VTC:%.+]]> = vector-trip-count
|
||||
; CHECK-NEXT: Live-in ir<%n> = original trip-count
|
||||
@ -724,7 +730,7 @@ define void @print_call_flags(ptr readonly %src, ptr noalias %dest, i64 %n) {
|
||||
; CHECK-NEXT: <x1> vector loop: {
|
||||
; CHECK-NEXT: vector.body:
|
||||
; CHECK-NEXT: EMIT vp<[[CAN_IV:%.+]]> = CANONICAL-INDUCTION ir<0>, vp<[[CAN_IV_NEXT:%.+]]>
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>, vp<[[VF]]>
|
||||
; CHECK-NEXT: CLONE ir<%ld.addr> = getelementptr inbounds ir<%src>, vp<[[STEPS]]>
|
||||
; CHECK-NEXT: vp<[[VEC_PTR:%.+]]> = vector-pointer ir<%ld.addr>
|
||||
; CHECK-NEXT: WIDEN ir<%ld.value> = load vp<[[VEC_PTR]]>
|
||||
@ -810,6 +816,7 @@ end:
|
||||
define void @print_disjoint_flags(i64 %n, ptr noalias %x) {
|
||||
; CHECK-LABEL: Checking a loop in 'print_disjoint_flags'
|
||||
; CHECK: VPlan 'Initial VPlan for VF={4},UF>=1' {
|
||||
; CHECK-NEXT: Live-in vp<[[VF:%.]]> = VF
|
||||
; CHECK-NEXT: Live-in vp<[[VFxUF:%.]]> = VF * UF
|
||||
; CHECK-NEXT: Live-in vp<[[VTC:%.+]]> = vector-trip-count
|
||||
; CHECK-NEXT: Live-in ir<%n> = original trip-count
|
||||
@ -823,7 +830,7 @@ define void @print_disjoint_flags(i64 %n, ptr noalias %x) {
|
||||
; CHECK-NEXT: <x1> vector loop: {
|
||||
; CHECK-NEXT: vector.body:
|
||||
; CHECK-NEXT: EMIT vp<[[CAN_IV:%.+]]> = CANONICAL-INDUCTION ir<0>, vp<[[CAN_IV_NEXT:%.+]]>
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>, vp<[[VF]]>
|
||||
; CHECK-NEXT: CLONE ir<%gep.x> = getelementptr inbounds ir<%x>, vp<[[STEPS]]>
|
||||
; CHECK-NEXT: vp<[[VEC_PTR:%.+]]> = vector-pointer ir<%gep.x>
|
||||
; CHECK-NEXT: WIDEN ir<%lv> = load vp<[[VEC_PTR]]>
|
||||
@ -878,6 +885,7 @@ exit:
|
||||
define void @zext_nneg(ptr noalias %p, ptr noalias %p1) {
|
||||
; CHECK-LABEL: LV: Checking a loop in 'zext_nneg'
|
||||
; CHECK: VPlan 'Initial VPlan for VF={4},UF>=1' {
|
||||
; CHECK-NEXT: Live-in vp<[[VF:%.]]> = VF
|
||||
; CHECK-NEXT: Live-in vp<[[VFxUF:%.]]> = VF * UF
|
||||
; CHECK-NEXT: Live-in vp<[[VTC:%.+]]> = vector-trip-count
|
||||
; CHECK-NEXT: Live-in ir<1000> = original trip-count
|
||||
@ -891,7 +899,7 @@ define void @zext_nneg(ptr noalias %p, ptr noalias %p1) {
|
||||
; CHECK-NEXT: <x1> vector loop: {
|
||||
; CHECK-NEXT: vector.body:
|
||||
; CHECK-NEXT: EMIT vp<[[CAN_IV:%.+]]> = CANONICAL-INDUCTION ir<0>, vp<[[CAN_IV_NEXT:%.+]]>
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>, vp<[[VF]]>
|
||||
; CHECK-NEXT: CLONE ir<%idx> = getelementptr ir<%p>, vp<[[STEPS]]>
|
||||
; CHECK-NEXT: vp<[[VEC_PTR:%.+]]> = vector-pointer ir<%idx>
|
||||
; CHECK-NEXT: WIDEN ir<%l> = load vp<[[VEC_PTR]]>
|
||||
@ -922,6 +930,7 @@ exit:
|
||||
define i16 @print_first_order_recurrence_and_result(ptr %ptr) {
|
||||
; CHECK-LABEL: 'print_first_order_recurrence_and_result'
|
||||
; CHECK: VPlan 'Initial VPlan for VF={4},UF>=1' {
|
||||
; CHECK-NEXT: Live-in vp<[[VF:%.+]]> = VF
|
||||
; CHECK-NEXT: Live-in vp<[[VFxUF:%.+]]> = VF * UF
|
||||
; CHECK-NEXT: Live-in vp<[[VTC:%.+]]> = vector-trip-count
|
||||
; CHECK-NEXT: Live-in ir<1000> = original trip-count
|
||||
@ -936,7 +945,7 @@ define i16 @print_first_order_recurrence_and_result(ptr %ptr) {
|
||||
; CHECK-NEXT: vector.body:
|
||||
; CHECK-NEXT: EMIT vp<[[CAN_IV:%.+]]> = CANONICAL-INDUCTION
|
||||
; CHECK-NEXT: FIRST-ORDER-RECURRENCE-PHI ir<%for.1> = phi ir<22>, ir<%for.1.next>
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>, vp<[[VF]]>
|
||||
; CHECK-NEXT: CLONE ir<%gep.ptr> = getelementptr inbounds ir<%ptr>, vp<[[STEPS]]>
|
||||
; CHECK-NEXT: vp<[[VEC_PTR:%.+]]> = vector-pointer ir<%gep.ptr>
|
||||
; CHECK-NEXT: WIDEN ir<%for.1.next> = load vp<[[VEC_PTR]]>
|
||||
@ -994,6 +1003,7 @@ exit:
|
||||
define void @print_select_with_fastmath_flags(ptr noalias %a, ptr noalias %b, ptr noalias %c, i64 %N) {
|
||||
; CHECK-LABEL: 'print_select_with_fastmath_flags'
|
||||
; CHECK: VPlan 'Initial VPlan for VF={4},UF>=1'
|
||||
; CHECK-NEXT: Live-in vp<[[VF:%.+]]> = VF
|
||||
; CHECK-NEXT: Live-in vp<[[VFUF:%.+]]> = VF * UF
|
||||
; CHECK-NEXT: Live-in vp<[[VTC:%.+]]> = vector-trip-count
|
||||
; CHECK-NEXT: Live-in ir<%N> = original trip-count
|
||||
@ -1007,7 +1017,7 @@ define void @print_select_with_fastmath_flags(ptr noalias %a, ptr noalias %b, pt
|
||||
; CHECK: <x1> vector loop: {
|
||||
; CHECK-NEXT: vector.body:
|
||||
; CHECK-NEXT: EMIT vp<[[IV:%.+]]> = CANONICAL-INDUCTION ir<0>, vp<[[IV_NEXT_EXIT:%.+]]>
|
||||
; CHECK-NEXT: vp<[[ST:%.+]]> = SCALAR-STEPS vp<[[IV]]>, ir<1>
|
||||
; CHECK-NEXT: vp<[[ST:%.+]]> = SCALAR-STEPS vp<[[IV]]>, ir<1>, vp<[[VF]]>
|
||||
; CHECK-NEXT: CLONE ir<[[GEP1:%.+]]> = getelementptr inbounds nuw ir<%b>, vp<[[ST]]>
|
||||
; CHECK-NEXT: vp<[[PTR1:%.+]]> = vector-pointer ir<[[GEP1]]>
|
||||
; CHECK-NEXT: WIDEN ir<[[LD1:%.+]]> = load vp<[[PTR1]]>
|
||||
|
@ -8,6 +8,7 @@ target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f3
|
||||
define void @sink_with_sideeffects(i1 %c, ptr %ptr) {
|
||||
; CHECK-LABEL: sink_with_sideeffects
|
||||
; CHECK: VPlan 'Initial VPlan for VF={1},UF>=1' {
|
||||
; CHECK-NEXT: Live-in vp<[[VF:%.+]]> = VF
|
||||
; CHECK-NEXT: Live-in vp<[[VFxUF:%.+]]> = VF * UF
|
||||
; CHECK-NEXT: Live-in vp<[[VEC_TC:%.+]]> = vector-trip-count
|
||||
; CHECK-NEXT: ir<1024> = original trip-count
|
||||
@ -22,7 +23,7 @@ define void @sink_with_sideeffects(i1 %c, ptr %ptr) {
|
||||
; CHECK-NEXT: <x1> vector loop: {
|
||||
; CHECK-NEXT: vector.body:
|
||||
; CHECK-NEXT: EMIT vp<[[CAN_IV:%.+]]> = CANONICAL-INDUCTION
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>, vp<[[VF]]>
|
||||
; CHECK-NEXT: CLONE ir<%tmp2> = getelementptr ir<%ptr>, vp<[[STEPS]]>
|
||||
; CHECK-NEXT: CLONE ir<%tmp3> = load ir<%tmp2>
|
||||
; CHECK-NEXT: CLONE store ir<0>, ir<%tmp2>
|
||||
|
@ -965,6 +965,7 @@ exit:
|
||||
define void @sinking_requires_duplication(ptr %addr) {
|
||||
; CHECK-LABEL: LV: Checking a loop in 'sinking_requires_duplication'
|
||||
; CHECK: VPlan 'Initial VPlan for VF={2},UF>=1' {
|
||||
; CHECK-NEXT: Live-in vp<[[VF:%.+]]> = VF
|
||||
; CHECK-NEXT: Live-in vp<[[VFxUF:%.+]]> = VF * UF
|
||||
; CHECK-NEXT: Live-in vp<[[VEC_TC:%.+]]> = vector-trip-count
|
||||
; CHECK-NEXT: Live-in ir<201> = original trip-count
|
||||
@ -978,7 +979,7 @@ define void @sinking_requires_duplication(ptr %addr) {
|
||||
; CHECK-NEXT: <x1> vector loop: {
|
||||
; CHECK-NEXT: vector.body:
|
||||
; CHECK-NEXT: EMIT vp<[[CAN_IV:%.+]]> = CANONICAL-INDUCTION
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>, vp<[[VF]]>
|
||||
; CHECK-NEXT: CLONE ir<%gep> = getelementptr ir<%addr>, vp<[[STEPS]]>
|
||||
; CHECK-NEXT: vp<[[VEC_PTR:%.+]]> = vector-pointer ir<%gep>
|
||||
; CHECK-NEXT: WIDEN ir<%0> = load vp<[[VEC_PTR]]>
|
||||
@ -1038,6 +1039,7 @@ exit:
|
||||
define void @merge_with_dead_gep_between_regions(i32 %n, ptr noalias %src, ptr noalias %dst) optsize {
|
||||
; CHECK-LABEL: LV: Checking a loop in 'merge_with_dead_gep_between_regions'
|
||||
; CHECK: VPlan 'Initial VPlan for VF={2},UF>=1' {
|
||||
; CHECK-NEXT: Live-in vp<[[VF:%.+]]> = VF
|
||||
; CHECK-NEXT: Live-in vp<[[VFxUF:%.+]]> = VF * UF
|
||||
; CHECK-NEXT: Live-in vp<[[VEC_TC:%.+]]> = vector-trip-count
|
||||
; CHECK-NEXT: Live-in vp<[[BTC:%.+]]> = backedge-taken count
|
||||
@ -1064,7 +1066,7 @@ define void @merge_with_dead_gep_between_regions(i32 %n, ptr noalias %src, ptr n
|
||||
; CHECK-NEXT: Successor(s): pred.store.if, pred.store.continue
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: pred.store.if:
|
||||
; CHECK-NEXT: vp<[[SCALAR_STEPS:%.+]]> = SCALAR-STEPS vp<[[DERIVED_IV]]>, ir<-1>
|
||||
; CHECK-NEXT: vp<[[SCALAR_STEPS:%.+]]> = SCALAR-STEPS vp<[[DERIVED_IV]]>, ir<-1>, vp<[[VF]]>
|
||||
; CHECK-NEXT: REPLICATE ir<%gep.src> = getelementptr inbounds ir<%src>, vp<[[SCALAR_STEPS]]>
|
||||
; CHECK-NEXT: REPLICATE ir<%l> = load ir<%gep.src>
|
||||
; CHECK-NEXT: REPLICATE ir<%gep.dst> = getelementptr inbounds ir<%dst>, vp<[[SCALAR_STEPS]]>
|
||||
|
@ -4,6 +4,7 @@
|
||||
define void @struct_return_f32_widen(ptr noalias %in, ptr noalias writeonly %out_a, ptr noalias writeonly %out_b) {
|
||||
; CHECK-LABEL: LV: Checking a loop in 'struct_return_f32_widen'
|
||||
; CHECK: VPlan 'Initial VPlan for VF={2},UF>=1' {
|
||||
; CHECK-NEXT: Live-in vp<[[VF:%.+]]> = VF
|
||||
; CHECK-NEXT: Live-in vp<[[VFxUF:%.+]]> = VF * UF
|
||||
; CHECK-NEXT: Live-in vp<[[VTC:%.+]]> = vector-trip-count
|
||||
; CHECK-NEXT: Live-in ir<1024> = original trip-count
|
||||
@ -17,7 +18,7 @@ define void @struct_return_f32_widen(ptr noalias %in, ptr noalias writeonly %out
|
||||
; CHECK-NEXT: <x1> vector loop: {
|
||||
; CHECK-NEXT: vector.body:
|
||||
; CHECK-NEXT: EMIT vp<[[CAN_IV:%.+]]> = CANONICAL-INDUCTION ir<0>, vp<%index.next>
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>, vp<[[VF]]>
|
||||
; CHECK-NEXT: CLONE ir<%arrayidx> = getelementptr inbounds ir<%in>, vp<[[STEPS]]>
|
||||
; CHECK-NEXT: vp<[[IN_VEC_PTR:%.+]]> = vector-pointer ir<%arrayidx>
|
||||
; CHECK-NEXT: WIDEN ir<%in_val> = load vp<[[IN_VEC_PTR]]>
|
||||
@ -59,6 +60,7 @@ exit:
|
||||
define void @struct_return_f32_replicate(ptr noalias %in, ptr noalias writeonly %out_a, ptr noalias writeonly %out_b) {
|
||||
; CHECK-LABEL: LV: Checking a loop in 'struct_return_f32_replicate'
|
||||
; CHECK: VPlan 'Initial VPlan for VF={2},UF>=1' {
|
||||
; CHECK-NEXT: Live-in vp<[[VF:%.+]]> = VF
|
||||
; CHECK-NEXT: Live-in vp<[[VFxUF:%.+]]> = VF * UF
|
||||
; CHECK-NEXT: Live-in vp<[[VTC:%.+]]> = vector-trip-count
|
||||
; CHECK-NEXT: Live-in ir<1024> = original trip-count
|
||||
@ -72,7 +74,7 @@ define void @struct_return_f32_replicate(ptr noalias %in, ptr noalias writeonly
|
||||
; CHECK-NEXT: <x1> vector loop: {
|
||||
; CHECK-NEXT: vector.body:
|
||||
; CHECK-NEXT: EMIT vp<[[CAN_IV:%.+]]> = CANONICAL-INDUCTION ir<0>, vp<%index.next>
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>, vp<[[VF]]
|
||||
; CHECK-NEXT: CLONE ir<%arrayidx> = getelementptr inbounds ir<%in>, vp<[[STEPS]]>
|
||||
; CHECK-NEXT: vp<[[IN_VEC_PTR:%.+]]> = vector-pointer ir<%arrayidx>
|
||||
; CHECK-NEXT: WIDEN ir<%in_val> = load vp<[[IN_VEC_PTR]]>
|
||||
|
@ -1269,7 +1269,7 @@ TEST_F(VPRecipeTest, MayHaveSideEffectsAndMayReadWriteMemory) {
|
||||
VPValue *Op1 = Plan.getOrAddLiveIn(ConstantInt::get(Int32, 1));
|
||||
VPValue *Op2 = Plan.getOrAddLiveIn(ConstantInt::get(Int32, 2));
|
||||
InductionDescriptor IndDesc;
|
||||
VPScalarIVStepsRecipe Recipe(IndDesc, Op1, Op2);
|
||||
VPScalarIVStepsRecipe Recipe(IndDesc, Op1, Op2, Op2);
|
||||
EXPECT_FALSE(Recipe.mayHaveSideEffects());
|
||||
EXPECT_FALSE(Recipe.mayReadFromMemory());
|
||||
EXPECT_FALSE(Recipe.mayWriteToMemory());
|
||||
|
Loading…
x
Reference in New Issue
Block a user