From: Florian Hahn Date: Tue, 19 May 2020 13:03:18 +0000 (+0100) Subject: [VPlan] Remove unique_ptr from VPBranchOnRecipeMask (NFC). X-Git-Tag: llvmorg-12-init~5688 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=66ad107452893517da93d25e58c16ba4669a00eb;p=platform%2Fupstream%2Fllvm.git [VPlan] Remove unique_ptr from VPBranchOnRecipeMask (NFC). We can remove a dynamic memory allocation, by checking the number of operands: no operands = all true, 1 operand = mask. Reviewers: Ayal, gilr, rengolin Reviewed By: Ayal Differential Revision: https://reviews.llvm.org/D80110 --- diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp index 9b03c06..76b7030 100644 --- a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp +++ b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp @@ -7528,15 +7528,14 @@ void VPBranchOnMaskRecipe::execute(VPTransformState &State) { unsigned Lane = State.Instance->Lane; Value *ConditionBit = nullptr; - if (!User) // Block in mask is all-one. - ConditionBit = State.Builder.getTrue(); - else { - VPValue *BlockInMask = User->getOperand(0); + VPValue *BlockInMask = getMask(); + if (BlockInMask) { ConditionBit = State.get(BlockInMask, Part); if (ConditionBit->getType()->isVectorTy()) ConditionBit = State.Builder.CreateExtractElement( ConditionBit, State.Builder.getInt32(Lane)); - } + } else // Block in mask is all-one. + ConditionBit = State.Builder.getTrue(); // Replace the temporary unreachable terminator with a new conditional branch, // whose two destinations will be set later when they are created. diff --git a/llvm/lib/Transforms/Vectorize/VPlan.h b/llvm/lib/Transforms/Vectorize/VPlan.h index 1db5cbd..97d6d04 100644 --- a/llvm/lib/Transforms/Vectorize/VPlan.h +++ b/llvm/lib/Transforms/Vectorize/VPlan.h @@ -1063,12 +1063,12 @@ public: /// A recipe for generating conditional branches on the bits of a mask. class VPBranchOnMaskRecipe : public VPRecipeBase { - std::unique_ptr User; + VPUser User; public: VPBranchOnMaskRecipe(VPValue *BlockInMask) : VPRecipeBase(VPBranchOnMaskSC) { if (BlockInMask) // nullptr means all-one mask. - User.reset(new VPUser({BlockInMask})); + User.addOperand(BlockInMask); } /// Method to support type inquiry through isa, cast, and dyn_cast. @@ -1084,12 +1084,20 @@ public: void print(raw_ostream &O, const Twine &Indent, VPSlotTracker &SlotTracker) const override { O << " +\n" << Indent << "\"BRANCH-ON-MASK "; - if (User) - User->getOperand(0)->print(O, SlotTracker); + if (VPValue *Mask = getMask()) + Mask->print(O, SlotTracker); else O << " All-One"; O << "\\l\""; } + + /// Return the mask used by this recipe. Note that a full mask is represented + /// by a nullptr. + VPValue *getMask() const { + assert(User.getNumOperands() <= 1 && "should have either 0 or 1 operands"); + // Mask is optional. + return User.getNumOperands() == 1 ? User.getOperand(0) : nullptr; + } }; /// VPPredInstPHIRecipe is a recipe for generating the phi nodes needed when