@@ -3540,7 +3540,8 @@ static SDValue emitStrictFPComparison(SDValue LHS, SDValue RHS, const SDLoc &DL,
3540
3540
}
3541
3541
3542
3542
static 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) {
3544
3545
EVT VT = LHS.getValueType();
3545
3546
const bool FullFP16 = DAG.getSubtarget<AArch64Subtarget>().hasFullFP16();
3546
3547
@@ -3563,12 +3564,12 @@ static SDValue emitComparison(SDValue LHS, SDValue RHS, ISD::CondCode CC,
3563
3564
// Can we combine a (CMP op1, (sub 0, op2) into a CMN instruction ?
3564
3565
Opcode = AArch64ISD::ADDS;
3565
3566
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)) {
3568
3568
// As we are looking for EQ/NE compares, the operands can be commuted ; can
3569
3569
// we combine a (CMP (sub 0, op1), op2) into a CMN instruction ?
3570
3570
Opcode = AArch64ISD::ADDS;
3571
3571
LHS = LHS.getOperand(1);
3572
+ OutCC = getSwappedCondition(OutCC);
3572
3573
} else if (isNullConstant(RHS) && !isUnsignedIntSetCC(CC)) {
3573
3574
if (LHS.getOpcode() == ISD::AND) {
3574
3575
// 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,
3646
3647
static SDValue emitConditionalComparison(SDValue LHS, SDValue RHS,
3647
3648
ISD::CondCode CC, SDValue CCOp,
3648
3649
AArch64CC::CondCode Predicate,
3649
- AArch64CC::CondCode OutCC,
3650
+ AArch64CC::CondCode & OutCC,
3650
3651
const SDLoc &DL, SelectionDAG &DAG) {
3651
3652
unsigned Opcode = 0;
3652
3653
const bool FullFP16 = DAG.getSubtarget<AArch64Subtarget>().hasFullFP16();
@@ -3668,12 +3669,11 @@ static SDValue emitConditionalComparison(SDValue LHS, SDValue RHS,
3668
3669
} else if (isCMN(RHS, CC, DAG)) {
3669
3670
Opcode = AArch64ISD::CCMN;
3670
3671
RHS = RHS.getOperand(1);
3671
- } else if (LHS.getOpcode() == ISD::SUB && isNullConstant(LHS.getOperand(0)) &&
3672
- isIntEqualitySetCC(CC)) {
3673
- // As we are looking for EQ/NE compares, the operands can be commuted ; can
3674
- // we combine a (CCMP (sub 0, op1), op2) into a CCMN instruction ?
3672
+ } else if (isCMN(LHS, CC, DAG)) {
3673
+ // Can we combine a (CCMP (sub 0, op1), op2) into a CCMN instruction ?
3675
3674
Opcode = AArch64ISD::CCMN;
3676
3675
LHS = LHS.getOperand(1);
3676
+ OutCC = getSwappedCondition(OutCC);
3677
3677
}
3678
3678
if (Opcode == 0)
3679
3679
Opcode = AArch64ISD::CCMP;
@@ -3786,7 +3786,7 @@ static SDValue emitConjunctionRec(SelectionDAG &DAG, SDValue Val,
3786
3786
if (ExtraCC != AArch64CC::AL) {
3787
3787
SDValue ExtraCmp;
3788
3788
if (!CCOp.getNode())
3789
- ExtraCmp = emitComparison(LHS, RHS, CC, DL, DAG);
3789
+ ExtraCmp = emitComparison(LHS, RHS, CC, ExtraCC, DL, DAG);
3790
3790
else
3791
3791
ExtraCmp = emitConditionalComparison(LHS, RHS, CC, CCOp, Predicate,
3792
3792
ExtraCC, DL, DAG);
@@ -3797,7 +3797,7 @@ static SDValue emitConjunctionRec(SelectionDAG &DAG, SDValue Val,
3797
3797
3798
3798
// Produce a normal comparison if we are first in the chain
3799
3799
if (!CCOp)
3800
- return emitComparison(LHS, RHS, CC, DL, DAG);
3800
+ return emitComparison(LHS, RHS, CC, OutCC, DL, DAG);
3801
3801
// Otherwise produce a ccmp.
3802
3802
return emitConditionalComparison(LHS, RHS, CC, CCOp, Predicate, OutCC, DL,
3803
3803
DAG);
@@ -4014,13 +4014,11 @@ static SDValue getAArch64Cmp(SDValue LHS, SDValue RHS, ISD::CondCode CC,
4014
4014
// can be turned into:
4015
4015
// cmp w12, w11, lsl #1
4016
4016
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;
4017
+ SDValue TheLHS = isCMN(LHS, CC, DAG) ? LHS.getOperand(1) : LHS;
4018
+ SDValue TheRHS = isCMN(RHS, CC, DAG) ? RHS.getOperand(1) : RHS;
4021
4019
4022
- if (getCmpOperandFoldingProfit(TheLHS) + (LHSIsCMN ? 1 : 0) >
4023
- getCmpOperandFoldingProfit(TheRHS) + (RHSIsCMN ? 1 : 0) ) {
4020
+ if (getCmpOperandFoldingProfit(TheLHS) >
4021
+ getCmpOperandFoldingProfit(TheRHS)) {
4024
4022
std::swap(LHS, RHS);
4025
4023
CC = ISD::getSetCCSwappedOperands(CC);
4026
4024
}
@@ -4056,10 +4054,11 @@ static SDValue getAArch64Cmp(SDValue LHS, SDValue RHS, ISD::CondCode CC,
4056
4054
SDValue SExt =
4057
4055
DAG.getNode(ISD::SIGN_EXTEND_INREG, DL, LHS.getValueType(), LHS,
4058
4056
DAG.getValueType(MVT::i16));
4057
+
4058
+ AArch64CC = changeIntCCToAArch64CC(CC);
4059
4059
Cmp = emitComparison(
4060
4060
SExt, DAG.getSignedConstant(ValueofRHS, DL, RHS.getValueType()), CC,
4061
- DL, DAG);
4062
- AArch64CC = changeIntCCToAArch64CC(CC);
4061
+ AArch64CC, DL, DAG);
4063
4062
}
4064
4063
}
4065
4064
@@ -4072,8 +4071,8 @@ static SDValue getAArch64Cmp(SDValue LHS, SDValue RHS, ISD::CondCode CC,
4072
4071
}
4073
4072
4074
4073
if (!Cmp) {
4075
- Cmp = emitComparison(LHS, RHS, CC, DL, DAG);
4076
4074
AArch64CC = changeIntCCToAArch64CC(CC);
4075
+ Cmp = emitComparison(LHS, RHS, CC, AArch64CC, DL, DAG);
4077
4076
}
4078
4077
AArch64cc = DAG.getConstant(AArch64CC, DL, MVT_CC);
4079
4078
return Cmp;
@@ -10664,8 +10663,8 @@ SDValue AArch64TargetLowering::LowerBR_CC(SDValue Op, SelectionDAG &DAG) const {
10664
10663
10665
10664
// Unfortunately, the mapping of LLVM FP CC's onto AArch64 CC's isn't totally
10666
10665
// clean. Some of them require two branches to implement.
10667
- SDValue Cmp = emitComparison(LHS, RHS, CC, DL, DAG) ;
10668
- AArch64CC::CondCode CC1, CC2 ;
10666
+ AArch64CC::CondCode CC1 = AArch64CC::AL, CC2 ;
10667
+ SDValue Cmp = emitComparison(LHS, RHS, CC, CC1, DL, DAG) ;
10669
10668
changeFPCCToAArch64CC(CC, CC1, CC2);
10670
10669
SDValue CC1Val = DAG.getConstant(CC1, DL, MVT::i32);
10671
10670
SDValue BR1 =
@@ -11149,12 +11148,12 @@ SDValue AArch64TargetLowering::LowerSETCC(SDValue Op, SelectionDAG &DAG) const {
11149
11148
// If that fails, we'll need to perform an FCMP + CSEL sequence. Go ahead
11150
11149
// and do the comparison.
11151
11150
SDValue Cmp;
11151
+ AArch64CC::CondCode CC1 = AArch64CC::AL, CC2;
11152
11152
if (IsStrict)
11153
11153
Cmp = emitStrictFPComparison(LHS, RHS, DL, DAG, Chain, IsSignaling);
11154
11154
else
11155
- Cmp = emitComparison(LHS, RHS, CC, DL, DAG);
11155
+ Cmp = emitComparison(LHS, RHS, CC, CC1, DL, DAG);
11156
11156
11157
- AArch64CC::CondCode CC1, CC2;
11158
11157
changeFPCCToAArch64CC(CC, CC1, CC2);
11159
11158
SDValue Res;
11160
11159
if (CC2 == AArch64CC::AL) {
@@ -11550,12 +11549,11 @@ SDValue AArch64TargetLowering::LowerSELECT_CC(
11550
11549
if (VectorCmp)
11551
11550
return VectorCmp;
11552
11551
}
11553
-
11554
- SDValue Cmp = emitComparison(LHS, RHS, CC, DL, DAG);
11552
+ AArch64CC::CondCode CC1 = AArch64CC::AL, CC2;
11553
+ SDValue Cmp = emitComparison(LHS, RHS, CC, CC1, DL, DAG);
11555
11554
11556
11555
// Unfortunately, the mapping of LLVM FP CC's onto AArch64 CC's isn't totally
11557
11556
// clean. Some of them require two CSELs to implement.
11558
- AArch64CC::CondCode CC1, CC2;
11559
11557
changeFPCCToAArch64CC(CC, CC1, CC2);
11560
11558
11561
11559
if (Flags.hasNoSignedZeros()) {
0 commit comments