From 211596c94e92d179e095734b23899d877c8fc3e5 Mon Sep 17 00:00:00 2001 From: Florian Hahn Date: Wed, 3 Jun 2020 11:30:06 +0100 Subject: [PATCH] [VPlan] Support extracting lanes for defs managed in VPTransformState. Currently extracting a lane for a VPValue def is not supported, if it is managed directly by VPTransformState (e.g. because it is created by a VPInstruction or an external VPValue def). For now, simply extract the requested lane. In the future, we should also cache the extracted scalar values, similar to LV. Reviewers: Ayal, rengolin, gilr, SjoerdMeijer Reviewed By: SjoerdMeijer Differential Revision: https://reviews.llvm.org/D80787 --- llvm/lib/Transforms/Vectorize/VPlan.h | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/llvm/lib/Transforms/Vectorize/VPlan.h b/llvm/lib/Transforms/Vectorize/VPlan.h index 1d07d5cff8a3..c3097e1e1f14 100644 --- a/llvm/lib/Transforms/Vectorize/VPlan.h +++ b/llvm/lib/Transforms/Vectorize/VPlan.h @@ -270,10 +270,20 @@ struct VPTransformState { return Callback.getOrCreateVectorValues(VPValue2Value[Def], Part); } - /// Get the generated Value for a given VPValue and given Part and Lane. Note - /// that as per-lane Defs are still created by ILV and managed in its ValueMap - /// this method currently just delegates the call to ILV. + /// Get the generated Value for a given VPValue and given Part and Lane. Value *get(VPValue *Def, const VPIteration &Instance) { + // If the Def is managed directly by VPTransformState, extract the lane from + // the relevant part. Note that currently only VPInstructions and external + // defs are managed by VPTransformState. Other Defs are still created by ILV + // and managed in its ValueMap. For those this method currently just + // delegates the call to ILV below. + if (Data.PerPartOutput.count(Def)) { + auto *VecPart = Data.PerPartOutput[Def][Instance.Part]; + // TODO: Cache created scalar values. + return Builder.CreateExtractElement(VecPart, + Builder.getInt32(Instance.Lane)); + } + return Callback.getOrCreateScalarValue(VPValue2Value[Def], Instance); }