@@ -4654,8 +4654,27 @@ AMDGPUTargetLowering::foldFreeOpFromSelect(TargetLowering::DAGCombinerInfo &DCI,
4654
4654
if (!AMDGPUTargetLowering::allUsesHaveSourceMods (N.getNode ()))
4655
4655
return SDValue ();
4656
4656
4657
- return distributeOpThroughSelect (DCI, LHS.getOpcode (),
4658
- SDLoc (N), Cond, LHS, RHS);
4657
+ // select c, (fneg (f32 bitcast i32 x)), (fneg (f32 bitcast i32 y)) can be
4658
+ // lowered directly to a V_CNDMASK_. So prevent the fneg from being pulled
4659
+ // out in this case. For now I've made the logic as specific to the case as
4660
+ // possible, hopefully this can be relaxed in future.
4661
+ if (LHS.getOpcode () == ISD::FNEG && RHS.getOpcode () == ISD::FNEG) {
4662
+ SDValue LHSB = LHS.getOperand (0 );
4663
+ SDValue RHSB = RHS.getOperand (0 );
4664
+ if (LHSB.getOpcode () == ISD::BITCAST &&
4665
+ RHSB->getOpcode () == ISD::BITCAST) {
4666
+ EVT LHSBOpTy = LHSB->getOperand (0 ).getValueType ();
4667
+ EVT RHSBOpTy = RHSB->getOperand (0 ).getValueType ();
4668
+ if (LHSB.getValueType () == MVT::f32 &&
4669
+ RHSB.getValueType () == MVT::f32 && LHSBOpTy == MVT::i32 &&
4670
+ RHSBOpTy == MVT::i32 ) {
4671
+ return SDValue ();
4672
+ }
4673
+ }
4674
+ }
4675
+
4676
+ return distributeOpThroughSelect (DCI, LHS.getOpcode (), SDLoc (N), Cond, LHS,
4677
+ RHS);
4659
4678
}
4660
4679
4661
4680
bool Inv = false ;
@@ -4708,8 +4727,8 @@ AMDGPUTargetLowering::foldFreeOpFromSelect(TargetLowering::DAGCombinerInfo &DCI,
4708
4727
if (Inv)
4709
4728
std::swap (NewLHS, NewRHS);
4710
4729
4711
- SDValue NewSelect = DAG. getNode (ISD::SELECT, SL, VT,
4712
- Cond, NewLHS, NewRHS);
4730
+ SDValue NewSelect =
4731
+ DAG. getNode (ISD::SELECT, SL, VT, Cond, NewLHS, NewRHS);
4713
4732
DCI.AddToWorklist (NewSelect.getNode ());
4714
4733
return DAG.getNode (LHS.getOpcode (), SL, VT, NewSelect);
4715
4734
}
@@ -5047,8 +5066,20 @@ SDValue AMDGPUTargetLowering::performFNegCombine(SDNode *N,
5047
5066
}
5048
5067
case ISD::SELECT: {
5049
5068
// fneg (select c, a, b) -> select c, (fneg a), (fneg b)
5069
+ // This combine became necessary recently to prevent a regression after v2i32 xor was made legal.
5070
+ // When adding this combine a case was added to performFNEGCombine to prevent this combine from
5071
+ // being undone under certain conditions.
5050
5072
// TODO: Invert conditions of foldFreeOpFromSelect
5051
- return SDValue ();
5073
+ SDValue Cond = N0.getOperand (0 );
5074
+ SDValue LHS = N0.getOperand (1 );
5075
+ SDValue RHS = N0.getOperand (2 );
5076
+ EVT LHVT = LHS.getValueType ();
5077
+ EVT RHVT = RHS.getValueType ();
5078
+
5079
+ SDValue LFNeg = DAG.getNode (ISD::FNEG, SL, LHVT, LHS);
5080
+ SDValue RFNeg = DAG.getNode (ISD::FNEG, SL, RHVT, RHS);
5081
+ SDValue Op = DAG.getNode (Opc, SL, LHVT, Cond, LFNeg, RFNeg);
5082
+ return Op;
5052
5083
}
5053
5084
case ISD::BITCAST: {
5054
5085
SDLoc SL (N);
0 commit comments