[llvm] [CodeGenPrepare] Convert `ctpop(X) ==/!= 1` into `ctpop(X) u</u> 2/1` (PR #111284)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Mon Oct 7 03:11:19 PDT 2024
================
@@ -2111,6 +2111,27 @@ bool CodeGenPrepare::optimizeURem(Instruction *Rem) {
return false;
}
+/// Some targets have better codegen for `ctpop(X) u< 2` than `ctpop(X) == 1`.
+/// This function converts `ctpop(X) ==/!= 1` into `ctpop(X) u</u> 2/1` if the
+/// result cannot be zero.
+static bool adjustIsPower2Test(CmpInst *Cmp, const DataLayout &DL) {
+ ICmpInst::Predicate Pred;
+ if (!match(Cmp, m_ICmp(Pred, m_Intrinsic<Intrinsic::ctpop>(), m_One())))
+ return false;
+ if (!ICmpInst::isEquality(Pred))
+ return false;
+ auto *II = cast<IntrinsicInst>(Cmp->getOperand(0));
----------------
arsenm wrote:
Not really, it should be neutral for amdgpu. It's just weird to do something unconditional in CGP without any kind of target information. I guess the only reason to do it here is to use the better IR version of isKnownNonZero (which we could skip if there's no plus to doing this)
https://github.com/llvm/llvm-project/pull/111284
More information about the llvm-commits
mailing list