[llvm] [AArch64] Use isKnownNonZero to optimize eligible compares to cmn and ccmn (PR #96349)
via llvm-commits
llvm-commits at lists.llvm.org
Sun Jul 21 08:37:02 PDT 2024
================
@@ -3566,13 +3574,21 @@ static SDValue emitConditionalComparison(SDValue LHS, SDValue RHS,
Opcode = AArch64ISD::CCMN;
RHS = DAG.getConstant(Imm.abs(), DL, Const->getValueType(0));
}
- } else if (RHS.getOpcode() == ISD::SUB) {
- SDValue SubOp0 = RHS.getOperand(0);
- if (isNullConstant(SubOp0) && (CC == ISD::SETEQ || CC == ISD::SETNE)) {
- // See emitComparison() on why we can only do this for SETEQ and SETNE.
- Opcode = AArch64ISD::CCMN;
- RHS = RHS.getOperand(1);
- }
+ } else if (isCMN(RHS, CC, DAG)) {
+ Opcode = AArch64ISD::CCMN;
+ RHS = RHS.getOperand(1);
+ } else if (isCMN(LHS, CC, DAG) &&
+ (isIntEqualitySetCC(CC) ||
+ (isUnsignedIntSetCC(CC) && DAG.isKnownNeverZero(RHS)) ||
+ (isSignedIntSetCC(CC) && cannotBeIntMin(RHS, DAG)))) {
----------------
AtariDreams wrote:
Proof:
It is known that if a > b, then b < a,
it is known that if b < a, then -b > -a
For the degenerative cases of INT_MIN and 0 for signed and unsigned comparisons, this is where knownbits steps in: https://alive2.llvm.org/ce/z/8YTkie
https://github.com/llvm/llvm-project/pull/96349
More information about the llvm-commits
mailing list