mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2026-04-26 12:20:42 +00:00
Scalarize select vector arguments when extracted.
When the elements are extracted from a select on vectors or a vector select, do the select on the extracted scalars from the input if there is only one use. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@194013 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -282,6 +282,38 @@ Instruction *InstCombiner::visitExtractElementInst(ExtractElementInst &EI) {
|
||||
Worklist.AddValue(EE);
|
||||
return CastInst::Create(CI->getOpcode(), EE, EI.getType());
|
||||
}
|
||||
} else if (SelectInst *SI = dyn_cast<SelectInst>(I)) {
|
||||
if (SI->hasOneUse()) {
|
||||
// TODO: For a select on vectors, it might be useful to do this if it
|
||||
// has multiple extractelement uses. For vector select, that seems to
|
||||
// fight the vectorizer.
|
||||
|
||||
// If we are extracting an element from a vector select or a select on
|
||||
// vectors, a select on the scalars extracted from the vector arguments.
|
||||
Value *TrueVal = SI->getTrueValue();
|
||||
Value *FalseVal = SI->getFalseValue();
|
||||
|
||||
Value *Cond = SI->getCondition();
|
||||
if (Cond->getType()->isVectorTy()) {
|
||||
Cond = Builder->CreateExtractElement(Cond,
|
||||
EI.getIndexOperand(),
|
||||
Cond->getName() + ".elt");
|
||||
}
|
||||
|
||||
Value *V1Elem
|
||||
= Builder->CreateExtractElement(TrueVal,
|
||||
EI.getIndexOperand(),
|
||||
TrueVal->getName() + ".elt");
|
||||
|
||||
Value *V2Elem
|
||||
= Builder->CreateExtractElement(FalseVal,
|
||||
EI.getIndexOperand(),
|
||||
FalseVal->getName() + ".elt");
|
||||
return SelectInst::Create(Cond,
|
||||
V1Elem,
|
||||
V2Elem,
|
||||
SI->getName() + ".elt");
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
|
||||
Reference in New Issue
Block a user