From: David Green Date: Tue, 20 Jul 2021 15:44:50 +0000 (+0100) Subject: [LV] Change interface of getReductionPatternCost to return Optional X-Git-Tag: llvmorg-14-init~892 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=4272e64acd6cc1abfae45ab3458915f52bd3c4e9;p=platform%2Fupstream%2Fllvm.git [LV] Change interface of getReductionPatternCost to return Optional Currently the Instruction cost of getReductionPatternCost returns an Invalid cost to specify "did not find the pattern". This changes that to return an Optional with None specifying not found, allowing Invalid to mean an infinite cost as is used elsewhere. Differential Revision: https://reviews.llvm.org/D106140 --- diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp index 213a272..4d87897 100644 --- a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp +++ b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp @@ -1695,9 +1695,9 @@ private: /// Return the cost of instructions in an inloop reduction pattern, if I is /// part of that pattern. - InstructionCost getReductionPatternCost(Instruction *I, ElementCount VF, - Type *VectorTy, - TTI::TargetCostKind CostKind); + Optional + getReductionPatternCost(Instruction *I, ElementCount VF, Type *VectorTy, + TTI::TargetCostKind CostKind); /// Calculate vectorization cost of memory instruction \p I. InstructionCost getMemoryInstructionCost(Instruction *I, ElementCount VF); @@ -7125,11 +7125,11 @@ LoopVectorizationCostModel::getInterleaveGroupCost(Instruction *I, return Cost; } -InstructionCost LoopVectorizationCostModel::getReductionPatternCost( +Optional LoopVectorizationCostModel::getReductionPatternCost( Instruction *I, ElementCount VF, Type *Ty, TTI::TargetCostKind CostKind) { // Early exit for no inloop reductions if (InLoopReductionChains.empty() || VF.isScalar() || !isa(Ty)) - return InstructionCost::getInvalid(); + return None; auto *VectorTy = cast(Ty); // We are looking for a pattern of, and finding the minimal acceptable cost: @@ -7148,20 +7148,20 @@ InstructionCost LoopVectorizationCostModel::getReductionPatternCost( if ((RetI->getOpcode() == Instruction::SExt || RetI->getOpcode() == Instruction::ZExt)) { if (!RetI->hasOneUser()) - return InstructionCost::getInvalid(); + return None; RetI = RetI->user_back(); } if (RetI->getOpcode() == Instruction::Mul && RetI->user_back()->getOpcode() == Instruction::Add) { if (!RetI->hasOneUser()) - return InstructionCost::getInvalid(); + return None; RetI = RetI->user_back(); } // Test if the found instruction is a reduction, and if not return an invalid // cost specifying the parent to use the original cost modelling. if (!InLoopReductionImmediateChains.count(RetI)) - return InstructionCost::getInvalid(); + return None; // Find the reduction this chain is a part of and calculate the basic cost of // the reduction on its own. @@ -7195,7 +7195,7 @@ InstructionCost LoopVectorizationCostModel::getReductionPatternCost( TTI.getCastInstrCost(RedOp->getOpcode(), VectorTy, ExtType, TTI::CastContextHint::None, CostKind, RedOp); if (RedCost.isValid() && RedCost < BaseCost + ExtCost) - return I == RetI ? *RedCost.getValue() : 0; + return I == RetI ? RedCost : 0; } else if (RedOp && RedOp->getOpcode() == Instruction::Mul) { Instruction *Mul = RedOp; Instruction *Op0 = dyn_cast(Mul->getOperand(0)); @@ -7218,7 +7218,7 @@ InstructionCost LoopVectorizationCostModel::getReductionPatternCost( CostKind); if (RedCost.isValid() && RedCost < ExtCost * 2 + MulCost + BaseCost) - return I == RetI ? *RedCost.getValue() : 0; + return I == RetI ? RedCost : 0; } else { InstructionCost MulCost = TTI.getArithmeticInstrCost(Mul->getOpcode(), VectorTy, CostKind); @@ -7228,11 +7228,11 @@ InstructionCost LoopVectorizationCostModel::getReductionPatternCost( CostKind); if (RedCost.isValid() && RedCost < MulCost + BaseCost) - return I == RetI ? *RedCost.getValue() : 0; + return I == RetI ? RedCost : 0; } } - return I == RetI ? BaseCost : InstructionCost::getInvalid(); + return I == RetI ? Optional(BaseCost) : None; } InstructionCost @@ -7637,10 +7637,8 @@ LoopVectorizationCostModel::getInstructionCost(Instruction *I, ElementCount VF, return 0; // Detect reduction patterns - InstructionCost RedCost; - if ((RedCost = getReductionPatternCost(I, VF, VectorTy, CostKind)) - .isValid()) - return RedCost; + if (auto RedCost = getReductionPatternCost(I, VF, VectorTy, CostKind)) + return *RedCost; // Certain instructions can be cheaper to vectorize if they have a constant // second vector operand. One example of this are shifts on x86. @@ -7781,10 +7779,8 @@ LoopVectorizationCostModel::getInstructionCost(Instruction *I, ElementCount VF, } // Detect reduction patterns - InstructionCost RedCost; - if ((RedCost = getReductionPatternCost(I, VF, VectorTy, CostKind)) - .isValid()) - return RedCost; + if (auto RedCost = getReductionPatternCost(I, VF, VectorTy, CostKind)) + return *RedCost; Type *SrcScalarTy = I->getOperand(0)->getType(); Type *SrcVecTy =