[llvm] [GloalISel] Fold G_CTTZ if possible (PR #86224)
Amara Emerson via llvm-commits
llvm-commits at lists.llvm.org
Fri Mar 22 10:46:09 PDT 2024
================
@@ -996,6 +996,37 @@ llvm::ConstantFoldCTLZ(Register Src, const MachineRegisterInfo &MRI) {
return std::nullopt;
}
+std::optional<SmallVector<unsigned>>
+llvm::ConstantFoldCTTZ(Register Src, const MachineRegisterInfo &MRI) {
+ LLT Ty = MRI.getType(Src);
+ SmallVector<unsigned> FoldedCTTZs;
+ auto tryFoldScalar = [&](Register R) -> std::optional<unsigned> {
+ auto MaybeCst = getIConstantVRegVal(R, MRI);
+ if (!MaybeCst)
+ return std::nullopt;
+ return MaybeCst->countTrailingZeros();
+ };
+ if (Ty.isVector()) {
+ // Try to constant fold each element.
+ auto *BV = getOpcodeDef<GBuildVector>(Src, MRI);
+ if (!BV)
+ return std::nullopt;
+ for (unsigned SrcIdx = 0; SrcIdx < BV->getNumSources(); ++SrcIdx) {
+ if (auto MaybeFold = tryFoldScalar(BV->getSourceReg(SrcIdx))) {
+ FoldedCTTZs.emplace_back(*MaybeFold);
+ continue;
+ }
+ return std::nullopt;
+ }
+ return FoldedCTTZs;
+ }
+ if (auto MaybeCst = tryFoldScalar(Src)) {
+ FoldedCTTZs.emplace_back(*MaybeCst);
+ return FoldedCTTZs;
+ }
+ return std::nullopt;
+}
+
----------------
aemerson wrote:
This code is almost identical to `ConstantFoldCTLZ()`. Can we re-factor this to re-use it? Perhaps pass a lambda to do the actual computation, i.e. the `countTrailingZeros()` call.
https://github.com/llvm/llvm-project/pull/86224
More information about the llvm-commits
mailing list