[PATCH] D137936: [AArch64] Optimize cmp chain when the result is tested for [in]equality with 0
chenglin.bi via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Nov 18 00:37:41 PST 2022
bcl5980 added a comment.
Maybe you still can try to enable the optimize before legalization to fix these issues like:
if ((Cond == ISD::SETEQ || Cond == ISD::SETNE) && isNullConstant(RHS) &&
LHS->getOpcode() == ISD::OR && LHS->hasOneUse() &&
isOrXorChain(LHS, NumXors, WorkList)) {
SDValue XOR0, XOR1;
std::tie(XOR0, XOR1) = WorkList[0];
SDValue Cmp = DAG.getSetCC(DL, VT, XOR0, XOR1, ISD::SETNE);
for (unsigned I = 1; I < WorkList.size(); I++) {
std::tie(XOR0, XOR1) = WorkList[I];
SDValue CmpChain = DAG.getSetCC(DL, VT, XOR0, XOR1, ISD::SETNE);
Cmp = DAG.getNode(ISD::OR, DL, VT, Cmp, CmpChain);
}
// Exit early by inverting the condition, which help reduce indentations.
return DAG.getSetCC(DL, VT, Cmp, DAG.getConstant(0, DL, VT), Cond);
}
After that you need remove `if (!DCI.isBeforeLegalize())` for `performOrXorChainCombine` and remove the function call in lowerSetCC to make the code cleaner.
As @dmgreen mentioned before, maybe you can try to combine to `AArch64ISD::SUBS` + `AArch64ISD::CCMP`. But you may need to fix some type legalization issues to make it works.
Current patch looks too specific, I think.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D137936/new/
https://reviews.llvm.org/D137936
More information about the llvm-commits
mailing list