mirror of
https://github.com/RPCS3/llvm.git
synced 2025-02-12 13:48:45 +00:00
AMDGPU: Turn int pack pattern into build_vector
build_vector is a more useful canonical form when pattern matching packed operations, so turn shift into high element into a build_vector. Should show no change for now. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@312282 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
2439f12f31
commit
d213820974
@ -2708,11 +2708,21 @@ SDValue AMDGPUTargetLowering::performShlCombine(SDNode *N,
|
||||
case ISD::ZERO_EXTEND:
|
||||
case ISD::SIGN_EXTEND:
|
||||
case ISD::ANY_EXTEND: {
|
||||
SDValue X = LHS->getOperand(0);
|
||||
|
||||
if (VT == MVT::i32 && RHSVal == 16 && X.getValueType() == MVT::i16 &&
|
||||
isTypeLegal(MVT::v2i16)) {
|
||||
// Prefer build_vector as the canonical form if packed types are legal.
|
||||
// (shl ([asz]ext i16:x), 16 -> build_vector 0, x
|
||||
SDValue Vec = DAG.getBuildVector(MVT::v2i16, SL,
|
||||
{ DAG.getConstant(0, SL, MVT::i16), LHS->getOperand(0) });
|
||||
return DAG.getNode(ISD::BITCAST, SL, MVT::i32, Vec);
|
||||
}
|
||||
|
||||
// shl (ext x) => zext (shl x), if shift does not overflow int
|
||||
if (VT != MVT::i64)
|
||||
break;
|
||||
KnownBits Known;
|
||||
SDValue X = LHS->getOperand(0);
|
||||
DAG.computeKnownBits(X, Known);
|
||||
unsigned LZ = Known.countMinLeadingZeros();
|
||||
if (LZ < RHSVal)
|
||||
|
@ -1340,6 +1340,13 @@ def : Pat <
|
||||
(v2i16 (S_PACK_LL_B32_B16 $src0, $src1))
|
||||
>;
|
||||
|
||||
// COPY_TO_REGCLASS is workaround tablegen bug from multiple outputs
|
||||
// from S_LSHL_B32's multiple outputs from implicit scc def.
|
||||
def : Pat <
|
||||
(v2i16 (build_vector (i16 0), i16:$src1)),
|
||||
(v2i16 (COPY_TO_REGCLASS (S_LSHL_B32 i16:$src1, (i16 16)), SReg_32_XM0))
|
||||
>;
|
||||
|
||||
// With multiple uses of the shift, this will duplicate the shift and
|
||||
// increase register pressure.
|
||||
def : Pat <
|
||||
|
Loading…
x
Reference in New Issue
Block a user