From: Alexey Bataev Date: Mon, 20 Feb 2017 07:49:39 +0000 (+0000) Subject: [SLP] Rework `findBuildAggregate()` from ercursive form to iterative, NFC. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1fb4f8f03a266001bedc16428b9013b4f270dee1;p=llvm [SLP] Rework `findBuildAggregate()` from ercursive form to iterative, NFC. 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 --- diff --git a/lib/Transforms/Vectorize/SLPVectorizer.cpp b/lib/Transforms/Vectorize/SLPVectorizer.cpp index 33b4f986015..5c95f88a3f9 100644 --- a/lib/Transforms/Vectorize/SLPVectorizer.cpp +++ b/lib/Transforms/Vectorize/SLPVectorizer.cpp @@ -4614,16 +4614,19 @@ static bool findBuildVector(InsertElementInst *FirstInsertElem, static bool findBuildAggregate(InsertValueInst *IV, SmallVectorImpl &BuildVector, SmallVectorImpl &BuildVectorOpds) { - if (!IV->hasOneUse()) - return false; - Value *V = IV->getAggregateOperand(); - if (!isa(V)) { - InsertValueInst *I = dyn_cast(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(V)) + break; + IV = dyn_cast(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; }