forked from OSchip/llvm-project
[SelectionDAG] Teach LegalizeVectorOps to not unroll CTLZ_ZERO_UNDEF and CTTZ_ZERO_UNDEF if the non-ZERO_UNDEF form is legal or custom. Will be used to simplify X86 code in a follow on commit.
llvm-svn: 256476
This commit is contained in:
parent
c48fa89e44
commit
4b1808d8e7
|
@ -106,6 +106,7 @@ class VectorLegalizer {
|
|||
SDValue ExpandStore(SDValue Op);
|
||||
SDValue ExpandFNEG(SDValue Op);
|
||||
SDValue ExpandBITREVERSE(SDValue Op);
|
||||
SDValue ExpandCTLZ_CTTZ_ZERO_UNDEF(SDValue Op);
|
||||
|
||||
/// \brief Implements vector promotion.
|
||||
///
|
||||
|
@ -719,6 +720,9 @@ SDValue VectorLegalizer::Expand(SDValue Op) {
|
|||
return UnrollVSETCC(Op);
|
||||
case ISD::BITREVERSE:
|
||||
return ExpandBITREVERSE(Op);
|
||||
case ISD::CTLZ_ZERO_UNDEF:
|
||||
case ISD::CTTZ_ZERO_UNDEF:
|
||||
return ExpandCTLZ_CTTZ_ZERO_UNDEF(Op);
|
||||
default:
|
||||
return DAG.UnrollVectorOp(Op.getNode());
|
||||
}
|
||||
|
@ -1022,6 +1026,16 @@ SDValue VectorLegalizer::ExpandFNEG(SDValue Op) {
|
|||
return DAG.UnrollVectorOp(Op.getNode());
|
||||
}
|
||||
|
||||
SDValue VectorLegalizer::ExpandCTLZ_CTTZ_ZERO_UNDEF(SDValue Op) {
|
||||
// If the non-ZERO_UNDEF version is supported we can let LegalizeDAG handle.
|
||||
unsigned Opc = Op.getOpcode() == ISD::CTLZ_ZERO_UNDEF ? ISD::CTLZ : ISD::CTTZ;
|
||||
if (TLI.isOperationLegalOrCustom(Opc, Op.getValueType()))
|
||||
return Op;
|
||||
|
||||
// Otherwise go ahead and unroll.
|
||||
return DAG.UnrollVectorOp(Op.getNode());
|
||||
}
|
||||
|
||||
SDValue VectorLegalizer::UnrollVSETCC(SDValue Op) {
|
||||
EVT VT = Op.getValueType();
|
||||
unsigned NumElems = VT.getVectorNumElements();
|
||||
|
|
Loading…
Reference in New Issue