@@ -3540,7 +3540,8 @@ static SDValue emitStrictFPComparison(SDValue LHS, SDValue RHS, const SDLoc &DL,
35403540}
35413541
35423542static SDValue emitComparison(SDValue LHS, SDValue RHS, ISD::CondCode CC,
3543- const SDLoc &DL, SelectionDAG &DAG) {
3543+ AArch64CC::CondCode &OutCC, const SDLoc &DL,
3544+ SelectionDAG &DAG) {
35443545 EVT VT = LHS.getValueType();
35453546 const bool FullFP16 = DAG.getSubtarget<AArch64Subtarget>().hasFullFP16();
35463547
@@ -3563,12 +3564,12 @@ static SDValue emitComparison(SDValue LHS, SDValue RHS, ISD::CondCode CC,
35633564 // Can we combine a (CMP op1, (sub 0, op2) into a CMN instruction ?
35643565 Opcode = AArch64ISD::ADDS;
35653566 RHS = RHS.getOperand(1);
3566- } else if (LHS.getOpcode() == ISD::SUB && isNullConstant(LHS.getOperand(0)) &&
3567- isIntEqualitySetCC(CC)) {
3567+ } else if (isCMN(LHS, CC, DAG)) {
35683568 // As we are looking for EQ/NE compares, the operands can be commuted ; can
35693569 // we combine a (CMP (sub 0, op1), op2) into a CMN instruction ?
35703570 Opcode = AArch64ISD::ADDS;
35713571 LHS = LHS.getOperand(1);
3572+ OutCC = getSwappedCondition(OutCC);
35723573 } else if (isNullConstant(RHS) && !isUnsignedIntSetCC(CC)) {
35733574 if (LHS.getOpcode() == ISD::AND) {
35743575 // Similarly, (CMP (and X, Y), 0) can be implemented with a TST
@@ -3646,7 +3647,7 @@ static SDValue emitComparison(SDValue LHS, SDValue RHS, ISD::CondCode CC,
36463647static SDValue emitConditionalComparison(SDValue LHS, SDValue RHS,
36473648 ISD::CondCode CC, SDValue CCOp,
36483649 AArch64CC::CondCode Predicate,
3649- AArch64CC::CondCode OutCC,
3650+ AArch64CC::CondCode & OutCC,
36503651 const SDLoc &DL, SelectionDAG &DAG) {
36513652 unsigned Opcode = 0;
36523653 const bool FullFP16 = DAG.getSubtarget<AArch64Subtarget>().hasFullFP16();
@@ -3668,12 +3669,12 @@ static SDValue emitConditionalComparison(SDValue LHS, SDValue RHS,
36683669 } else if (isCMN(RHS, CC, DAG)) {
36693670 Opcode = AArch64ISD::CCMN;
36703671 RHS = RHS.getOperand(1);
3671- } else if (LHS.getOpcode() == ISD::SUB && isNullConstant(LHS.getOperand(0)) &&
3672- isIntEqualitySetCC(CC)) {
3672+ } else if (isCMN(LHS, CC, DAG)) {
36733673 // As we are looking for EQ/NE compares, the operands can be commuted ; can
36743674 // we combine a (CCMP (sub 0, op1), op2) into a CCMN instruction ?
36753675 Opcode = AArch64ISD::CCMN;
36763676 LHS = LHS.getOperand(1);
3677+ OutCC = getSwappedCondition(OutCC);
36773678 }
36783679 if (Opcode == 0)
36793680 Opcode = AArch64ISD::CCMP;
@@ -3786,7 +3787,7 @@ static SDValue emitConjunctionRec(SelectionDAG &DAG, SDValue Val,
37863787 if (ExtraCC != AArch64CC::AL) {
37873788 SDValue ExtraCmp;
37883789 if (!CCOp.getNode())
3789- ExtraCmp = emitComparison(LHS, RHS, CC, DL, DAG);
3790+ ExtraCmp = emitComparison(LHS, RHS, CC, ExtraCC, DL, DAG);
37903791 else
37913792 ExtraCmp = emitConditionalComparison(LHS, RHS, CC, CCOp, Predicate,
37923793 ExtraCC, DL, DAG);
@@ -3797,7 +3798,7 @@ static SDValue emitConjunctionRec(SelectionDAG &DAG, SDValue Val,
37973798
37983799 // Produce a normal comparison if we are first in the chain
37993800 if (!CCOp)
3800- return emitComparison(LHS, RHS, CC, DL, DAG);
3801+ return emitComparison(LHS, RHS, CC, OutCC, DL, DAG);
38013802 // Otherwise produce a ccmp.
38023803 return emitConditionalComparison(LHS, RHS, CC, CCOp, Predicate, OutCC, DL,
38033804 DAG);
@@ -4014,13 +4015,11 @@ static SDValue getAArch64Cmp(SDValue LHS, SDValue RHS, ISD::CondCode CC,
40144015 // can be turned into:
40154016 // cmp w12, w11, lsl #1
40164017 if (!isa<ConstantSDNode>(RHS) || !isLegalCmpImmed(RHS->getAsAPIntVal())) {
4017- bool LHSIsCMN = isCMN(LHS, CC, DAG);
4018- bool RHSIsCMN = isCMN(RHS, CC, DAG);
4019- SDValue TheLHS = LHSIsCMN ? LHS.getOperand(1) : LHS;
4020- SDValue TheRHS = RHSIsCMN ? RHS.getOperand(1) : RHS;
4018+ SDValue TheLHS = isCMN(LHS, CC, DAG) ? LHS.getOperand(1) : LHS;
4019+ SDValue TheRHS = isCMN(RHS, CC, DAG) ? RHS.getOperand(1) : RHS;
40214020
4022- if (getCmpOperandFoldingProfit(TheLHS) + (LHSIsCMN ? 1 : 0) >
4023- getCmpOperandFoldingProfit(TheRHS) + (RHSIsCMN ? 1 : 0) ) {
4021+ if (getCmpOperandFoldingProfit(TheLHS) >
4022+ getCmpOperandFoldingProfit(TheRHS)) {
40244023 std::swap(LHS, RHS);
40254024 CC = ISD::getSetCCSwappedOperands(CC);
40264025 }
@@ -4056,10 +4055,11 @@ static SDValue getAArch64Cmp(SDValue LHS, SDValue RHS, ISD::CondCode CC,
40564055 SDValue SExt =
40574056 DAG.getNode(ISD::SIGN_EXTEND_INREG, DL, LHS.getValueType(), LHS,
40584057 DAG.getValueType(MVT::i16));
4058+
4059+ AArch64CC = changeIntCCToAArch64CC(CC);
40594060 Cmp = emitComparison(
40604061 SExt, DAG.getSignedConstant(ValueofRHS, DL, RHS.getValueType()), CC,
4061- DL, DAG);
4062- AArch64CC = changeIntCCToAArch64CC(CC);
4062+ AArch64CC, DL, DAG);
40634063 }
40644064 }
40654065
@@ -4072,8 +4072,8 @@ static SDValue getAArch64Cmp(SDValue LHS, SDValue RHS, ISD::CondCode CC,
40724072 }
40734073
40744074 if (!Cmp) {
4075- Cmp = emitComparison(LHS, RHS, CC, DL, DAG);
40764075 AArch64CC = changeIntCCToAArch64CC(CC);
4076+ Cmp = emitComparison(LHS, RHS, CC, AArch64CC, DL, DAG);
40774077 }
40784078 AArch64cc = DAG.getConstant(AArch64CC, DL, MVT_CC);
40794079 return Cmp;
@@ -10664,8 +10664,8 @@ SDValue AArch64TargetLowering::LowerBR_CC(SDValue Op, SelectionDAG &DAG) const {
1066410664
1066510665 // Unfortunately, the mapping of LLVM FP CC's onto AArch64 CC's isn't totally
1066610666 // clean. Some of them require two branches to implement.
10667- SDValue Cmp = emitComparison(LHS, RHS, CC, DL, DAG) ;
10668- AArch64CC::CondCode CC1, CC2 ;
10667+ AArch64CC::CondCode CC1 = AArch64CC::AL, CC2 ;
10668+ SDValue Cmp = emitComparison(LHS, RHS, CC, CC1, DL, DAG) ;
1066910669 changeFPCCToAArch64CC(CC, CC1, CC2);
1067010670 SDValue CC1Val = DAG.getConstant(CC1, DL, MVT::i32);
1067110671 SDValue BR1 =
@@ -11149,12 +11149,12 @@ SDValue AArch64TargetLowering::LowerSETCC(SDValue Op, SelectionDAG &DAG) const {
1114911149 // If that fails, we'll need to perform an FCMP + CSEL sequence. Go ahead
1115011150 // and do the comparison.
1115111151 SDValue Cmp;
11152+ AArch64CC::CondCode CC1 = AArch64CC::AL, CC2;
1115211153 if (IsStrict)
1115311154 Cmp = emitStrictFPComparison(LHS, RHS, DL, DAG, Chain, IsSignaling);
1115411155 else
11155- Cmp = emitComparison(LHS, RHS, CC, DL, DAG);
11156+ Cmp = emitComparison(LHS, RHS, CC, CC1, DL, DAG);
1115611157
11157- AArch64CC::CondCode CC1, CC2;
1115811158 changeFPCCToAArch64CC(CC, CC1, CC2);
1115911159 SDValue Res;
1116011160 if (CC2 == AArch64CC::AL) {
@@ -11550,12 +11550,11 @@ SDValue AArch64TargetLowering::LowerSELECT_CC(
1155011550 if (VectorCmp)
1155111551 return VectorCmp;
1155211552 }
11553-
11554- SDValue Cmp = emitComparison(LHS, RHS, CC, DL, DAG);
11553+ AArch64CC::CondCode CC1 = AArch64CC::AL, CC2;
11554+ SDValue Cmp = emitComparison(LHS, RHS, CC, CC1, DL, DAG);
1155511555
1155611556 // Unfortunately, the mapping of LLVM FP CC's onto AArch64 CC's isn't totally
1155711557 // clean. Some of them require two CSELs to implement.
11558- AArch64CC::CondCode CC1, CC2;
1155911558 changeFPCCToAArch64CC(CC, CC1, CC2);
1156011559
1156111560 if (Flags.hasNoSignedZeros()) {
0 commit comments