mirror of
https://github.com/RPCS3/llvm.git
synced 2025-01-19 00:14:20 +00:00
[x86] Re-order the combines of select in the X86 backend. This doesn't
change functionality, but makes it more clear that the dynamic case and the shuffle case don't overlap in any interesting way. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@230689 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
34f88924e1
commit
9b9d0fcfe9
@ -20740,6 +20740,25 @@ static SDValue PerformSELECTCombine(SDNode *N, SelectionDAG &DAG,
|
||||
}
|
||||
}
|
||||
|
||||
// We should generate an X86ISD::BLENDI from a vselect if its argument
|
||||
// is a sign_extend_inreg of an any_extend of a BUILD_VECTOR of
|
||||
// constants. This specific pattern gets generated when we split a
|
||||
// selector for a 512 bit vector in a machine without AVX512 (but with
|
||||
// 256-bit vectors), during legalization:
|
||||
//
|
||||
// (vselect (sign_extend (any_extend (BUILD_VECTOR)) i1) LHS RHS)
|
||||
//
|
||||
// Iff we find this pattern and the build_vectors are built from
|
||||
// constants, we translate the vselect into a shuffle_vector that we
|
||||
// know will be matched by LowerVECTOR_SHUFFLEtoBlend.
|
||||
if ((N->getOpcode() == ISD::VSELECT ||
|
||||
N->getOpcode() == X86ISD::SHRUNKBLEND) &&
|
||||
!DCI.isBeforeLegalize()) {
|
||||
SDValue Shuffle = transformVSELECTtoBlendVECTOR_SHUFFLE(N, DAG, Subtarget);
|
||||
if (Shuffle.getNode())
|
||||
return Shuffle;
|
||||
}
|
||||
|
||||
// If we know that this node is legal then we know that it is going to be
|
||||
// matched by one of the SSE/AVX BLEND instructions. These instructions only
|
||||
// depend on the highest bit in each word. Try to use SimplifyDemandedBits
|
||||
@ -20810,25 +20829,6 @@ static SDValue PerformSELECTCombine(SDNode *N, SelectionDAG &DAG,
|
||||
}
|
||||
}
|
||||
|
||||
// We should generate an X86ISD::BLENDI from a vselect if its argument
|
||||
// is a sign_extend_inreg of an any_extend of a BUILD_VECTOR of
|
||||
// constants. This specific pattern gets generated when we split a
|
||||
// selector for a 512 bit vector in a machine without AVX512 (but with
|
||||
// 256-bit vectors), during legalization:
|
||||
//
|
||||
// (vselect (sign_extend (any_extend (BUILD_VECTOR)) i1) LHS RHS)
|
||||
//
|
||||
// Iff we find this pattern and the build_vectors are built from
|
||||
// constants, we translate the vselect into a shuffle_vector that we
|
||||
// know will be matched by LowerVECTOR_SHUFFLEtoBlend.
|
||||
if ((N->getOpcode() == ISD::VSELECT ||
|
||||
N->getOpcode() == X86ISD::SHRUNKBLEND) &&
|
||||
!DCI.isBeforeLegalize()) {
|
||||
SDValue Shuffle = transformVSELECTtoBlendVECTOR_SHUFFLE(N, DAG, Subtarget);
|
||||
if (Shuffle.getNode())
|
||||
return Shuffle;
|
||||
}
|
||||
|
||||
return SDValue();
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user