diff options
author | Richard Sandiford <rsandifo@linux.vnet.ibm.com> | 2013-12-23 14:51:56 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@linux.vnet.ibm.com> | 2013-12-23 14:51:56 +0000 |
commit | 1fb5c13e3acc890f8ec8154721464dae336ee5ec (patch) | |
tree | b82f5a1d08594a70d19d65a96f1799a9fd0b460c /llvm/lib/Transforms/Scalar/Scalarizer.cpp | |
parent | 3548cbb98044c569e6fef10d6b9a1b6c68c8bbf7 (diff) | |
download | bcm5719-llvm-1fb5c13e3acc890f8ec8154721464dae336ee5ec.tar.gz bcm5719-llvm-1fb5c13e3acc890f8ec8154721464dae336ee5ec.zip |
Fix Scalarizer insertion point when replacing PHIs with insertelements
If the Scalarizer scalarized a vector PHI but could not scalarize
all uses of it, it would insert a series of insertelements to reconstruct
the vector PHI value from the scalar ones. The problem was that it would
emit these insertelements immediately after the PHI, even if there were
other PHIs after it.
llvm-svn: 197909
Diffstat (limited to 'llvm/lib/Transforms/Scalar/Scalarizer.cpp')
-rw-r--r-- | llvm/lib/Transforms/Scalar/Scalarizer.cpp | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/Scalar/Scalarizer.cpp b/llvm/lib/Transforms/Scalar/Scalarizer.cpp index 33ccb7350d8..e614ecee53a 100644 --- a/llvm/lib/Transforms/Scalar/Scalarizer.cpp +++ b/llvm/lib/Transforms/Scalar/Scalarizer.cpp @@ -638,8 +638,11 @@ bool Scalarizer::finish() { // InsertElements. Type *Ty = Op->getType(); Value *Res = UndefValue::get(Ty); + BasicBlock *BB = Op->getParent(); unsigned Count = Ty->getVectorNumElements(); - IRBuilder<> Builder(Op->getParent(), Op); + IRBuilder<> Builder(BB, Op); + if (isa<PHINode>(Op)) + Builder.SetInsertPoint(BB, BB->getFirstInsertionPt()); for (unsigned I = 0; I < Count; ++I) Res = Builder.CreateInsertElement(Res, CV[I], Builder.getInt32(I), Op->getName() + ".upto" + Twine(I)); |