diff options
Diffstat (limited to 'llvm/lib/Transforms/Scalar/Scalarizer.cpp')
| -rw-r--r-- | llvm/lib/Transforms/Scalar/Scalarizer.cpp | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/llvm/lib/Transforms/Scalar/Scalarizer.cpp b/llvm/lib/Transforms/Scalar/Scalarizer.cpp index 8ef6b69673be..6b7419abe1d1 100644 --- a/llvm/lib/Transforms/Scalar/Scalarizer.cpp +++ b/llvm/lib/Transforms/Scalar/Scalarizer.cpp @@ -66,6 +66,15 @@ static cl::opt<bool> namespace { +BasicBlock::iterator skipPastPhiNodesAndDbg(BasicBlock::iterator Itr) { + BasicBlock *BB = Itr->getParent(); + if (isa<PHINode>(Itr)) + Itr = BB->getFirstInsertionPt(); + if (Itr != BB->end()) + Itr = skipDebugIntrinsics(Itr); + return Itr; +} + // Used to store the scattered form of a vector. using ValueVector = SmallVector<Value *, 8>; @@ -371,10 +380,11 @@ Scatterer ScalarizerVisitor::scatter(Instruction *Point, Value *V) { return Scatterer(Point->getParent(), Point->getIterator(), UndefValue::get(V->getType())); // Put the scattered form of an instruction directly after the - // instruction. + // instruction, skipping over PHI nodes and debug intrinsics. BasicBlock *BB = VOp->getParent(); - return Scatterer(BB, std::next(BasicBlock::iterator(VOp)), - V, &Scattered[V]); + return Scatterer( + BB, skipPastPhiNodesAndDbg(std::next(BasicBlock::iterator(VOp))), V, + &Scattered[V]); } // In the fallback case, just put the scattered before Point and // keep the result local to Point. @@ -530,7 +540,7 @@ bool ScalarizerVisitor::splitCall(CallInst &CI) { return false; unsigned NumElems = cast<FixedVectorType>(VT)->getNumElements(); - unsigned NumArgs = CI.getNumArgOperands(); + unsigned NumArgs = CI.arg_size(); ValueVector ScalarOperands(NumArgs); SmallVector<Scatterer, 8> Scattered(NumArgs); |
