@@ -4843,17 +4843,15 @@ AMDGPUTargetLowering::foldFreeOpFromSelect(TargetLowering::DAGCombinerInfo &DCI,
4843
4843
}
4844
4844
4845
4845
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;
4850
4848
}
4851
4849
4852
4850
static SDValue getBitwiseToSrcModifierOp (SDValue N,
4853
4851
TargetLowering::DAGCombinerInfo &DCI) {
4854
4852
4855
4853
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 )
4857
4855
return SDValue ();
4858
4856
4859
4857
SelectionDAG &DAG = DCI.DAG ;
@@ -4865,31 +4863,23 @@ static SDValue getBitwiseToSrcModifierOp(SDValue N,
4865
4863
return SDValue ();
4866
4864
4867
4865
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 ();
4873
4866
EVT FVT = getFloatVT (VT);
4874
4867
SDLoc SL = SDLoc (N);
4875
4868
SDValue BC = DAG.getNode (ISD::BITCAST, SL, FVT, LHS);
4876
4869
4877
4870
switch (Opc) {
4878
4871
case ISD::XOR:
4879
- if ((Mask == 0x80000000u && VT.getFixedSizeInBits () == 32 ) ||
4880
- (Mask == 0x8000000000000000u && VT.getFixedSizeInBits () == 64 ))
4872
+ if (CRHS->getAPIntValue ().isSignMask ())
4881
4873
return DAG.getNode (ISD::FNEG, SL, FVT, BC);
4882
4874
break ;
4883
4875
case ISD::OR:
4884
- if ((Mask == 0x80000000u && VT.getFixedSizeInBits () == 32 ) ||
4885
- (Mask == 0x8000000000000000u && VT.getFixedSizeInBits () == 64 )) {
4876
+ if (CRHS->getAPIntValue ().isSignMask ()) {
4886
4877
SDValue Abs = DAG.getNode (ISD::FABS, SL, FVT, BC);
4887
4878
return DAG.getNode (ISD::FNEG, SL, FVT, Abs);
4888
4879
}
4889
4880
break ;
4890
4881
case ISD::AND:
4891
- if ((Mask == 0x7fffffffu && VT.getFixedSizeInBits () == 32 ) ||
4892
- (Mask == 0x7fffffffffffffffu && VT.getFixedSizeInBits () == 64 ))
4882
+ if (CRHS->getAPIntValue ().isMaxSignedValue ())
4893
4883
return DAG.getNode (ISD::FABS, SL, FVT, BC);
4894
4884
break ;
4895
4885
default :
@@ -4939,15 +4929,20 @@ SDValue AMDGPUTargetLowering::performSelectCombine(SDNode *N,
4939
4929
return MinMax;
4940
4930
}
4941
4931
4942
- // Support source modifiers as integer.
4932
+ // Support source modifiers on integer types .
4943
4933
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) {
4945
4937
SDLoc SL (N);
4946
4938
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);
4951
4946
}
4952
4947
}
4953
4948
}
0 commit comments