/// types, try to convert this into a floating point logic node to avoid
/// unnecessary moves from SSE to integer registers.
static SDValue convertIntLogicToFPLogic(SDNode *N, SelectionDAG &DAG,
+ TargetLowering::DAGCombinerInfo &DCI,
const X86Subtarget &Subtarget) {
EVT VT = N->getValueType(0);
SDValue N0 = N->getOperand(0);
if (N0.getOpcode() != ISD::BITCAST || N1.getOpcode() != ISD::BITCAST)
return SDValue();
+ if (DCI.isBeforeLegalizeOps())
+ return SDValue();
+
SDValue N00 = N0.getOperand(0);
SDValue N10 = N1.getOperand(0);
EVT N00Type = N00.getValueType();
if (SDValue R = combineBitOpWithMOVMSK(N, DAG))
return R;
+ if (SDValue FPLogic = convertIntLogicToFPLogic(N, DAG, DCI, Subtarget))
+ return FPLogic;
+
if (DCI.isBeforeLegalizeOps())
return SDValue();
if (SDValue R = combineCompareEqual(N, DAG, DCI, Subtarget))
return R;
- if (SDValue FPLogic = convertIntLogicToFPLogic(N, DAG, Subtarget))
- return FPLogic;
-
if (SDValue R = combineANDXORWithAllOnesIntoANDNP(N, DAG))
return R;
if (SDValue R = combineBitOpWithMOVMSK(N, DAG))
return R;
+ if (SDValue FPLogic = convertIntLogicToFPLogic(N, DAG, DCI, Subtarget))
+ return FPLogic;
+
if (DCI.isBeforeLegalizeOps())
return SDValue();
if (SDValue R = combineCompareEqual(N, DAG, DCI, Subtarget))
return R;
- if (SDValue FPLogic = convertIntLogicToFPLogic(N, DAG, Subtarget))
- return FPLogic;
-
if (SDValue R = canonicalizeBitSelect(N, DAG, Subtarget))
return R;
if (SDValue R = combineBitOpWithMOVMSK(N, DAG))
return R;
+ if (SDValue FPLogic = convertIntLogicToFPLogic(N, DAG, DCI, Subtarget))
+ return FPLogic;
+
if (DCI.isBeforeLegalizeOps())
return SDValue();
}
}
- if (SDValue FPLogic = convertIntLogicToFPLogic(N, DAG, Subtarget))
- return FPLogic;
-
return combineFneg(N, DAG, DCI, Subtarget);
}