@@ -3493,6 +3493,13 @@ bool isLegalCmpImmed(APInt C) {
3493
3493
return isLegalArithImmed(C.abs().getZExtValue());
3494
3494
}
3495
3495
3496
+ unsigned numberOfInstrToLoadImm(APInt C) {
3497
+ uint64_t Imm = C.getZExtValue();
3498
+ SmallVector<AArch64_IMM::ImmInsnModel> Insn;
3499
+ AArch64_IMM::expandMOVImm(Imm, 32, Insn);
3500
+ return Insn.size();
3501
+ }
3502
+
3496
3503
static bool isSafeSignedCMN(SDValue Op, SelectionDAG &DAG) {
3497
3504
// 0 - INT_MIN sign wraps, so no signed wrap means cmn is safe.
3498
3505
if (Op->getFlags().hasNoSignedWrap())
@@ -3962,6 +3969,7 @@ static SDValue getAArch64Cmp(SDValue LHS, SDValue RHS, ISD::CondCode CC,
3962
3969
// CC has already been adjusted.
3963
3970
RHS = DAG.getConstant(0, DL, VT);
3964
3971
} else if (!isLegalCmpImmed(C)) {
3972
+ unsigned NumImmForC = numberOfInstrToLoadImm(C);
3965
3973
// Constant does not fit, try adjusting it by one?
3966
3974
switch (CC) {
3967
3975
default:
@@ -3970,43 +3978,48 @@ static SDValue getAArch64Cmp(SDValue LHS, SDValue RHS, ISD::CondCode CC,
3970
3978
case ISD::SETGE:
3971
3979
if (!C.isMinSignedValue()) {
3972
3980
APInt CMinusOne = C - 1;
3973
- if (isLegalCmpImmed(CMinusOne)) {
3981
+ if (isLegalCmpImmed(CMinusOne) ||
3982
+ (NumImmForC > numberOfInstrToLoadImm(CMinusOne))) {
3974
3983
CC = (CC == ISD::SETLT) ? ISD::SETLE : ISD::SETGT;
3975
3984
RHS = DAG.getConstant(CMinusOne, DL, VT);
3976
3985
}
3977
3986
}
3978
3987
break;
3979
3988
case ISD::SETULT:
3980
- case ISD::SETUGE:
3981
- if (!C.isZero()) {
3982
- APInt CMinusOne = C - 1;
3983
- if (isLegalCmpImmed(CMinusOne)) {
3984
- CC = (CC == ISD::SETULT) ? ISD::SETULE : ISD::SETUGT;
3985
- RHS = DAG.getConstant(CMinusOne, DL, VT);
3986
- }
3989
+ case ISD::SETUGE: {
3990
+ // C is not 0 because it is a legal immediate.
3991
+ assert(!C.isZero() && "C should not be zero here");
3992
+ APInt CMinusOne = C - 1;
3993
+ if (isLegalCmpImmed(CMinusOne) ||
3994
+ (NumImmForC > numberOfInstrToLoadImm(CMinusOne))) {
3995
+ CC = (CC == ISD::SETULT) ? ISD::SETULE : ISD::SETUGT;
3996
+ RHS = DAG.getConstant(CMinusOne, DL, VT);
3987
3997
}
3988
3998
break;
3999
+ }
3989
4000
case ISD::SETLE:
3990
4001
case ISD::SETGT:
3991
4002
if (!C.isMaxSignedValue()) {
3992
4003
APInt CPlusOne = C + 1;
3993
- if (isLegalCmpImmed(CPlusOne)) {
4004
+ if (isLegalCmpImmed(CPlusOne) ||
4005
+ (NumImmForC > numberOfInstrToLoadImm(CPlusOne))) {
3994
4006
CC = (CC == ISD::SETLE) ? ISD::SETLT : ISD::SETGE;
3995
4007
RHS = DAG.getConstant(CPlusOne, DL, VT);
3996
4008
}
3997
4009
}
3998
4010
break;
3999
4011
case ISD::SETULE:
4000
- case ISD::SETUGT:
4001
- if (!C.isAllOnes()) {
4002
- APInt CPlusOne = C + 1;
4003
- if (isLegalCmpImmed(CPlusOne)) {
4004
- CC = (CC == ISD::SETULE) ? ISD::SETULT : ISD::SETUGE;
4005
- RHS = DAG.getConstant(CPlusOne, DL, VT) ;
4006
- }
4012
+ case ISD::SETUGT: {
4013
+ assert (!C.isAllOnes() && "C should not be -1 here");
4014
+ APInt CPlusOne = C + 1;
4015
+ if (isLegalCmpImmed(CPlusOne) ||
4016
+ (NumImmForC > numberOfInstrToLoadImm(CPlusOne))) {
4017
+ CC = (CC == ISD::SETULE) ? ISD::SETULT : ISD::SETUGE ;
4018
+ RHS = DAG.getConstant(CPlusOne, DL, VT);
4007
4019
}
4008
4020
break;
4009
4021
}
4022
+ }
4010
4023
}
4011
4024
}
4012
4025
0 commit comments