/// \returns True if the ExtractElement/ExtractValue instructions in VL can
/// be vectorized to use the original vector (or aggregate "bitcast" to a vector).
- bool canReuseExtract(ArrayRef<Value *> VL, unsigned Opcode) const;
+ bool canReuseExtract(ArrayRef<Value *> VL, Value *OpValue) const;
/// Vectorize a single entry in the tree.
Value *vectorizeTree(TreeEntry *E);
}
case Instruction::ExtractValue:
case Instruction::ExtractElement: {
- bool Reuse = canReuseExtract(VL, Opcode);
+ bool Reuse = canReuseExtract(VL, VL0);
if (Reuse) {
DEBUG(dbgs() << "SLP: Reusing extract sequence.\n");
} else {
return N;
}
-bool BoUpSLP::canReuseExtract(ArrayRef<Value *> VL, unsigned Opcode) const {
- assert(Opcode == Instruction::ExtractElement ||
- Opcode == Instruction::ExtractValue);
- assert(Opcode == getSameOpcode(VL) && "Invalid opcode");
+bool BoUpSLP::canReuseExtract(ArrayRef<Value *> VL, Value *OpValue) const {
+ Instruction *E0 = cast<Instruction>(OpValue);
+ assert(E0->getOpcode() == Instruction::ExtractElement ||
+ E0->getOpcode() == Instruction::ExtractValue);
+ assert(E0->getOpcode() == getSameOpcode(VL) && "Invalid opcode");
// Check if all of the extracts come from the same vector and from the
// correct offset.
- Value *VL0 = VL[0];
- Instruction *E0 = cast<Instruction>(VL0);
Value *Vec = E0->getOperand(0);
// We have to extract from a vector/aggregate with the same number of elements.
unsigned NElts;
- if (Opcode == Instruction::ExtractValue) {
+ if (E0->getOpcode() == Instruction::ExtractValue) {
const DataLayout &DL = E0->getModule()->getDataLayout();
NElts = canMapToVector(Vec->getType(), DL);
if (!NElts)
return false;
// Check that all of the indices extract from the correct offset.
- if (!matchExtractIndex(E0, 0, Opcode))
- return false;
-
- for (unsigned i = 1, e = VL.size(); i < e; ++i) {
- Instruction *E = cast<Instruction>(VL[i]);
- if (!matchExtractIndex(E, i, Opcode))
+ for (unsigned I = 0, E = VL.size(); I < E; ++I) {
+ Instruction *Inst = cast<Instruction>(VL[I]);
+ if (!matchExtractIndex(Inst, I, Inst->getOpcode()))
return false;
- if (E->getOperand(0) != Vec)
+ if (Inst->getOperand(0) != Vec)
return false;
}
}
case Instruction::ExtractValue:
case Instruction::ExtractElement: {
- if (canReuseExtract(VL, Opcode)) {
+ if (canReuseExtract(VL, VL0)) {
int DeadCost = 0;
for (unsigned i = 0, e = VL.size(); i < e; ++i) {
Instruction *E = cast<Instruction>(VL[i]);
}
case Instruction::ExtractElement: {
- if (canReuseExtract(E->Scalars, Instruction::ExtractElement)) {
+ if (canReuseExtract(E->Scalars, VL0)) {
Value *V = VL0->getOperand(0);
E->VectorizedValue = V;
return V;
return V;
}
case Instruction::ExtractValue: {
- if (canReuseExtract(E->Scalars, Instruction::ExtractValue)) {
+ if (canReuseExtract(E->Scalars, VL0)) {
LoadInst *LI = cast<LoadInst>(VL0->getOperand(0));
Builder.SetInsertPoint(LI);
PointerType *PtrTy = PointerType::get(VecTy, LI->getPointerAddressSpace());