]> granicus.if.org Git - llvm/commitdiff
[SLP] Rework `findBuildAggregate()` from ercursive form to iterative, NFC.
authorAlexey Bataev <a.bataev@hotmail.com>
Mon, 20 Feb 2017 07:49:39 +0000 (07:49 +0000)
committerAlexey Bataev <a.bataev@hotmail.com>
Mon, 20 Feb 2017 07:49:39 +0000 (07:49 +0000)
Reviewers: mkuper

Subscribers: llvm-commits, mzolotukhin

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

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

lib/Transforms/Vectorize/SLPVectorizer.cpp

index 33b4f986015852a949a1c086fafb3aa3c08832be..5c95f88a3f98eba3141143491a87ddb5f195c838 100644 (file)
@@ -4614,16 +4614,19 @@ static bool findBuildVector(InsertElementInst *FirstInsertElem,
 static bool findBuildAggregate(InsertValueInst *IV,
                                SmallVectorImpl<Value *> &BuildVector,
                                SmallVectorImpl<Value *> &BuildVectorOpds) {
-  if (!IV->hasOneUse())
-    return false;
-  Value *V = IV->getAggregateOperand();
-  if (!isa<UndefValue>(V)) {
-    InsertValueInst *I = dyn_cast<InsertValueInst>(V);
-    if (!I || !findBuildAggregate(I, BuildVector, BuildVectorOpds))
+  Value *V = IV;
+  do {
+    BuildVector.push_back(IV);
+    BuildVectorOpds.push_back(IV->getInsertedValueOperand());
+    V = IV->getAggregateOperand();
+    if (isa<UndefValue>(V))
+      break;
+    IV = dyn_cast<InsertValueInst>(V);
+    if (!IV || !IV->hasOneUse())
       return false;
-  }
-  BuildVector.push_back(IV);
-  BuildVectorOpds.push_back(IV->getInsertedValueOperand());
+  } while (true);
+  std::reverse(BuildVector.begin(), BuildVector.end());
+  std::reverse(BuildVectorOpds.begin(), BuildVectorOpds.end());
   return true;
 }