diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp --- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp +++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp @@ -3865,15 +3865,39 @@ TreeEntry *TE = newTreeEntry(VL, Bundle /*vectorized*/, S, UserTreeIdx, ReuseShuffleIndicies); LLVM_DEBUG(dbgs() << "SLP: added a vector of GEPs.\n"); - TE->setOperandsInOrder(); - for (unsigned i = 0, e = 2; i < e; ++i) { - ValueList Operands; - // Prepare the operand vector. - for (Value *V : VL) - Operands.push_back(cast(V)->getOperand(i)); - - buildTree_rec(Operands, Depth + 1, {TE, i}); + SmallVector Operands; + Operands.emplace_back(); + // Prepare the operand vector for pointer operands. + for (Value *V : VL) + Operands.back().push_back( + cast(V)->getPointerOperand()); + TE->setOperand(0, Operands.back()); + // Need to cast all indices to the same type before vectorization to + // avoid crash. + const int IndexIdx = 1; + Operands.emplace_back(); + Type *VL0Ty = VL0->getOperand(IndexIdx)->getType(); + Type *Ty = all_of(VL, + [VL0Ty](Value *V) { + return VL0Ty == cast(V) + ->getOperand(IndexIdx) + ->getType(); + }) + ? VL0Ty + : DL->getIndexType(cast(VL0) + ->getPointerOperandType() + ->getScalarType()); + // Prepare the operand vector. + for (Value *V : VL) { + auto *Op = cast(V)->getOperand(IndexIdx); + auto *CI = cast(Op); + Operands.back().push_back(ConstantExpr::getIntegerCast( + CI, Ty, CI->getValue().isSignBitSet())); } + TE->setOperand(IndexIdx, Operands.back()); + + for (unsigned I = 0, Ops = Operands.size(); I < Ops; ++I) + buildTree_rec(Operands[I], Depth + 1, {TE, I}); return; } case Instruction::Store: { @@ -6276,25 +6300,10 @@ Value *Op0 = vectorizeTree(E->getOperand(0)); - std::vector OpVecs; - for (int j = 1, e = cast(VL0)->getNumOperands(); j < e; - ++j) { - ValueList &VL = E->getOperand(j); - // Need to cast all elements to the same type before vectorization to - // avoid crash. - Type *VL0Ty = VL0->getOperand(j)->getType(); - Type *Ty = llvm::all_of( - VL, [VL0Ty](Value *V) { return VL0Ty == V->getType(); }) - ? VL0Ty - : DL->getIndexType(cast(VL0) - ->getPointerOperandType() - ->getScalarType()); - for (Value *&V : VL) { - auto *CI = cast(V); - V = ConstantExpr::getIntegerCast(CI, Ty, - CI->getValue().isSignBitSet()); - } - Value *OpVec = vectorizeTree(VL); + SmallVector OpVecs; + for (int J = 1, N = cast(VL0)->getNumOperands(); J < N; + ++J) { + Value *OpVec = vectorizeTree(E->getOperand(J)); OpVecs.push_back(OpVec); }