diff --git a/llvm/lib/Transforms/Vectorize/VPlan.h b/llvm/lib/Transforms/Vectorize/VPlan.h --- a/llvm/lib/Transforms/Vectorize/VPlan.h +++ b/llvm/lib/Transforms/Vectorize/VPlan.h @@ -675,7 +675,7 @@ /// While as any Recipe it may generate a sequence of IR instructions when /// executed, these instructions would always form a single-def expression as /// the VPInstruction is also a single def-use vertex. -class VPInstruction : public VPUser, public VPRecipeBase { +class VPInstruction : public VPUser, public VPValue, public VPRecipeBase { friend class VPlanSlp; public: @@ -705,7 +705,7 @@ public: VPInstruction(unsigned Opcode, ArrayRef Operands) - : VPUser(VPValue::VPInstructionSC, Operands), + : VPUser(Operands), VPValue(VPValue::VPInstructionSC), VPRecipeBase(VPRecipeBase::VPInstructionSC), Opcode(Opcode) {} VPInstruction(unsigned Opcode, std::initializer_list Operands) diff --git a/llvm/lib/Transforms/Vectorize/VPlanSLP.cpp b/llvm/lib/Transforms/Vectorize/VPlanSLP.cpp --- a/llvm/lib/Transforms/Vectorize/VPlanSLP.cpp +++ b/llvm/lib/Transforms/Vectorize/VPlanSLP.cpp @@ -161,7 +161,7 @@ unsigned OperandIndex) { SmallVector Operands; for (VPValue *V : Values) { - auto *U = cast(V); + auto *U = cast(V); Operands.push_back(U->getOperand(OperandIndex)); } return Operands; @@ -230,10 +230,13 @@ cast(V2), IAI); unsigned Score = 0; - for (unsigned I = 0, EV1 = cast(V1)->getNumOperands(); I < EV1; ++I) - for (unsigned J = 0, EV2 = cast(V2)->getNumOperands(); J < EV2; ++J) - Score += getLAScore(cast(V1)->getOperand(I), - cast(V2)->getOperand(J), MaxLevel - 1, IAI); + for (unsigned I = 0, EV1 = cast(V1)->getNumOperands(); I < EV1; + ++I) + for (unsigned J = 0, EV2 = cast(V2)->getNumOperands(); + J < EV2; ++J) + Score += + getLAScore(cast(V1)->getOperand(I), + cast(V2)->getOperand(J), MaxLevel - 1, IAI); return Score; } diff --git a/llvm/lib/Transforms/Vectorize/VPlanValue.h b/llvm/lib/Transforms/Vectorize/VPlanValue.h --- a/llvm/lib/Transforms/Vectorize/VPlanValue.h +++ b/llvm/lib/Transforms/Vectorize/VPlanValue.h @@ -76,7 +76,7 @@ /// are actually instantiated. Values of this enumeration are kept in the /// SubclassID field of the VPValue objects. They are used for concrete /// type identification. - enum { VPValueSC, VPUserSC, VPInstructionSC }; + enum { VPValueSC, VPInstructionSC }; VPValue(Value *UV = nullptr) : VPValue(VPValueSC, UV) {} VPValue(const VPValue &) = delete; @@ -129,23 +129,19 @@ /// This class augments VPValue with operands which provide the inverse def-use /// edges from VPValue's users to their defs. -class VPUser : public VPValue { +class VPUser { SmallVector Operands; -protected: - VPUser(const unsigned char SC) : VPValue(SC) {} - VPUser(const unsigned char SC, ArrayRef Operands) : VPValue(SC) { +public: + VPUser() {} + VPUser(ArrayRef Operands) { for (VPValue *Operand : Operands) addOperand(Operand); } -public: - VPUser() : VPValue(VPValue::VPUserSC) {} - VPUser(ArrayRef Operands) : VPUser(VPValue::VPUserSC, Operands) {} VPUser(std::initializer_list Operands) : VPUser(ArrayRef(Operands)) {} - template - VPUser(iterator_range Operands) : VPValue(VPValue::VPUserSC) { + template VPUser(iterator_range Operands) { for (VPValue *Operand : Operands) addOperand(Operand); } @@ -153,12 +149,6 @@ VPUser(const VPUser &) = delete; VPUser &operator=(const VPUser &) = delete; - /// Method to support type inquiry through isa, cast, and dyn_cast. - static inline bool classof(const VPValue *V) { - return V->getVPValueID() >= VPUserSC && - V->getVPValueID() <= VPInstructionSC; - } - void addOperand(VPValue *Operand) { Operands.push_back(Operand); Operand->addUser(*this);