From a78e86e6beb2d62196fa42be9f4a2994823f71f3 Mon Sep 17 00:00:00 2001 From: Alexey Bataev Date: Tue, 6 Apr 2021 05:59:03 -0700 Subject: [PATCH] [SLP]Avoid multiple attempts to vectorize CmpInsts. No need to lookup through and/or try to vectorize operands of the CmpInst instructions during attempts to find/vectorize min/max reductions. Compiler implements postanalysis of the CmpInsts so we can skip extra attempts in tryToVectorizeHorReductionOrInstOperands and save compile time. Differential Revision: https://reviews.llvm.org/D99950 --- llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp index 86c2569..76bfdcc 100644 --- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp +++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp @@ -7495,6 +7495,9 @@ static bool tryToVectorizeHorReductionOrInstOperands( // horizontal reduction. // Interrupt the process if the Root instruction itself was vectorized or all // sub-trees not higher that RecursionMaxDepth were analyzed/vectorized. + // Skip the analysis of CmpInsts.Compiler implements postanalysis of the + // CmpInsts so we can skip extra attempts in + // tryToVectorizeHorReductionOrInstOperands and save compile time. SmallVector, 8> Stack(1, {Root, 0}); SmallPtrSet VisitedInstrs; bool Res = false; @@ -7531,7 +7534,8 @@ static bool tryToVectorizeHorReductionOrInstOperands( // Set P to nullptr to avoid re-analysis of phi node in // matchAssociativeReduction function unless this is the root node. P = nullptr; - if (Vectorize(Inst, R)) { + // Do not try to vectorize CmpInst operands, this is done separately. + if (!isa(Inst) && Vectorize(Inst, R)) { Res = true; continue; } @@ -7543,7 +7547,10 @@ static bool tryToVectorizeHorReductionOrInstOperands( for (auto *Op : Inst->operand_values()) if (VisitedInstrs.insert(Op).second) if (auto *I = dyn_cast(Op)) - if (!isa(I) && !R.isDeleted(I) && I->getParent() == BB) + // Do not try to vectorize CmpInst operands, this is done + // separately. + if (!isa(I) && !isa(I) && !R.isDeleted(I) && + I->getParent() == BB) Stack.emplace_back(I, Level); } return Res; -- 2.7.4