auto *N0C = dyn_cast<ConstantSDNode>(N0);
if (N0C && N1.getOpcode() == ISD::SETCC && N1.hasOneUse()) {
ISD::CondCode CCVal = cast<CondCodeSDNode>(N1.getOperand(2))->get();
- if (!N0C->isZero() && isIntEqualitySetCC(CCVal)) {
+ EVT SetCCOpVT = N1.getOperand(0).getValueType();
+ if (!N0C->isZero() && SetCCOpVT.isInteger() && isIntEqualitySetCC(CCVal)) {
EVT VT = N->getValueType(0);
const APInt &ImmVal = N0C->getAPIntValue();
- CCVal = ISD::getSetCCInverse(CCVal, N0.getValueType());
+ CCVal = ISD::getSetCCInverse(CCVal, SetCCOpVT);
SDValue NewN0 =
DAG.getSetCC(SDLoc(N), VT, N1.getOperand(0), N1.getOperand(1), CCVal);
SDValue NewN1 = DAG.getConstant(ImmVal - 1, SDLoc(N), VT);
; CHECK-LABEL: select_fcmp_oeq_1_2:
; CHECK: # %bb.0:
; CHECK-NEXT: feq.d a0, fa0, fa1
-; CHECK-NEXT: xori a0, a0, 1
-; CHECK-NEXT: addi a0, a0, 1
+; CHECK-NEXT: li a1, 2
+; CHECK-NEXT: sub a0, a1, a0
; CHECK-NEXT: ret
%1 = fcmp fast oeq double %a, %b
%2 = select i1 %1, i32 1, i32 2
; CHECK-LABEL: select_fcmp_oeq_1_2:
; CHECK: # %bb.0:
; CHECK-NEXT: feq.s a0, fa0, fa1
-; CHECK-NEXT: xori a0, a0, 1
-; CHECK-NEXT: addi a0, a0, 1
+; CHECK-NEXT: li a1, 2
+; CHECK-NEXT: sub a0, a1, a0
; CHECK-NEXT: ret
%1 = fcmp fast oeq float %a, %b
%2 = select i1 %1, i32 1, i32 2
; CHECK-LABEL: select_fcmp_oeq_1_2:
; CHECK: # %bb.0:
; CHECK-NEXT: feq.h a0, fa0, fa1
-; CHECK-NEXT: xori a0, a0, 1
-; CHECK-NEXT: addi a0, a0, 1
+; CHECK-NEXT: li a1, 2
+; CHECK-NEXT: sub a0, a1, a0
; CHECK-NEXT: ret
%1 = fcmp fast oeq half %a, %b
%2 = select i1 %1, i32 1, i32 2