diff options
author | Alexey Bataev <a.bataev@hotmail.com> | 2017-02-20 07:49:39 +0000 |
---|---|---|
committer | Alexey Bataev <a.bataev@hotmail.com> | 2017-02-20 07:49:39 +0000 |
commit | 2f6b124e01029ac057b1bc1568ea08be02a0110f (patch) | |
tree | cd741c15525959564b555050513fd1d30a9d0679 /llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp | |
parent | c6c68f5958f3d86c85fe2c2b28e68bbdebc79f72 (diff) | |
download | bcm5719-llvm-2f6b124e01029ac057b1bc1568ea08be02a0110f.tar.gz bcm5719-llvm-2f6b124e01029ac057b1bc1568ea08be02a0110f.zip |
[SLP] Rework `findBuildAggregate()` from ercursive form to iterative, NFC.
Reviewers: mkuper
Subscribers: llvm-commits, mzolotukhin
Differential Revision: https://reviews.llvm.org/D30103
llvm-svn: 295641
Diffstat (limited to 'llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp')
-rw-r--r-- | llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp index 33b4f986015..5c95f88a3f9 100644 --- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp +++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp @@ -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; } |