Skip to content

Commit f255ddc

Browse files
committed
Refactor to support the source modifiers on either or both operands.
Also extend the test. Still struggling with 64-bit though as the legalizer is splitting some 64-bit ops into v2i32.
1 parent 97d93d6 commit f255ddc

File tree

2 files changed

+471
-157
lines changed

2 files changed

+471
-157
lines changed

llvm/lib/Target/AMDGPU/AMDGPUISelLowering.cpp

Lines changed: 17 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4843,17 +4843,15 @@ AMDGPUTargetLowering::foldFreeOpFromSelect(TargetLowering::DAGCombinerInfo &DCI,
48434843
}
48444844

48454845
static EVT getFloatVT(EVT VT) {
4846-
return VT.isVector() ? MVT::getVectorVT(
4847-
MVT::getFloatingPointVT(VT.getScalarSizeInBits()),
4848-
VT.getVectorNumElements())
4849-
: MVT::getFloatingPointVT(VT.getFixedSizeInBits());
4846+
EVT FT = MVT::getFloatingPointVT(VT.getScalarSizeInBits());
4847+
return VT.isVector() ? VT.changeVectorElementType(FT) : FT;
48504848
}
48514849

48524850
static SDValue getBitwiseToSrcModifierOp(SDValue N,
48534851
TargetLowering::DAGCombinerInfo &DCI) {
48544852

48554853
unsigned Opc = N.getNode()->getOpcode();
4856-
if (Opc != ISD::AND && Opc != ISD::XOR && Opc != ISD::AND)
4854+
if (Opc != ISD::AND && Opc != ISD::XOR && Opc != ISD::OR)
48574855
return SDValue();
48584856

48594857
SelectionDAG &DAG = DCI.DAG;
@@ -4865,31 +4863,23 @@ static SDValue getBitwiseToSrcModifierOp(SDValue N,
48654863
return SDValue();
48664864

48674865
EVT VT = RHS.getValueType();
4868-
4869-
assert((VT == MVT::i32 || VT == MVT::v2i32 || VT == MVT::i64) &&
4870-
"Expected i32, v2i32 or i64 value type.");
4871-
4872-
uint64_t Mask = CRHS->getZExtValue();
48734866
EVT FVT = getFloatVT(VT);
48744867
SDLoc SL = SDLoc(N);
48754868
SDValue BC = DAG.getNode(ISD::BITCAST, SL, FVT, LHS);
48764869

48774870
switch (Opc) {
48784871
case ISD::XOR:
4879-
if ((Mask == 0x80000000u && VT.getFixedSizeInBits() == 32) ||
4880-
(Mask == 0x8000000000000000u && VT.getFixedSizeInBits() == 64))
4872+
if (CRHS->getAPIntValue().isSignMask())
48814873
return DAG.getNode(ISD::FNEG, SL, FVT, BC);
48824874
break;
48834875
case ISD::OR:
4884-
if ((Mask == 0x80000000u && VT.getFixedSizeInBits() == 32) ||
4885-
(Mask == 0x8000000000000000u && VT.getFixedSizeInBits() == 64)) {
4876+
if (CRHS->getAPIntValue().isSignMask()) {
48864877
SDValue Abs = DAG.getNode(ISD::FABS, SL, FVT, BC);
48874878
return DAG.getNode(ISD::FNEG, SL, FVT, Abs);
48884879
}
48894880
break;
48904881
case ISD::AND:
4891-
if ((Mask == 0x7fffffffu && VT.getFixedSizeInBits() == 32) ||
4892-
(Mask == 0x7fffffffffffffffu && VT.getFixedSizeInBits() == 64))
4882+
if (CRHS->getAPIntValue().isMaxSignedValue())
48934883
return DAG.getNode(ISD::FABS, SL, FVT, BC);
48944884
break;
48954885
default:
@@ -4939,15 +4929,20 @@ SDValue AMDGPUTargetLowering::performSelectCombine(SDNode *N,
49394929
return MinMax;
49404930
}
49414931

4942-
// Support source modifiers as integer.
4932+
// Support source modifiers on integer types.
49434933
if (VT == MVT::i32 || VT == MVT::v2i32 || VT == MVT::i64) {
4944-
if (SDValue SrcMod = getBitwiseToSrcModifierOp(True, DCI)) {
4934+
SDValue SrcModTrue = getBitwiseToSrcModifierOp(True, DCI);
4935+
SDValue SrcModFalse = getBitwiseToSrcModifierOp(False, DCI);
4936+
if (SrcModTrue || SrcModFalse) {
49454937
SDLoc SL(N);
49464938
EVT FVT = getFloatVT(VT);
4947-
SDValue FRHS = DAG.getNode(ISD::BITCAST, SL, FVT, False);
4948-
SDValue FSelect = DAG.getNode(ISD::SELECT, SL, FVT, Cond, SrcMod, FRHS);
4949-
SDValue BC = DAG.getNode(ISD::BITCAST, SL, VT, FSelect);
4950-
return BC;
4939+
SDValue FLHS =
4940+
SrcModTrue ? SrcModTrue : DAG.getNode(ISD::BITCAST, SL, FVT, True);
4941+
SDValue FRHS = SrcModFalse ? SrcModFalse
4942+
: DAG.getNode(ISD::BITCAST, SL, FVT, False);
4943+
;
4944+
SDValue FSelect = DAG.getNode(ISD::SELECT, SL, FVT, Cond, FLHS, FRHS);
4945+
return DAG.getNode(ISD::BITCAST, SL, VT, FSelect);
49514946
}
49524947
}
49534948
}

0 commit comments

Comments
 (0)