diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp --- a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp +++ b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp @@ -7528,15 +7528,14 @@ 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 --- a/llvm/lib/Transforms/Vectorize/VPlan.h +++ b/llvm/lib/Transforms/Vectorize/VPlan.h @@ -1063,12 +1063,12 @@ /// 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 @@ 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