mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 11:13:28 +01:00
[VPlan] Add & use VPValue operands for VPWidenRecipe (NFC).
This patch adds VPValue version of the instruction operands to VPWidenRecipe and uses them during code-generation. Similar to D76373 this reduces ingredient def-use usage by ILV as a step towards full VPlan-based def-use relations. Reviewers: rengolin, Ayal, gilr Reviewed By: gilr Differential Revision: https://reviews.llvm.org/D76992
This commit is contained in:
parent
3876a09759
commit
1d82c3d44a
@ -407,7 +407,8 @@ public:
|
||||
BasicBlock *createVectorizedLoopSkeleton();
|
||||
|
||||
/// Widen a single instruction within the innermost loop.
|
||||
void widenInstruction(Instruction &I);
|
||||
void widenInstruction(Instruction &I, VPUser &Operands,
|
||||
VPTransformState &State);
|
||||
|
||||
/// Widen a single call instruction within the innermost loop.
|
||||
void widenCallInstruction(CallInst &I, VPUser &ArgOperands,
|
||||
@ -4231,7 +4232,8 @@ static bool mayDivideByZero(Instruction &I) {
|
||||
return !CInt || CInt->isZero();
|
||||
}
|
||||
|
||||
void InnerLoopVectorizer::widenInstruction(Instruction &I) {
|
||||
void InnerLoopVectorizer::widenInstruction(Instruction &I, VPUser &User,
|
||||
VPTransformState &State) {
|
||||
switch (I.getOpcode()) {
|
||||
case Instruction::Call:
|
||||
case Instruction::Br:
|
||||
@ -4263,8 +4265,8 @@ void InnerLoopVectorizer::widenInstruction(Instruction &I) {
|
||||
|
||||
for (unsigned Part = 0; Part < UF; ++Part) {
|
||||
SmallVector<Value *, 2> Ops;
|
||||
for (Value *Op : I.operands())
|
||||
Ops.push_back(getOrCreateVectorValue(Op, Part));
|
||||
for (VPValue *VPOp : User.operands())
|
||||
Ops.push_back(State.get(VPOp, Part));
|
||||
|
||||
Value *V = Builder.CreateNAryOp(I.getOpcode(), Ops);
|
||||
|
||||
@ -4285,8 +4287,8 @@ void InnerLoopVectorizer::widenInstruction(Instruction &I) {
|
||||
auto *Cmp = cast<CmpInst>(&I);
|
||||
setDebugLocFromInst(Builder, Cmp);
|
||||
for (unsigned Part = 0; Part < UF; ++Part) {
|
||||
Value *A = getOrCreateVectorValue(Cmp->getOperand(0), Part);
|
||||
Value *B = getOrCreateVectorValue(Cmp->getOperand(1), Part);
|
||||
Value *A = State.get(User.getOperand(0), Part);
|
||||
Value *B = State.get(User.getOperand(1), Part);
|
||||
Value *C = nullptr;
|
||||
if (FCmp) {
|
||||
// Propagate fast math flags.
|
||||
@ -4323,7 +4325,7 @@ void InnerLoopVectorizer::widenInstruction(Instruction &I) {
|
||||
(VF == 1) ? CI->getType() : VectorType::get(CI->getType(), VF);
|
||||
|
||||
for (unsigned Part = 0; Part < UF; ++Part) {
|
||||
Value *A = getOrCreateVectorValue(CI->getOperand(0), Part);
|
||||
Value *A = State.get(User.getOperand(0), Part);
|
||||
Value *Cast = Builder.CreateCast(CI->getOpcode(), A, DestTy);
|
||||
VectorLoopValueMap.setVectorValue(&I, Part, Cast);
|
||||
addMetadata(Cast, &I);
|
||||
@ -6936,12 +6938,7 @@ VPWidenCallRecipe *VPRecipeBuilder::tryToWidenCall(CallInst *CI, VFRange &Range,
|
||||
if (!LoopVectorizationPlanner::getDecisionAndClampRange(willWiden, Range))
|
||||
return nullptr;
|
||||
|
||||
// Success: widen this call.
|
||||
auto VPValues = map_range(CI->arg_operands(), [&Plan](Value *Op) {
|
||||
return Plan.getOrAddVPValue(Op);
|
||||
});
|
||||
|
||||
return new VPWidenCallRecipe(*CI, VPValues);
|
||||
return new VPWidenCallRecipe(*CI, Plan.mapToVPValues(CI->arg_operands()));
|
||||
}
|
||||
|
||||
bool VPRecipeBuilder::shouldWiden(Instruction *I, VFRange &Range) const {
|
||||
@ -7004,7 +7001,7 @@ VPWidenRecipe *VPRecipeBuilder::tryToWiden(Instruction *I, VPlan &Plan) const {
|
||||
return nullptr;
|
||||
|
||||
// Success: widen this instruction.
|
||||
return new VPWidenRecipe(*I);
|
||||
return new VPWidenRecipe(*I, Plan.mapToVPValues(I->operands()));
|
||||
}
|
||||
|
||||
VPBasicBlock *VPRecipeBuilder::handleReplication(
|
||||
@ -7411,7 +7408,7 @@ void VPWidenSelectRecipe::execute(VPTransformState &State) {
|
||||
}
|
||||
|
||||
void VPWidenRecipe::execute(VPTransformState &State) {
|
||||
State.ILV->widenInstruction(Ingredient);
|
||||
State.ILV->widenInstruction(Ingredient, User, State);
|
||||
}
|
||||
|
||||
void VPWidenGEPRecipe::execute(VPTransformState &State) {
|
||||
|
@ -768,8 +768,13 @@ class VPWidenRecipe : public VPRecipeBase {
|
||||
/// Hold the instruction to be widened.
|
||||
Instruction &Ingredient;
|
||||
|
||||
/// Hold VPValues for the operands of the ingredient.
|
||||
VPUser User;
|
||||
|
||||
public:
|
||||
VPWidenRecipe(Instruction &I) : VPRecipeBase(VPWidenSC), Ingredient(I) {}
|
||||
template <typename IterT>
|
||||
VPWidenRecipe(Instruction &I, iterator_range<IterT> Operands)
|
||||
: VPRecipeBase(VPWidenSC), Ingredient(I), User(Operands) {}
|
||||
|
||||
~VPWidenRecipe() override = default;
|
||||
|
||||
@ -1620,6 +1625,16 @@ public:
|
||||
/// Dump the plan to stderr (for debugging).
|
||||
void dump() const;
|
||||
|
||||
/// Returns a range mapping the values the range \p Operands to their
|
||||
/// corresponding VPValues.
|
||||
iterator_range<mapped_iterator<Use *, std::function<VPValue *(Value *)>>>
|
||||
mapToVPValues(User::op_range Operands) {
|
||||
std::function<VPValue *(Value *)> Fn = [this](Value *Op) {
|
||||
return getOrAddVPValue(Op);
|
||||
};
|
||||
return map_range(Operands, Fn);
|
||||
}
|
||||
|
||||
private:
|
||||
/// Add to the given dominator tree the header block and every new basic block
|
||||
/// that was created between it and the latch block, inclusive.
|
||||
|
@ -72,7 +72,8 @@ void VPlanTransforms::VPInstructionsToVPRecipes(
|
||||
} else if (GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(Inst)) {
|
||||
NewRecipe = new VPWidenGEPRecipe(GEP, OrigLoop);
|
||||
} else
|
||||
NewRecipe = new VPWidenRecipe(*Inst);
|
||||
NewRecipe =
|
||||
new VPWidenRecipe(*Inst, Plan->mapToVPValues(Inst->operands()));
|
||||
|
||||
NewRecipe->insertBefore(Ingredient);
|
||||
Ingredient->eraseFromParent();
|
||||
|
Loading…
Reference in New Issue
Block a user