diff --git a/src/V3DfgPeephole.cpp b/src/V3DfgPeephole.cpp index 7c0fc7e25..8181dcfab 100644 --- a/src/V3DfgPeephole.cpp +++ b/src/V3DfgPeephole.cpp @@ -138,6 +138,7 @@ template <> const DfgDataType& resultDType (const DfgVertex* lhsp // Unary constant folding template void foldOp(V3Number& out, const V3Number& src); +template <> void foldOp (V3Number& out, const V3Number& src) { out.opCountOnes(src); } template <> void foldOp (V3Number& out, const V3Number& src) { out.opAssign(src); } template <> void foldOp (V3Number& out, const V3Number& src) { out.opExtendS(src, src.width()); } template <> void foldOp (V3Number& out, const V3Number& src) { out.opLogNot(src); } @@ -1195,6 +1196,10 @@ class V3DfgPeephole final : public DfgVisitor { // DfgVertexUnary //========================================================================= + void visit(DfgCountOnes* const vtxp) override { + if (foldUnary(vtxp)) return; + } + void visit(DfgExtend* const vtxp) override { if (foldUnary(vtxp)) return; diff --git a/test_regress/t/t_dfg_peephole.v b/test_regress/t/t_dfg_peephole.v index 9e5c64da4..3c9ce7ae8 100644 --- a/test_regress/t/t_dfg_peephole.v +++ b/test_regress/t/t_dfg_peephole.v @@ -62,6 +62,7 @@ module t ( //verilator lint_on WIDTH `signal(FOLD_UNARY_Extend, tmp_FOLD_UNARY_Extend); `signal(FOLD_UNARY_ExtendS, tmp_FOLD_UNARY_ExtendS); + `signal(FOLD_UNARY_CountOnes, $countones(const_a)); `signal(FOLD_UNARY_OneHot, $onehot(const_a)); `signal(FOLD_UNARY_OneHot0, $onehot0(const_a)); `signal(FOLD_UNARY_OneHot_A, $onehot(const_a[0]));