Skip to content

Commit 3bf165c

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 cad4b08 commit 3bf165c

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
@@ -4831,17 +4831,15 @@ AMDGPUTargetLowering::foldFreeOpFromSelect(TargetLowering::DAGCombinerInfo &DCI,
48314831
}
48324832

48334833
static EVT getFloatVT(EVT VT) {
4834-
return VT.isVector() ? MVT::getVectorVT(
4835-
MVT::getFloatingPointVT(VT.getScalarSizeInBits()),
4836-
VT.getVectorNumElements())
4837-
: MVT::getFloatingPointVT(VT.getFixedSizeInBits());
4834+
EVT FT = MVT::getFloatingPointVT(VT.getScalarSizeInBits());
4835+
return VT.isVector() ? VT.changeVectorElementType(FT) : FT;
48384836
}
48394837

48404838
static SDValue getBitwiseToSrcModifierOp(SDValue N,
48414839
TargetLowering::DAGCombinerInfo &DCI) {
48424840

48434841
unsigned Opc = N.getNode()->getOpcode();
4844-
if (Opc != ISD::AND && Opc != ISD::XOR && Opc != ISD::AND)
4842+
if (Opc != ISD::AND && Opc != ISD::XOR && Opc != ISD::OR)
48454843
return SDValue();
48464844

48474845
SelectionDAG &DAG = DCI.DAG;
@@ -4853,31 +4851,23 @@ static SDValue getBitwiseToSrcModifierOp(SDValue N,
48534851
return SDValue();
48544852

48554853
EVT VT = RHS.getValueType();
4856-
4857-
assert((VT == MVT::i32 || VT == MVT::v2i32 || VT == MVT::i64) &&
4858-
"Expected i32, v2i32 or i64 value type.");
4859-
4860-
uint64_t Mask = CRHS->getZExtValue();
48614854
EVT FVT = getFloatVT(VT);
48624855
SDLoc SL = SDLoc(N);
48634856
SDValue BC = DAG.getNode(ISD::BITCAST, SL, FVT, LHS);
48644857

48654858
switch (Opc) {
48664859
case ISD::XOR:
4867-
if ((Mask == 0x80000000u && VT.getFixedSizeInBits() == 32) ||
4868-
(Mask == 0x8000000000000000u && VT.getFixedSizeInBits() == 64))
4860+
if (CRHS->getAPIntValue().isSignMask())
48694861
return DAG.getNode(ISD::FNEG, SL, FVT, BC);
48704862
break;
48714863
case ISD::OR:
4872-
if ((Mask == 0x80000000u && VT.getFixedSizeInBits() == 32) ||
4873-
(Mask == 0x8000000000000000u && VT.getFixedSizeInBits() == 64)) {
4864+
if (CRHS->getAPIntValue().isSignMask()) {
48744865
SDValue Abs = DAG.getNode(ISD::FABS, SL, FVT, BC);
48754866
return DAG.getNode(ISD::FNEG, SL, FVT, Abs);
48764867
}
48774868
break;
48784869
case ISD::AND:
4879-
if ((Mask == 0x7fffffffu && VT.getFixedSizeInBits() == 32) ||
4880-
(Mask == 0x7fffffffffffffffu && VT.getFixedSizeInBits() == 64))
4870+
if (CRHS->getAPIntValue().isMaxSignedValue())
48814871
return DAG.getNode(ISD::FABS, SL, FVT, BC);
48824872
break;
48834873
default:
@@ -4927,15 +4917,20 @@ SDValue AMDGPUTargetLowering::performSelectCombine(SDNode *N,
49274917
return MinMax;
49284918
}
49294919

4930-
// Support source modifiers as integer.
4920+
// Support source modifiers on integer types.
49314921
if (VT == MVT::i32 || VT == MVT::v2i32 || VT == MVT::i64) {
4932-
if (SDValue SrcMod = getBitwiseToSrcModifierOp(True, DCI)) {
4922+
SDValue SrcModTrue = getBitwiseToSrcModifierOp(True, DCI);
4923+
SDValue SrcModFalse = getBitwiseToSrcModifierOp(False, DCI);
4924+
if (SrcModTrue || SrcModFalse) {
49334925
SDLoc SL(N);
49344926
EVT FVT = getFloatVT(VT);
4935-
SDValue FRHS = DAG.getNode(ISD::BITCAST, SL, FVT, False);
4936-
SDValue FSelect = DAG.getNode(ISD::SELECT, SL, FVT, Cond, SrcMod, FRHS);
4937-
SDValue BC = DAG.getNode(ISD::BITCAST, SL, VT, FSelect);
4938-
return BC;
4927+
SDValue FLHS =
4928+
SrcModTrue ? SrcModTrue : DAG.getNode(ISD::BITCAST, SL, FVT, True);
4929+
SDValue FRHS = SrcModFalse ? SrcModFalse
4930+
: DAG.getNode(ISD::BITCAST, SL, FVT, False);
4931+
;
4932+
SDValue FSelect = DAG.getNode(ISD::SELECT, SL, FVT, Cond, FLHS, FRHS);
4933+
return DAG.getNode(ISD::BITCAST, SL, VT, FSelect);
49394934
}
49404935
}
49414936
}

0 commit comments

Comments
 (0)