-
Notifications
You must be signed in to change notification settings - Fork 14k
[AArch64] Report icmp as free if it can be folded into ands #143286
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
@llvm/pr-subscribers-llvm-analysis @llvm/pr-subscribers-backend-aarch64 Author: AZero13 (AZero13) ChangesSince changing the backend to fold x >= 1 / x < 1 -> x > 0 / x <= 0 and x <= -1 / x > -1 -> x > 0 / x <= 0, this should be reflected in the cost. Full diff: https://github.com/llvm/llvm-project/pull/143286.diff 1 Files Affected:
diff --git a/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp b/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp
index 68aec80f07e1d..72b60eaa45b78 100644
--- a/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp
+++ b/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp
@@ -4346,14 +4346,23 @@ InstructionCost AArch64TTIImpl::getCmpSelInstrCost(
}
// Treat the icmp in icmp(and, 0) as free, as we can make use of ands.
- // FIXME: This can apply to more conditions and add/sub if it can be shown to
- // be profitable.
if (ValTy->isIntegerTy() && ISD == ISD::SETCC && I &&
- ICmpInst::isEquality(VecPred) &&
+ !CmpInst::isUnsigned(VecPred) &&
TLI->isTypeLegal(TLI->getValueType(DL, ValTy)) &&
- match(I->getOperand(1), m_Zero()) &&
- match(I->getOperand(0), m_And(m_Value(), m_Value())))
- return 0;
+ match(I->getOperand(0), m_And(m_Value(), m_Value()))) {
+ if (match(I->getOperand(1), m_Zero()))
+ return 0;
+
+ // x >= 1 / x < 1 -> x > 0 / x <= 0
+ if (match(I->getOperand(1), m_One()) &&
+ (VecPred == CmpInst::ICMP_SLT || VecPred == CmpInst::ICMP_SGE))
+ return 0;
+
+ // x <= -1 / x > -1 -> x > 0 / x <= 0
+ if (match(I->getOperand(1), m_AllOnes()) &&
+ (VecPred == CmpInst::ICMP_SLE || VecPred == CmpInst::ICMP_SGT))
+ return 0;
+ }
// The base case handles scalable vectors fine for now, since it treats the
// cost as 1 * legalization cost.
|
@davemgreen Thoughts? |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hi - I think this sounds OK, some of the cases will be canonicalized by the mid-end to compare against 0. Out of interest do you have some motivating example you are trying to optimize, or is this a general improvement as you were looking at the backend patterns?
Can you add some extra tests for each of the cases?
The cost model needs to be accurate as possible |
Since changing the backend to fold x >= 1 / x < 1 -> x > 0 / x <= 0 and x <= -1 / x > -1 -> x > 0 / x <= 0, this should be reflected in the cost.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM, thanks. Do let @davemgreen have another look though.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sure, LGTM. Are you happy for this to be merged?
Yes |
Since changing the backend to fold x >= 1 / x < 1 -> x > 0 / x <= 0 and x <= -1 / x > -1 -> x > 0 / x <= 0, this should be reflected in the cost.