@@ -4831,17 +4831,15 @@ AMDGPUTargetLowering::foldFreeOpFromSelect(TargetLowering::DAGCombinerInfo &DCI,
4831
4831
}
4832
4832
4833
4833
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;
4838
4836
}
4839
4837
4840
4838
static SDValue getBitwiseToSrcModifierOp (SDValue N,
4841
4839
TargetLowering::DAGCombinerInfo &DCI) {
4842
4840
4843
4841
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 )
4845
4843
return SDValue ();
4846
4844
4847
4845
SelectionDAG &DAG = DCI.DAG ;
@@ -4853,31 +4851,23 @@ static SDValue getBitwiseToSrcModifierOp(SDValue N,
4853
4851
return SDValue ();
4854
4852
4855
4853
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 ();
4861
4854
EVT FVT = getFloatVT (VT);
4862
4855
SDLoc SL = SDLoc (N);
4863
4856
SDValue BC = DAG.getNode (ISD::BITCAST, SL, FVT, LHS);
4864
4857
4865
4858
switch (Opc) {
4866
4859
case ISD::XOR:
4867
- if ((Mask == 0x80000000u && VT.getFixedSizeInBits () == 32 ) ||
4868
- (Mask == 0x8000000000000000u && VT.getFixedSizeInBits () == 64 ))
4860
+ if (CRHS->getAPIntValue ().isSignMask ())
4869
4861
return DAG.getNode (ISD::FNEG, SL, FVT, BC);
4870
4862
break ;
4871
4863
case ISD::OR:
4872
- if ((Mask == 0x80000000u && VT.getFixedSizeInBits () == 32 ) ||
4873
- (Mask == 0x8000000000000000u && VT.getFixedSizeInBits () == 64 )) {
4864
+ if (CRHS->getAPIntValue ().isSignMask ()) {
4874
4865
SDValue Abs = DAG.getNode (ISD::FABS, SL, FVT, BC);
4875
4866
return DAG.getNode (ISD::FNEG, SL, FVT, Abs);
4876
4867
}
4877
4868
break ;
4878
4869
case ISD::AND:
4879
- if ((Mask == 0x7fffffffu && VT.getFixedSizeInBits () == 32 ) ||
4880
- (Mask == 0x7fffffffffffffffu && VT.getFixedSizeInBits () == 64 ))
4870
+ if (CRHS->getAPIntValue ().isMaxSignedValue ())
4881
4871
return DAG.getNode (ISD::FABS, SL, FVT, BC);
4882
4872
break ;
4883
4873
default :
@@ -4927,15 +4917,20 @@ SDValue AMDGPUTargetLowering::performSelectCombine(SDNode *N,
4927
4917
return MinMax;
4928
4918
}
4929
4919
4930
- // Support source modifiers as integer.
4920
+ // Support source modifiers on integer types .
4931
4921
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) {
4933
4925
SDLoc SL (N);
4934
4926
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);
4939
4934
}
4940
4935
}
4941
4936
}
0 commit comments