]> granicus.if.org Git - llvm/commitdiff
[SLP] Allow vectorization of the instruction from the same basic blocks only, NFC.
authorAlexey Bataev <a.bataev@hotmail.com>
Fri, 28 Jul 2017 20:11:16 +0000 (20:11 +0000)
committerAlexey Bataev <a.bataev@hotmail.com>
Fri, 28 Jul 2017 20:11:16 +0000 (20:11 +0000)
Summary:
After some changes in SLP vectorizer we missed some additional checks to
limit the instructions for vectorization. We should not perform analysis
of the instructions if the parent of instruction is not the same as the
parent of the first instruction in the tree or it was analyzed already.

Subscribers: mzolotukhin

Differential Revision: https://reviews.llvm.org/D34881

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@309425 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Vectorize/SLPVectorizer.cpp

index 9931c78fcbc86f87f94a1101fe97452325810cbc..a0da1a150745c1e5a39be5ee4d356296fefdb4e9 100644 (file)
@@ -4776,7 +4776,7 @@ static bool tryToVectorizeHorReductionOrInstOperands(
   if (!Root)
     return false;
 
-  if (Root->getParent() != BB)
+  if (Root->getParent() != BB || isa<PHINode>(Root))
     return false;
   // Start analysis starting from Root instruction. If horizontal reduction is
   // found, try to vectorize it. If it is not a horizontal reduction or
@@ -4797,7 +4797,7 @@ static bool tryToVectorizeHorReductionOrInstOperands(
     if (!V)
       continue;
     auto *Inst = dyn_cast<Instruction>(V);
-    if (!Inst || isa<PHINode>(Inst))
+    if (!Inst)
       continue;
     if (auto *BI = dyn_cast<BinaryOperator>(Inst)) {
       HorizontalReduction HorRdx;
@@ -4831,9 +4831,14 @@ static bool tryToVectorizeHorReductionOrInstOperands(
     }
 
     // Try to vectorize operands.
+    // Continue analysis for the instruction from the same basic block only to
+    // save compile time.
     if (++Level < RecursionMaxDepth)
       for (auto *Op : Inst->operand_values())
-        Stack.emplace_back(Op, Level);
+        if (VisitedInstrs.insert(Op).second)
+          if (auto *I = dyn_cast<Instruction>(Op))
+            if (!isa<PHINode>(Inst) && I->getParent() == BB)
+              Stack.emplace_back(Op, Level);
   }
   return Res;
 }