diff --git a/src/V3DfgPeephole.cpp b/src/V3DfgPeephole.cpp index 6ca05983a..bfea00f2a 100644 --- a/src/V3DfgPeephole.cpp +++ b/src/V3DfgPeephole.cpp @@ -150,11 +150,7 @@ class V3DfgPeephole final : public DfgVisitor { return true; } - void addToWorkList(DfgVertex* vtxp) { - // We only process actual operation vertices - if (vtxp->is() || vtxp->is()) return; - m_workList.push_front(*vtxp); - } + void addToWorkList(DfgVertex* vtxp) { m_workList.push_front(*vtxp); } void addSourcesToWorkList(DfgVertex* vtxp) { vtxp->foreachSource([&](DfgVertex& src) { @@ -179,10 +175,17 @@ class V3DfgPeephole final : public DfgVisitor { // Otherwise we can delete it now. // Remove from cache m_cache.invalidateByValue(vtxp); + // This pass only removes variables that are either not driven in this graph, + // or are not observable outside the graph. If there is also no external write + // to the variable and no references in other graph then delete the Ast var too. + const DfgVertexVar* const varp = vtxp->cast(); + AstNode* const nodep + = varp && !varp->isVolatile() && !varp->hasDfgRefs() ? varp->nodep() : nullptr; // Should not have sinks UASSERT_OBJ(!vtxp->hasSinks(), vtxp, "Should not delete used vertex"); - // + // Delete vertex and Ast variable if any VL_DO_DANGLING(vtxp->unlinkDelete(m_dfg), vtxp); + if (nodep) VL_DO_DANGLING(nodep->unlinkFrBack()->deleteTree(), nodep); } void replace(DfgVertex* vtxp, DfgVertex* replacementp) { @@ -899,12 +902,9 @@ class V3DfgPeephole final : public DfgVisitor { if (replacementp) { // Replace with sel from driver APPLYING(PUSH_SEL_THROUGH_SPLICE) { + addToWorkList(varp); // In case it became redundant and can be removed replace(vtxp, replacementp); - // Special case just for this pattern: delete temporary if became unsued - if (!varp->hasSinks() && !varp->hasDfgRefs()) { - addToWorkList(splicep); // So it can be delete itself if unused - VL_DO_DANGLING(varp->unlinkDelete(m_dfg), varp); // Delete it - } + return; } } } @@ -1738,22 +1738,58 @@ class V3DfgPeephole final : public DfgVisitor { } } + void visit(DfgVertexVar* vtxp) override { + if (vtxp->hasSinks()) return; + if (vtxp->isObserved()) return; + if (vtxp->defaultp()) return; + + // If undriven, or driven from another var, it is completely redundant. + if (!vtxp->srcp() || vtxp->srcp()->is()) { + APPLYING(REMOVE_VAR) { + deleteVertex(vtxp); + return; + } + } + + // Otherwise remove if there is only one sink that is not a removable variable + bool foundOne = false; + const bool keep = vtxp->srcp()->foreachSink([&](DfgVertex& sink) { + // Ignore non observable variable sinks. These can be eliminated. + if (const DfgVertexVar* const varp = sink.cast()) { + if (!varp->hasSinks() && !varp->isObserved()) return false; + } + if (foundOne) return true; + foundOne = true; + return false; + }); + if (!keep) { + APPLYING(REMOVE_VAR) { + deleteVertex(vtxp); + return; + } + } + } + #undef APPLYING V3DfgPeephole(DfgGraph& dfg, V3DfgPeepholeContext& ctx) : m_dfg{dfg} , m_ctx{ctx} { + // Add all variable vertices to the work list. Do this first so they are processed last. + // This order has a better chance of preserving original variables in case they are needed. + for (DfgVertexVar& vtx : m_dfg.varVertices()) addToWorkList(&vtx); + // Add all operation vertices to the work list and cache for (DfgVertex& vtx : m_dfg.opVertices()) { - m_workList.push_front(vtx); + addToWorkList(&vtx); m_cache.cache(&vtx); } // Process the work list m_workList.foreach([&](DfgVertex& vtx) { - // Remove unused vertices as we go - if (!vtx.hasSinks()) { + // Remove unused operations as we go. Some vars may be removed in the visit method. + if (!vtx.hasSinks() && !vtx.is()) { deleteVertex(&vtx); return; } diff --git a/src/V3DfgPeepholePatterns.h b/src/V3DfgPeepholePatterns.h index a0d5ee059..d463fb01b 100644 --- a/src/V3DfgPeepholePatterns.h +++ b/src/V3DfgPeepholePatterns.h @@ -64,6 +64,7 @@ _FOR_EACH_DFG_PEEPHOLE_OPTIMIZATION_APPLY(macro, REMOVE_SEL_FROM_LHS_OF_CONCAT) \ _FOR_EACH_DFG_PEEPHOLE_OPTIMIZATION_APPLY(macro, REMOVE_SEL_FROM_RHS_OF_CONCAT) \ _FOR_EACH_DFG_PEEPHOLE_OPTIMIZATION_APPLY(macro, REMOVE_SUB_ZERO) \ + _FOR_EACH_DFG_PEEPHOLE_OPTIMIZATION_APPLY(macro, REMOVE_VAR) \ _FOR_EACH_DFG_PEEPHOLE_OPTIMIZATION_APPLY(macro, REMOVE_WIDTH_ONE_REDUCTION) \ _FOR_EACH_DFG_PEEPHOLE_OPTIMIZATION_APPLY(macro, REMOVE_XOR_WITH_ZERO) \ _FOR_EACH_DFG_PEEPHOLE_OPTIMIZATION_APPLY(macro, REPLACE_AND_OF_NOT_AND_NEQ) \ diff --git a/test_regress/t/t_dfg_stats_patterns_post_inline.out b/test_regress/t/t_dfg_stats_patterns_post_inline.out index 5984277cd..993127bf2 100644 --- a/test_regress/t/t_dfg_stats_patterns_post_inline.out +++ b/test_regress/t/t_dfg_stats_patterns_post_inline.out @@ -1,96 +1,98 @@ DFG 'post inline' patterns with depth 1 9 (CONCAT _A:1 _B:a):b 8 (REDXOR _A:a):1 - 3 (AND _A:a _B:a)*:a 3 (NOT vA:a)*:a - 2 (REPLICATE _A:a cA:a)*:b - 1 (CONCAT '0:a _A:b):A + 2 (AND _A:a _B:a):a + 1 (AND _A:a _B:a)*:a 1 (CONCAT _A:1 _B:1):a 1 (NOT _A:a):a 1 (REDXOR _A:a)*:1 1 (REPLICATE _A:1 cA:a)*:b + 1 (REPLICATE _A:a cA:a)*:b + 1 (REPLICATE _A:a cA:a):b 1 (REPLICATE _A:a cA:b)*:b 1 (REPLICATE _A:a cA:b)*:c - 1 (SEL@0 _A:a)*:1 - 1 (SEL@0 _A:a)*:b + 1 (SEL@0 _A:a):1 + 1 (SEL@0 _A:a):b 1 (SEL@A _A:a):1 DFG 'post inline' patterns with depth 2 6 (CONCAT (REDXOR _A:a):1 (CONCAT _B:1 _C:b):c):d - 3 (AND (NOT vA:a)*:a (NOT vB:a)*:a)*:a - 3 (REDXOR (AND _A:a _B:a)*:a):1 - 1 (CONCAT '0:a (REPLICATE _A:a cA:a)*:b):A + 2 (AND (NOT vA:a)*:a (NOT vB:a)*:a):a + 2 (REDXOR (AND _A:a _B:a):a):1 + 1 (AND (NOT vA:a)*:a (NOT vB:a)*:a)*:a 1 (CONCAT (REDXOR _A:a)*:1 (CONCAT _B:1 _C:b):c):d 1 (CONCAT (REDXOR _A:a):1 (CONCAT _B:1 _C:1):b):c 1 (CONCAT (REDXOR _A:a):1 (REDXOR _B:b)*:1):c - 1 (CONCAT (SEL@0 _A:a)*:1 (CONCAT _B:1 _C:b):c):d + 1 (CONCAT (SEL@0 _A:a):1 (CONCAT _B:1 _C:b):c):d 1 (NOT (REPLICATE _A:a cA:b)*:b):b + 1 (REDXOR (AND _A:a _B:a)*:a):1 1 (REDXOR (REPLICATE _A:1 cA:a)*:b):1 - 1 (REDXOR (REPLICATE _A:a cA:a)*:b)*:1 1 (REDXOR (REPLICATE _A:a cA:a)*:b):1 + 1 (REDXOR (REPLICATE _A:a cA:a):b)*:1 1 (REDXOR (REPLICATE _A:a cA:b)*:b):1 1 (REDXOR (REPLICATE _A:a cA:b)*:c):1 - 1 (REDXOR (SEL@0 _A:a)*:b):1 + 1 (REDXOR (SEL@0 _A:a):b):1 1 (REPLICATE (NOT _A:a):a cA:a)*:b 1 (REPLICATE (REPLICATE _A:1 cA:a)*:b cB:a)*:c - 1 (REPLICATE (REPLICATE _A:a cA:b)*:b cA:b)*:c + 1 (REPLICATE (REPLICATE _A:a cA:b)*:b cA:b):c 1 (REPLICATE (REPLICATE _A:a cA:b)*:c cA:b)*:b 1 (REPLICATE (SEL@A _A:a):1 cA:b)*:c - 1 (SEL@0 (AND _A:a _B:a)*:a)*:1 - 1 (SEL@0 (REPLICATE _A:a cA:a)*:b)*:c + 1 (SEL@0 (AND _A:a _B:a)*:a):1 + 1 (SEL@0 (REPLICATE _A:a cA:a)*:b):c 1 (SEL@A (AND _A:a _B:a)*:a):1 DFG 'post inline' patterns with depth 3 - 3 (REDXOR (AND (NOT vA:a)*:a (NOT vB:a)*:a)*:a):1 - 2 (CONCAT (REDXOR (AND _A:a _B:a)*:a):1 (CONCAT (REDXOR _C:a):1 (CONCAT _D:1 _E:b):c):d):e - 1 (CONCAT '0:a (REPLICATE (REPLICATE _A:b cA:a)*:a cA:a)*:c):A - 1 (CONCAT (REDXOR (AND _A:a _B:a)*:a):1 (CONCAT (SEL@0 _C:a)*:1 (CONCAT _D:1 _E:b):c):d):e + 2 (REDXOR (AND (NOT vA:a)*:a (NOT vB:a)*:a):a):1 + 1 (CONCAT (REDXOR (AND _A:a _B:a)*:a):1 (CONCAT (REDXOR _C:a):1 (CONCAT _D:1 _E:b):c):d):e + 1 (CONCAT (REDXOR (AND _A:a _B:a):a):1 (CONCAT (REDXOR _C:a):1 (CONCAT _D:1 _E:b):c):d):e + 1 (CONCAT (REDXOR (AND _A:a _B:a):a):1 (CONCAT (SEL@0 _C:a):1 (CONCAT _D:1 _E:b):c):d):e 1 (CONCAT (REDXOR (REPLICATE _A:1 cA:a)*:b):1 (CONCAT (REDXOR _B:c):1 (CONCAT _C:1 _D:d):e):f):g - 1 (CONCAT (REDXOR (REPLICATE _A:a cA:a)*:b)*:1 (CONCAT (REDXOR _B:b):1 (CONCAT _C:1 _D:1):c):d):e 1 (CONCAT (REDXOR (REPLICATE _A:a cA:a)*:b):1 (CONCAT (REDXOR _B:c):1 (REDXOR _C:b)*:1):d):e + 1 (CONCAT (REDXOR (REPLICATE _A:a cA:a):b)*:1 (CONCAT (REDXOR _B:b):1 (CONCAT _C:1 _D:1):c):d):e 1 (CONCAT (REDXOR (REPLICATE _A:a cA:b)*:b):1 (CONCAT (REDXOR _B:c)*:1 (CONCAT _C:1 _D:d):e):f):g 1 (CONCAT (REDXOR (REPLICATE _A:a cA:b)*:c):1 (CONCAT (REDXOR _B:b):1 (CONCAT _C:1 _D:d):e):f):g - 1 (CONCAT (REDXOR (SEL@0 _A:a)*:b):1 (REDXOR (REPLICATE _B:c cA:c)*:a)*:1):d - 1 (CONCAT (SEL@0 (AND _A:a _B:a)*:a)*:1 (CONCAT (REDXOR _C:b):1 (CONCAT _D:1 _E:c):d):e):b + 1 (CONCAT (REDXOR (SEL@0 _A:a):b):1 (REDXOR (REPLICATE _B:c cA:c):a)*:1):d + 1 (CONCAT (SEL@0 (AND _A:a _B:a)*:a):1 (CONCAT (REDXOR _C:b):1 (CONCAT _D:1 _E:c):d):e):b 1 (NOT (REPLICATE (REPLICATE _A:a cA:b)*:c cA:b)*:b):b + 1 (REDXOR (AND (NOT vA:a)*:a (NOT vB:a)*:a)*:a):1 1 (REDXOR (REPLICATE (NOT _A:a):a cA:a)*:b):1 1 (REDXOR (REPLICATE (REPLICATE _A:1 cA:a)*:b cB:a)*:c):1 - 1 (REDXOR (REPLICATE (REPLICATE _A:a cA:b)*:b cA:b)*:c)*:1 + 1 (REDXOR (REPLICATE (REPLICATE _A:a cA:b)*:b cA:b):c)*:1 1 (REDXOR (REPLICATE (REPLICATE _A:a cA:b)*:c cA:b)*:b):1 1 (REDXOR (REPLICATE (SEL@A _A:a):1 cA:b)*:c):1 - 1 (REDXOR (SEL@0 (REPLICATE _A:a cA:a)*:b)*:c):1 + 1 (REDXOR (SEL@0 (REPLICATE _A:a cA:a)*:b):c):1 1 (REPLICATE (NOT (REPLICATE _A:a cA:b)*:b):b cA:b)*:c 1 (REPLICATE (REPLICATE (REPLICATE _A:1 cA:a)*:b cB:a)*:c cB:a)*:a - 1 (REPLICATE (REPLICATE (REPLICATE _A:a cA:b)*:c cA:b)*:b cA:b)*:d + 1 (REPLICATE (REPLICATE (REPLICATE _A:a cA:b)*:c cA:b)*:b cA:b):d 1 (REPLICATE (REPLICATE (SEL@A _A:a):1 cA:b)*:c cB:b)*:d 1 (REPLICATE (SEL@A (AND _A:a _B:a)*:a):1 cA:b)*:c - 1 (SEL@0 (AND (NOT vA:a)*:a (NOT vB:a)*:a)*:a)*:1 - 1 (SEL@0 (REPLICATE (NOT _A:a):a cA:a)*:b)*:c + 1 (SEL@0 (AND (NOT vA:a)*:a (NOT vB:a)*:a)*:a):1 + 1 (SEL@0 (REPLICATE (NOT _A:a):a cA:a)*:b):c 1 (SEL@A (AND (NOT vA:a)*:a (NOT vB:a)*:a)*:a):1 DFG 'post inline' patterns with depth 4 - 1 (CONCAT '0:a (REPLICATE (REPLICATE (REPLICATE _A:b cA:a)*:c cA:a)*:a cA:a)*:d):A - 1 (CONCAT (REDXOR (AND (NOT vA:a)*:a (NOT vB:a)*:a)*:a):1 (CONCAT (REDXOR (AND _A:a _B:a)*:a):1 (CONCAT (REDXOR _C:a):1 (CONCAT _D:1 _E:b):c):d):e):f - 1 (CONCAT (REDXOR (AND (NOT vA:a)*:a (NOT vB:a)*:a)*:a):1 (CONCAT (REDXOR (AND _A:a _B:a)*:a):1 (CONCAT (SEL@0 _C:a)*:1 (CONCAT _D:1 _E:b):c):d):e):f - 1 (CONCAT (REDXOR (AND (NOT vA:a)*:a (NOT vB:a)*:a)*:a):1 (CONCAT (SEL@0 (AND _A:a _B:a)*:a)*:1 (CONCAT (REDXOR _C:b):1 (CONCAT _D:1 _E:c):d):e):b):f - 1 (CONCAT (REDXOR (REPLICATE (NOT _A:a):a cA:a)*:b):1 (CONCAT (REDXOR (SEL@0 _B:b)*:c):1 (REDXOR (REPLICATE _A:a cA:a)*:b)*:1):d):e + 1 (CONCAT (REDXOR (AND (NOT vA:a)*:a (NOT vB:a)*:a)*:a):1 (CONCAT (REDXOR (AND _A:a _B:a):a):1 (CONCAT (REDXOR _C:a):1 (CONCAT _D:1 _E:b):c):d):e):f + 1 (CONCAT (REDXOR (AND (NOT vA:a)*:a (NOT vB:a)*:a):a):1 (CONCAT (REDXOR (AND _A:a _B:a):a):1 (CONCAT (SEL@0 _C:a):1 (CONCAT _D:1 _E:b):c):d):e):f + 1 (CONCAT (REDXOR (AND (NOT vA:a)*:a (NOT vB:a)*:a):a):1 (CONCAT (SEL@0 (AND _A:a _B:a)*:a):1 (CONCAT (REDXOR _C:b):1 (CONCAT _D:1 _E:c):d):e):b):f + 1 (CONCAT (REDXOR (REPLICATE (NOT _A:a):a cA:a)*:b):1 (CONCAT (REDXOR (SEL@0 _B:b):c):1 (REDXOR (REPLICATE _A:a cA:a):b)*:1):d):e 1 (CONCAT (REDXOR (REPLICATE (REPLICATE _A:1 cA:a)*:b cB:a)*:c):1 (CONCAT (REDXOR (REPLICATE _B:c cB:a)*:a):1 (CONCAT (REDXOR _C:d)*:1 (CONCAT _D:1 _E:e):f):g):h):i - 1 (CONCAT (REDXOR (REPLICATE (REPLICATE _A:a cA:b)*:b cA:b)*:c)*:1 (CONCAT (REDXOR (REPLICATE _B:b cA:b)*:c):1 (CONCAT (REDXOR _C:d):1 (REDXOR _D:c)*:1):e):f):g - 1 (CONCAT (REDXOR (REPLICATE (REPLICATE _A:a cA:b)*:c cA:b)*:b):1 (CONCAT (REDXOR (REPLICATE _B:b cA:b)*:d)*:1 (CONCAT (REDXOR _C:d):1 (CONCAT _D:1 _E:1):e):f):g):h + 1 (CONCAT (REDXOR (REPLICATE (REPLICATE _A:a cA:b)*:b cA:b):c)*:1 (CONCAT (REDXOR (REPLICATE _B:b cA:b)*:c):1 (CONCAT (REDXOR _C:d):1 (REDXOR _D:c)*:1):e):f):g + 1 (CONCAT (REDXOR (REPLICATE (REPLICATE _A:a cA:b)*:c cA:b)*:b):1 (CONCAT (REDXOR (REPLICATE _B:b cA:b):d)*:1 (CONCAT (REDXOR _C:d):1 (CONCAT _D:1 _E:1):e):f):g):h 1 (CONCAT (REDXOR (REPLICATE (SEL@A _A:a):1 cA:b)*:c):1 (CONCAT (REDXOR (REPLICATE _B:c cB:b)*:d):1 (CONCAT (REDXOR _C:b):1 (CONCAT _D:1 _E:e):a):f):g):h - 1 (CONCAT (REDXOR (SEL@0 (REPLICATE _A:a cA:a)*:b)*:c):1 (REDXOR (REPLICATE (REPLICATE _B:d cA:a)*:a cA:a)*:b)*:1):e - 1 (CONCAT (SEL@0 (AND (NOT vA:a)*:a (NOT vB:a)*:a)*:a)*:1 (CONCAT (REDXOR (REPLICATE _A:1 cA:b)*:c):1 (CONCAT (REDXOR _B:d):1 (CONCAT _C:1 _D:a):e):f):g):c + 1 (CONCAT (REDXOR (SEL@0 (REPLICATE _A:a cA:a)*:b):c):1 (REDXOR (REPLICATE (REPLICATE _B:d cA:a)*:a cA:a):b)*:1):e + 1 (CONCAT (SEL@0 (AND (NOT vA:a)*:a (NOT vB:a)*:a)*:a):1 (CONCAT (REDXOR (REPLICATE _A:1 cA:b)*:c):1 (CONCAT (REDXOR _B:d):1 (CONCAT _C:1 _D:a):e):f):g):c 1 (NOT (REPLICATE (REPLICATE (REPLICATE _A:1 cA:a)*:b cB:a)*:c cB:a)*:a):a 1 (REDXOR (REPLICATE (NOT (REPLICATE _A:a cA:b)*:b):b cA:b)*:c):1 1 (REDXOR (REPLICATE (REPLICATE (REPLICATE _A:1 cA:a)*:b cB:a)*:c cB:a)*:a):1 - 1 (REDXOR (REPLICATE (REPLICATE (REPLICATE _A:a cA:b)*:c cA:b)*:b cA:b)*:d)*:1 + 1 (REDXOR (REPLICATE (REPLICATE (REPLICATE _A:a cA:b)*:c cA:b)*:b cA:b):d)*:1 1 (REDXOR (REPLICATE (REPLICATE (SEL@A _A:a):1 cA:b)*:c cB:b)*:d):1 1 (REDXOR (REPLICATE (SEL@A (AND _A:a _B:a)*:a):1 cA:b)*:c):1 - 1 (REDXOR (SEL@0 (REPLICATE (NOT _A:a):a cA:a)*:b)*:c):1 + 1 (REDXOR (SEL@0 (REPLICATE (NOT _A:a):a cA:a)*:b):c):1 1 (REPLICATE (NOT (REPLICATE (REPLICATE _A:a cA:b)*:c cA:b)*:b):b cA:b)*:d - 1 (REPLICATE (REPLICATE (REPLICATE (REPLICATE _A:1 cA:a)*:b cB:a)*:c cB:a)*:a cB:a)*:d + 1 (REPLICATE (REPLICATE (REPLICATE (REPLICATE _A:1 cA:a)*:b cB:a)*:c cB:a)*:a cB:a):d 1 (REPLICATE (REPLICATE (REPLICATE (SEL@A _A:a):1 cA:b)*:c cB:b)*:d cB:b)*:b 1 (REPLICATE (REPLICATE (SEL@A (AND _A:a _B:a)*:a):1 cA:b)*:c cB:b)*:d 1 (REPLICATE (SEL@A (AND (NOT vA:a)*:a (NOT vB:a)*:a)*:a):1 cA:b)*:c - 1 (SEL@0 (REPLICATE (NOT (REPLICATE _A:a cA:b)*:b):b cA:b)*:c)*:d + 1 (SEL@0 (REPLICATE (NOT (REPLICATE _A:a cA:b)*:b):b cA:b)*:c):d diff --git a/test_regress/t/t_dfg_stats_patterns_pre_inline.out b/test_regress/t/t_dfg_stats_patterns_pre_inline.out index a34f6037c..f7b216e9b 100644 --- a/test_regress/t/t_dfg_stats_patterns_pre_inline.out +++ b/test_regress/t/t_dfg_stats_patterns_pre_inline.out @@ -1,96 +1,98 @@ DFG 'pre inline' patterns with depth 1 9 (CONCAT _A:1 _B:a):b 8 (REDXOR _A:a):1 - 3 (AND _A:a _B:a)*:a 3 (NOT vA:a)*:a - 2 (REPLICATE _A:a cA:a)*:b - 1 (CONCAT '0:a _A:b):A + 2 (AND _A:a _B:a):a + 1 (AND _A:a _B:a)*:a 1 (CONCAT _A:1 _B:1):a 1 (NOT _A:a):a 1 (REDXOR _A:a)*:1 1 (REPLICATE _A:1 cA:a)*:b + 1 (REPLICATE _A:a cA:a)*:b + 1 (REPLICATE _A:a cA:a):b 1 (REPLICATE _A:a cA:b)*:b 1 (REPLICATE _A:a cA:b)*:c - 1 (SEL@0 _A:a)*:1 - 1 (SEL@0 _A:a)*:b + 1 (SEL@0 _A:a):1 + 1 (SEL@0 _A:a):b 1 (SEL@A _A:a):1 DFG 'pre inline' patterns with depth 2 6 (CONCAT (REDXOR _A:a):1 (CONCAT _B:1 _C:b):c):d - 3 (AND (NOT vA:a)*:a (NOT vB:a)*:a)*:a - 3 (REDXOR (AND _A:a _B:a)*:a):1 - 1 (CONCAT '0:a (REPLICATE _A:a cA:a)*:b):A + 2 (AND (NOT vA:a)*:a (NOT vB:a)*:a):a + 2 (REDXOR (AND _A:a _B:a):a):1 + 1 (AND (NOT vA:a)*:a (NOT vB:a)*:a)*:a 1 (CONCAT (REDXOR _A:a)*:1 (CONCAT _B:1 _C:b):c):d 1 (CONCAT (REDXOR _A:a):1 (CONCAT _B:1 _C:1):b):c 1 (CONCAT (REDXOR _A:a):1 (REDXOR _B:b)*:1):c - 1 (CONCAT (SEL@0 _A:a)*:1 (CONCAT _B:1 _C:b):c):d + 1 (CONCAT (SEL@0 _A:a):1 (CONCAT _B:1 _C:b):c):d 1 (NOT (REPLICATE _A:a cA:b)*:b):b + 1 (REDXOR (AND _A:a _B:a)*:a):1 1 (REDXOR (REPLICATE _A:1 cA:a)*:b):1 - 1 (REDXOR (REPLICATE _A:a cA:a)*:b)*:1 1 (REDXOR (REPLICATE _A:a cA:a)*:b):1 + 1 (REDXOR (REPLICATE _A:a cA:a):b)*:1 1 (REDXOR (REPLICATE _A:a cA:b)*:b):1 1 (REDXOR (REPLICATE _A:a cA:b)*:c):1 - 1 (REDXOR (SEL@0 _A:a)*:b):1 + 1 (REDXOR (SEL@0 _A:a):b):1 1 (REPLICATE (NOT _A:a):a cA:a)*:b 1 (REPLICATE (REPLICATE _A:1 cA:a)*:b cB:a)*:c - 1 (REPLICATE (REPLICATE _A:a cA:b)*:b cA:b)*:c + 1 (REPLICATE (REPLICATE _A:a cA:b)*:b cA:b):c 1 (REPLICATE (REPLICATE _A:a cA:b)*:c cA:b)*:b 1 (REPLICATE (SEL@A _A:a):1 cA:b)*:c - 1 (SEL@0 (AND _A:a _B:a)*:a)*:1 - 1 (SEL@0 (REPLICATE _A:a cA:a)*:b)*:c + 1 (SEL@0 (AND _A:a _B:a)*:a):1 + 1 (SEL@0 (REPLICATE _A:a cA:a)*:b):c 1 (SEL@A (AND _A:a _B:a)*:a):1 DFG 'pre inline' patterns with depth 3 - 3 (REDXOR (AND (NOT vA:a)*:a (NOT vB:a)*:a)*:a):1 - 2 (CONCAT (REDXOR (AND _A:a _B:a)*:a):1 (CONCAT (REDXOR _C:a):1 (CONCAT _D:1 _E:b):c):d):e - 1 (CONCAT '0:a (REPLICATE (REPLICATE _A:b cA:a)*:a cA:a)*:c):A - 1 (CONCAT (REDXOR (AND _A:a _B:a)*:a):1 (CONCAT (SEL@0 _C:a)*:1 (CONCAT _D:1 _E:b):c):d):e + 2 (REDXOR (AND (NOT vA:a)*:a (NOT vB:a)*:a):a):1 + 1 (CONCAT (REDXOR (AND _A:a _B:a)*:a):1 (CONCAT (REDXOR _C:a):1 (CONCAT _D:1 _E:b):c):d):e + 1 (CONCAT (REDXOR (AND _A:a _B:a):a):1 (CONCAT (REDXOR _C:a):1 (CONCAT _D:1 _E:b):c):d):e + 1 (CONCAT (REDXOR (AND _A:a _B:a):a):1 (CONCAT (SEL@0 _C:a):1 (CONCAT _D:1 _E:b):c):d):e 1 (CONCAT (REDXOR (REPLICATE _A:1 cA:a)*:b):1 (CONCAT (REDXOR _B:c):1 (CONCAT _C:1 _D:d):e):f):g - 1 (CONCAT (REDXOR (REPLICATE _A:a cA:a)*:b)*:1 (CONCAT (REDXOR _B:b):1 (CONCAT _C:1 _D:1):c):d):e 1 (CONCAT (REDXOR (REPLICATE _A:a cA:a)*:b):1 (CONCAT (REDXOR _B:c):1 (REDXOR _C:b)*:1):d):e + 1 (CONCAT (REDXOR (REPLICATE _A:a cA:a):b)*:1 (CONCAT (REDXOR _B:b):1 (CONCAT _C:1 _D:1):c):d):e 1 (CONCAT (REDXOR (REPLICATE _A:a cA:b)*:b):1 (CONCAT (REDXOR _B:c)*:1 (CONCAT _C:1 _D:d):e):f):g 1 (CONCAT (REDXOR (REPLICATE _A:a cA:b)*:c):1 (CONCAT (REDXOR _B:b):1 (CONCAT _C:1 _D:d):e):f):g - 1 (CONCAT (REDXOR (SEL@0 _A:a)*:b):1 (REDXOR (REPLICATE _B:c cA:c)*:a)*:1):d - 1 (CONCAT (SEL@0 (AND _A:a _B:a)*:a)*:1 (CONCAT (REDXOR _C:b):1 (CONCAT _D:1 _E:c):d):e):b + 1 (CONCAT (REDXOR (SEL@0 _A:a):b):1 (REDXOR (REPLICATE _B:c cA:c):a)*:1):d + 1 (CONCAT (SEL@0 (AND _A:a _B:a)*:a):1 (CONCAT (REDXOR _C:b):1 (CONCAT _D:1 _E:c):d):e):b 1 (NOT (REPLICATE (REPLICATE _A:a cA:b)*:c cA:b)*:b):b + 1 (REDXOR (AND (NOT vA:a)*:a (NOT vB:a)*:a)*:a):1 1 (REDXOR (REPLICATE (NOT _A:a):a cA:a)*:b):1 1 (REDXOR (REPLICATE (REPLICATE _A:1 cA:a)*:b cB:a)*:c):1 - 1 (REDXOR (REPLICATE (REPLICATE _A:a cA:b)*:b cA:b)*:c)*:1 + 1 (REDXOR (REPLICATE (REPLICATE _A:a cA:b)*:b cA:b):c)*:1 1 (REDXOR (REPLICATE (REPLICATE _A:a cA:b)*:c cA:b)*:b):1 1 (REDXOR (REPLICATE (SEL@A _A:a):1 cA:b)*:c):1 - 1 (REDXOR (SEL@0 (REPLICATE _A:a cA:a)*:b)*:c):1 + 1 (REDXOR (SEL@0 (REPLICATE _A:a cA:a)*:b):c):1 1 (REPLICATE (NOT (REPLICATE _A:a cA:b)*:b):b cA:b)*:c 1 (REPLICATE (REPLICATE (REPLICATE _A:1 cA:a)*:b cB:a)*:c cB:a)*:a - 1 (REPLICATE (REPLICATE (REPLICATE _A:a cA:b)*:c cA:b)*:b cA:b)*:d + 1 (REPLICATE (REPLICATE (REPLICATE _A:a cA:b)*:c cA:b)*:b cA:b):d 1 (REPLICATE (REPLICATE (SEL@A _A:a):1 cA:b)*:c cB:b)*:d 1 (REPLICATE (SEL@A (AND _A:a _B:a)*:a):1 cA:b)*:c - 1 (SEL@0 (AND (NOT vA:a)*:a (NOT vB:a)*:a)*:a)*:1 - 1 (SEL@0 (REPLICATE (NOT _A:a):a cA:a)*:b)*:c + 1 (SEL@0 (AND (NOT vA:a)*:a (NOT vB:a)*:a)*:a):1 + 1 (SEL@0 (REPLICATE (NOT _A:a):a cA:a)*:b):c 1 (SEL@A (AND (NOT vA:a)*:a (NOT vB:a)*:a)*:a):1 DFG 'pre inline' patterns with depth 4 - 1 (CONCAT '0:a (REPLICATE (REPLICATE (REPLICATE _A:b cA:a)*:c cA:a)*:a cA:a)*:d):A - 1 (CONCAT (REDXOR (AND (NOT vA:a)*:a (NOT vB:a)*:a)*:a):1 (CONCAT (REDXOR (AND _A:a _B:a)*:a):1 (CONCAT (REDXOR _C:a):1 (CONCAT _D:1 _E:b):c):d):e):f - 1 (CONCAT (REDXOR (AND (NOT vA:a)*:a (NOT vB:a)*:a)*:a):1 (CONCAT (REDXOR (AND _A:a _B:a)*:a):1 (CONCAT (SEL@0 _C:a)*:1 (CONCAT _D:1 _E:b):c):d):e):f - 1 (CONCAT (REDXOR (AND (NOT vA:a)*:a (NOT vB:a)*:a)*:a):1 (CONCAT (SEL@0 (AND _A:a _B:a)*:a)*:1 (CONCAT (REDXOR _C:b):1 (CONCAT _D:1 _E:c):d):e):b):f - 1 (CONCAT (REDXOR (REPLICATE (NOT _A:a):a cA:a)*:b):1 (CONCAT (REDXOR (SEL@0 _B:b)*:c):1 (REDXOR (REPLICATE _A:a cA:a)*:b)*:1):d):e + 1 (CONCAT (REDXOR (AND (NOT vA:a)*:a (NOT vB:a)*:a)*:a):1 (CONCAT (REDXOR (AND _A:a _B:a):a):1 (CONCAT (REDXOR _C:a):1 (CONCAT _D:1 _E:b):c):d):e):f + 1 (CONCAT (REDXOR (AND (NOT vA:a)*:a (NOT vB:a)*:a):a):1 (CONCAT (REDXOR (AND _A:a _B:a):a):1 (CONCAT (SEL@0 _C:a):1 (CONCAT _D:1 _E:b):c):d):e):f + 1 (CONCAT (REDXOR (AND (NOT vA:a)*:a (NOT vB:a)*:a):a):1 (CONCAT (SEL@0 (AND _A:a _B:a)*:a):1 (CONCAT (REDXOR _C:b):1 (CONCAT _D:1 _E:c):d):e):b):f + 1 (CONCAT (REDXOR (REPLICATE (NOT _A:a):a cA:a)*:b):1 (CONCAT (REDXOR (SEL@0 _B:b):c):1 (REDXOR (REPLICATE _A:a cA:a):b)*:1):d):e 1 (CONCAT (REDXOR (REPLICATE (REPLICATE _A:1 cA:a)*:b cB:a)*:c):1 (CONCAT (REDXOR (REPLICATE _B:c cB:a)*:a):1 (CONCAT (REDXOR _C:d)*:1 (CONCAT _D:1 _E:e):f):g):h):i - 1 (CONCAT (REDXOR (REPLICATE (REPLICATE _A:a cA:b)*:b cA:b)*:c)*:1 (CONCAT (REDXOR (REPLICATE _B:b cA:b)*:c):1 (CONCAT (REDXOR _C:d):1 (REDXOR _D:c)*:1):e):f):g - 1 (CONCAT (REDXOR (REPLICATE (REPLICATE _A:a cA:b)*:c cA:b)*:b):1 (CONCAT (REDXOR (REPLICATE _B:b cA:b)*:d)*:1 (CONCAT (REDXOR _C:d):1 (CONCAT _D:1 _E:1):e):f):g):h + 1 (CONCAT (REDXOR (REPLICATE (REPLICATE _A:a cA:b)*:b cA:b):c)*:1 (CONCAT (REDXOR (REPLICATE _B:b cA:b)*:c):1 (CONCAT (REDXOR _C:d):1 (REDXOR _D:c)*:1):e):f):g + 1 (CONCAT (REDXOR (REPLICATE (REPLICATE _A:a cA:b)*:c cA:b)*:b):1 (CONCAT (REDXOR (REPLICATE _B:b cA:b):d)*:1 (CONCAT (REDXOR _C:d):1 (CONCAT _D:1 _E:1):e):f):g):h 1 (CONCAT (REDXOR (REPLICATE (SEL@A _A:a):1 cA:b)*:c):1 (CONCAT (REDXOR (REPLICATE _B:c cB:b)*:d):1 (CONCAT (REDXOR _C:b):1 (CONCAT _D:1 _E:e):a):f):g):h - 1 (CONCAT (REDXOR (SEL@0 (REPLICATE _A:a cA:a)*:b)*:c):1 (REDXOR (REPLICATE (REPLICATE _B:d cA:a)*:a cA:a)*:b)*:1):e - 1 (CONCAT (SEL@0 (AND (NOT vA:a)*:a (NOT vB:a)*:a)*:a)*:1 (CONCAT (REDXOR (REPLICATE _A:1 cA:b)*:c):1 (CONCAT (REDXOR _B:d):1 (CONCAT _C:1 _D:a):e):f):g):c + 1 (CONCAT (REDXOR (SEL@0 (REPLICATE _A:a cA:a)*:b):c):1 (REDXOR (REPLICATE (REPLICATE _B:d cA:a)*:a cA:a):b)*:1):e + 1 (CONCAT (SEL@0 (AND (NOT vA:a)*:a (NOT vB:a)*:a)*:a):1 (CONCAT (REDXOR (REPLICATE _A:1 cA:b)*:c):1 (CONCAT (REDXOR _B:d):1 (CONCAT _C:1 _D:a):e):f):g):c 1 (NOT (REPLICATE (REPLICATE (REPLICATE _A:1 cA:a)*:b cB:a)*:c cB:a)*:a):a 1 (REDXOR (REPLICATE (NOT (REPLICATE _A:a cA:b)*:b):b cA:b)*:c):1 1 (REDXOR (REPLICATE (REPLICATE (REPLICATE _A:1 cA:a)*:b cB:a)*:c cB:a)*:a):1 - 1 (REDXOR (REPLICATE (REPLICATE (REPLICATE _A:a cA:b)*:c cA:b)*:b cA:b)*:d)*:1 + 1 (REDXOR (REPLICATE (REPLICATE (REPLICATE _A:a cA:b)*:c cA:b)*:b cA:b):d)*:1 1 (REDXOR (REPLICATE (REPLICATE (SEL@A _A:a):1 cA:b)*:c cB:b)*:d):1 1 (REDXOR (REPLICATE (SEL@A (AND _A:a _B:a)*:a):1 cA:b)*:c):1 - 1 (REDXOR (SEL@0 (REPLICATE (NOT _A:a):a cA:a)*:b)*:c):1 + 1 (REDXOR (SEL@0 (REPLICATE (NOT _A:a):a cA:a)*:b):c):1 1 (REPLICATE (NOT (REPLICATE (REPLICATE _A:a cA:b)*:c cA:b)*:b):b cA:b)*:d - 1 (REPLICATE (REPLICATE (REPLICATE (REPLICATE _A:1 cA:a)*:b cB:a)*:c cB:a)*:a cB:a)*:d + 1 (REPLICATE (REPLICATE (REPLICATE (REPLICATE _A:1 cA:a)*:b cB:a)*:c cB:a)*:a cB:a):d 1 (REPLICATE (REPLICATE (REPLICATE (SEL@A _A:a):1 cA:b)*:c cB:b)*:d cB:b)*:b 1 (REPLICATE (REPLICATE (SEL@A (AND _A:a _B:a)*:a):1 cA:b)*:c cB:b)*:d 1 (REPLICATE (SEL@A (AND (NOT vA:a)*:a (NOT vB:a)*:a)*:a):1 cA:b)*:c - 1 (SEL@0 (REPLICATE (NOT (REPLICATE _A:a cA:b)*:b):b cA:b)*:c)*:d + 1 (SEL@0 (REPLICATE (NOT (REPLICATE _A:a cA:b)*:b):b cA:b)*:c):d diff --git a/test_regress/t/t_dfg_stats_patterns_scoped.out b/test_regress/t/t_dfg_stats_patterns_scoped.out index bc5d34307..dc86b18e2 100644 --- a/test_regress/t/t_dfg_stats_patterns_scoped.out +++ b/test_regress/t/t_dfg_stats_patterns_scoped.out @@ -1,96 +1,98 @@ DFG 'scoped' patterns with depth 1 9 (CONCAT _A:1 _B:a):b 8 (REDXOR _A:a):1 - 3 (AND _A:a _B:a)*:a 3 (NOT vA:a)*:a - 2 (REPLICATE _A:a cA:a)*:b - 1 (CONCAT '0:a _A:b):A + 2 (AND _A:a _B:a):a + 1 (AND _A:a _B:a)*:a 1 (CONCAT _A:1 _B:1):a 1 (NOT _A:a):a 1 (REDXOR _A:a)*:1 1 (REPLICATE _A:1 cA:a)*:b + 1 (REPLICATE _A:a cA:a)*:b + 1 (REPLICATE _A:a cA:a):b 1 (REPLICATE _A:a cA:b)*:b 1 (REPLICATE _A:a cA:b)*:c - 1 (SEL@0 _A:a)*:1 - 1 (SEL@0 _A:a)*:b + 1 (SEL@0 _A:a):1 + 1 (SEL@0 _A:a):b 1 (SEL@A _A:a):1 DFG 'scoped' patterns with depth 2 6 (CONCAT (REDXOR _A:a):1 (CONCAT _B:1 _C:b):c):d - 3 (AND (NOT vA:a)*:a (NOT vB:a)*:a)*:a - 3 (REDXOR (AND _A:a _B:a)*:a):1 - 1 (CONCAT '0:a (REPLICATE _A:a cA:a)*:b):A + 2 (AND (NOT vA:a)*:a (NOT vB:a)*:a):a + 2 (REDXOR (AND _A:a _B:a):a):1 + 1 (AND (NOT vA:a)*:a (NOT vB:a)*:a)*:a 1 (CONCAT (REDXOR _A:a)*:1 (CONCAT _B:1 _C:b):c):d 1 (CONCAT (REDXOR _A:a):1 (CONCAT _B:1 _C:1):b):c 1 (CONCAT (REDXOR _A:a):1 (REDXOR _B:b)*:1):c - 1 (CONCAT (SEL@0 _A:a)*:1 (CONCAT _B:1 _C:b):c):d + 1 (CONCAT (SEL@0 _A:a):1 (CONCAT _B:1 _C:b):c):d 1 (NOT (REPLICATE _A:a cA:b)*:b):b + 1 (REDXOR (AND _A:a _B:a)*:a):1 1 (REDXOR (REPLICATE _A:1 cA:a)*:b):1 - 1 (REDXOR (REPLICATE _A:a cA:a)*:b)*:1 1 (REDXOR (REPLICATE _A:a cA:a)*:b):1 + 1 (REDXOR (REPLICATE _A:a cA:a):b)*:1 1 (REDXOR (REPLICATE _A:a cA:b)*:b):1 1 (REDXOR (REPLICATE _A:a cA:b)*:c):1 - 1 (REDXOR (SEL@0 _A:a)*:b):1 + 1 (REDXOR (SEL@0 _A:a):b):1 1 (REPLICATE (NOT _A:a):a cA:a)*:b 1 (REPLICATE (REPLICATE _A:1 cA:a)*:b cB:a)*:c - 1 (REPLICATE (REPLICATE _A:a cA:b)*:b cA:b)*:c + 1 (REPLICATE (REPLICATE _A:a cA:b)*:b cA:b):c 1 (REPLICATE (REPLICATE _A:a cA:b)*:c cA:b)*:b 1 (REPLICATE (SEL@A _A:a):1 cA:b)*:c - 1 (SEL@0 (AND _A:a _B:a)*:a)*:1 - 1 (SEL@0 (REPLICATE _A:a cA:a)*:b)*:c + 1 (SEL@0 (AND _A:a _B:a)*:a):1 + 1 (SEL@0 (REPLICATE _A:a cA:a)*:b):c 1 (SEL@A (AND _A:a _B:a)*:a):1 DFG 'scoped' patterns with depth 3 - 3 (REDXOR (AND (NOT vA:a)*:a (NOT vB:a)*:a)*:a):1 - 2 (CONCAT (REDXOR (AND _A:a _B:a)*:a):1 (CONCAT (REDXOR _C:a):1 (CONCAT _D:1 _E:b):c):d):e - 1 (CONCAT '0:a (REPLICATE (REPLICATE _A:b cA:a)*:a cA:a)*:c):A - 1 (CONCAT (REDXOR (AND _A:a _B:a)*:a):1 (CONCAT (SEL@0 _C:a)*:1 (CONCAT _D:1 _E:b):c):d):e + 2 (REDXOR (AND (NOT vA:a)*:a (NOT vB:a)*:a):a):1 + 1 (CONCAT (REDXOR (AND _A:a _B:a)*:a):1 (CONCAT (REDXOR _C:a):1 (CONCAT _D:1 _E:b):c):d):e + 1 (CONCAT (REDXOR (AND _A:a _B:a):a):1 (CONCAT (REDXOR _C:a):1 (CONCAT _D:1 _E:b):c):d):e + 1 (CONCAT (REDXOR (AND _A:a _B:a):a):1 (CONCAT (SEL@0 _C:a):1 (CONCAT _D:1 _E:b):c):d):e 1 (CONCAT (REDXOR (REPLICATE _A:1 cA:a)*:b):1 (CONCAT (REDXOR _B:c):1 (CONCAT _C:1 _D:d):e):f):g - 1 (CONCAT (REDXOR (REPLICATE _A:a cA:a)*:b)*:1 (CONCAT (REDXOR _B:b):1 (CONCAT _C:1 _D:1):c):d):e 1 (CONCAT (REDXOR (REPLICATE _A:a cA:a)*:b):1 (CONCAT (REDXOR _B:c):1 (REDXOR _C:b)*:1):d):e + 1 (CONCAT (REDXOR (REPLICATE _A:a cA:a):b)*:1 (CONCAT (REDXOR _B:b):1 (CONCAT _C:1 _D:1):c):d):e 1 (CONCAT (REDXOR (REPLICATE _A:a cA:b)*:b):1 (CONCAT (REDXOR _B:c)*:1 (CONCAT _C:1 _D:d):e):f):g 1 (CONCAT (REDXOR (REPLICATE _A:a cA:b)*:c):1 (CONCAT (REDXOR _B:b):1 (CONCAT _C:1 _D:d):e):f):g - 1 (CONCAT (REDXOR (SEL@0 _A:a)*:b):1 (REDXOR (REPLICATE _B:c cA:c)*:a)*:1):d - 1 (CONCAT (SEL@0 (AND _A:a _B:a)*:a)*:1 (CONCAT (REDXOR _C:b):1 (CONCAT _D:1 _E:c):d):e):b + 1 (CONCAT (REDXOR (SEL@0 _A:a):b):1 (REDXOR (REPLICATE _B:c cA:c):a)*:1):d + 1 (CONCAT (SEL@0 (AND _A:a _B:a)*:a):1 (CONCAT (REDXOR _C:b):1 (CONCAT _D:1 _E:c):d):e):b 1 (NOT (REPLICATE (REPLICATE _A:a cA:b)*:c cA:b)*:b):b + 1 (REDXOR (AND (NOT vA:a)*:a (NOT vB:a)*:a)*:a):1 1 (REDXOR (REPLICATE (NOT _A:a):a cA:a)*:b):1 1 (REDXOR (REPLICATE (REPLICATE _A:1 cA:a)*:b cB:a)*:c):1 - 1 (REDXOR (REPLICATE (REPLICATE _A:a cA:b)*:b cA:b)*:c)*:1 + 1 (REDXOR (REPLICATE (REPLICATE _A:a cA:b)*:b cA:b):c)*:1 1 (REDXOR (REPLICATE (REPLICATE _A:a cA:b)*:c cA:b)*:b):1 1 (REDXOR (REPLICATE (SEL@A _A:a):1 cA:b)*:c):1 - 1 (REDXOR (SEL@0 (REPLICATE _A:a cA:a)*:b)*:c):1 + 1 (REDXOR (SEL@0 (REPLICATE _A:a cA:a)*:b):c):1 1 (REPLICATE (NOT (REPLICATE _A:a cA:b)*:b):b cA:b)*:c 1 (REPLICATE (REPLICATE (REPLICATE _A:1 cA:a)*:b cB:a)*:c cB:a)*:a - 1 (REPLICATE (REPLICATE (REPLICATE _A:a cA:b)*:c cA:b)*:b cA:b)*:d + 1 (REPLICATE (REPLICATE (REPLICATE _A:a cA:b)*:c cA:b)*:b cA:b):d 1 (REPLICATE (REPLICATE (SEL@A _A:a):1 cA:b)*:c cB:b)*:d 1 (REPLICATE (SEL@A (AND _A:a _B:a)*:a):1 cA:b)*:c - 1 (SEL@0 (AND (NOT vA:a)*:a (NOT vB:a)*:a)*:a)*:1 - 1 (SEL@0 (REPLICATE (NOT _A:a):a cA:a)*:b)*:c + 1 (SEL@0 (AND (NOT vA:a)*:a (NOT vB:a)*:a)*:a):1 + 1 (SEL@0 (REPLICATE (NOT _A:a):a cA:a)*:b):c 1 (SEL@A (AND (NOT vA:a)*:a (NOT vB:a)*:a)*:a):1 DFG 'scoped' patterns with depth 4 - 1 (CONCAT '0:a (REPLICATE (REPLICATE (REPLICATE _A:b cA:a)*:c cA:a)*:a cA:a)*:d):A - 1 (CONCAT (REDXOR (AND (NOT vA:a)*:a (NOT vB:a)*:a)*:a):1 (CONCAT (REDXOR (AND _A:a _B:a)*:a):1 (CONCAT (REDXOR _C:a):1 (CONCAT _D:1 _E:b):c):d):e):f - 1 (CONCAT (REDXOR (AND (NOT vA:a)*:a (NOT vB:a)*:a)*:a):1 (CONCAT (REDXOR (AND _A:a _B:a)*:a):1 (CONCAT (SEL@0 _C:a)*:1 (CONCAT _D:1 _E:b):c):d):e):f - 1 (CONCAT (REDXOR (AND (NOT vA:a)*:a (NOT vB:a)*:a)*:a):1 (CONCAT (SEL@0 (AND _A:a _B:a)*:a)*:1 (CONCAT (REDXOR _C:b):1 (CONCAT _D:1 _E:c):d):e):b):f - 1 (CONCAT (REDXOR (REPLICATE (NOT _A:a):a cA:a)*:b):1 (CONCAT (REDXOR (SEL@0 _B:b)*:c):1 (REDXOR (REPLICATE _A:a cA:a)*:b)*:1):d):e + 1 (CONCAT (REDXOR (AND (NOT vA:a)*:a (NOT vB:a)*:a)*:a):1 (CONCAT (REDXOR (AND _A:a _B:a):a):1 (CONCAT (REDXOR _C:a):1 (CONCAT _D:1 _E:b):c):d):e):f + 1 (CONCAT (REDXOR (AND (NOT vA:a)*:a (NOT vB:a)*:a):a):1 (CONCAT (REDXOR (AND _A:a _B:a):a):1 (CONCAT (SEL@0 _C:a):1 (CONCAT _D:1 _E:b):c):d):e):f + 1 (CONCAT (REDXOR (AND (NOT vA:a)*:a (NOT vB:a)*:a):a):1 (CONCAT (SEL@0 (AND _A:a _B:a)*:a):1 (CONCAT (REDXOR _C:b):1 (CONCAT _D:1 _E:c):d):e):b):f + 1 (CONCAT (REDXOR (REPLICATE (NOT _A:a):a cA:a)*:b):1 (CONCAT (REDXOR (SEL@0 _B:b):c):1 (REDXOR (REPLICATE _A:a cA:a):b)*:1):d):e 1 (CONCAT (REDXOR (REPLICATE (REPLICATE _A:1 cA:a)*:b cB:a)*:c):1 (CONCAT (REDXOR (REPLICATE _B:c cB:a)*:a):1 (CONCAT (REDXOR _C:d)*:1 (CONCAT _D:1 _E:e):f):g):h):i - 1 (CONCAT (REDXOR (REPLICATE (REPLICATE _A:a cA:b)*:b cA:b)*:c)*:1 (CONCAT (REDXOR (REPLICATE _B:b cA:b)*:c):1 (CONCAT (REDXOR _C:d):1 (REDXOR _D:c)*:1):e):f):g - 1 (CONCAT (REDXOR (REPLICATE (REPLICATE _A:a cA:b)*:c cA:b)*:b):1 (CONCAT (REDXOR (REPLICATE _B:b cA:b)*:d)*:1 (CONCAT (REDXOR _C:d):1 (CONCAT _D:1 _E:1):e):f):g):h + 1 (CONCAT (REDXOR (REPLICATE (REPLICATE _A:a cA:b)*:b cA:b):c)*:1 (CONCAT (REDXOR (REPLICATE _B:b cA:b)*:c):1 (CONCAT (REDXOR _C:d):1 (REDXOR _D:c)*:1):e):f):g + 1 (CONCAT (REDXOR (REPLICATE (REPLICATE _A:a cA:b)*:c cA:b)*:b):1 (CONCAT (REDXOR (REPLICATE _B:b cA:b):d)*:1 (CONCAT (REDXOR _C:d):1 (CONCAT _D:1 _E:1):e):f):g):h 1 (CONCAT (REDXOR (REPLICATE (SEL@A _A:a):1 cA:b)*:c):1 (CONCAT (REDXOR (REPLICATE _B:c cB:b)*:d):1 (CONCAT (REDXOR _C:b):1 (CONCAT _D:1 _E:e):a):f):g):h - 1 (CONCAT (REDXOR (SEL@0 (REPLICATE _A:a cA:a)*:b)*:c):1 (REDXOR (REPLICATE (REPLICATE _B:d cA:a)*:a cA:a)*:b)*:1):e - 1 (CONCAT (SEL@0 (AND (NOT vA:a)*:a (NOT vB:a)*:a)*:a)*:1 (CONCAT (REDXOR (REPLICATE _A:1 cA:b)*:c):1 (CONCAT (REDXOR _B:d):1 (CONCAT _C:1 _D:a):e):f):g):c + 1 (CONCAT (REDXOR (SEL@0 (REPLICATE _A:a cA:a)*:b):c):1 (REDXOR (REPLICATE (REPLICATE _B:d cA:a)*:a cA:a):b)*:1):e + 1 (CONCAT (SEL@0 (AND (NOT vA:a)*:a (NOT vB:a)*:a)*:a):1 (CONCAT (REDXOR (REPLICATE _A:1 cA:b)*:c):1 (CONCAT (REDXOR _B:d):1 (CONCAT _C:1 _D:a):e):f):g):c 1 (NOT (REPLICATE (REPLICATE (REPLICATE _A:1 cA:a)*:b cB:a)*:c cB:a)*:a):a 1 (REDXOR (REPLICATE (NOT (REPLICATE _A:a cA:b)*:b):b cA:b)*:c):1 1 (REDXOR (REPLICATE (REPLICATE (REPLICATE _A:1 cA:a)*:b cB:a)*:c cB:a)*:a):1 - 1 (REDXOR (REPLICATE (REPLICATE (REPLICATE _A:a cA:b)*:c cA:b)*:b cA:b)*:d)*:1 + 1 (REDXOR (REPLICATE (REPLICATE (REPLICATE _A:a cA:b)*:c cA:b)*:b cA:b):d)*:1 1 (REDXOR (REPLICATE (REPLICATE (SEL@A _A:a):1 cA:b)*:c cB:b)*:d):1 1 (REDXOR (REPLICATE (SEL@A (AND _A:a _B:a)*:a):1 cA:b)*:c):1 - 1 (REDXOR (SEL@0 (REPLICATE (NOT _A:a):a cA:a)*:b)*:c):1 + 1 (REDXOR (SEL@0 (REPLICATE (NOT _A:a):a cA:a)*:b):c):1 1 (REPLICATE (NOT (REPLICATE (REPLICATE _A:a cA:b)*:c cA:b)*:b):b cA:b)*:d - 1 (REPLICATE (REPLICATE (REPLICATE (REPLICATE _A:1 cA:a)*:b cB:a)*:c cB:a)*:a cB:a)*:d + 1 (REPLICATE (REPLICATE (REPLICATE (REPLICATE _A:1 cA:a)*:b cB:a)*:c cB:a)*:a cB:a):d 1 (REPLICATE (REPLICATE (REPLICATE (SEL@A _A:a):1 cA:b)*:c cB:b)*:d cB:b)*:b 1 (REPLICATE (REPLICATE (SEL@A (AND _A:a _B:a)*:a):1 cA:b)*:c cB:b)*:d 1 (REPLICATE (SEL@A (AND (NOT vA:a)*:a (NOT vB:a)*:a)*:a):1 cA:b)*:c - 1 (SEL@0 (REPLICATE (NOT (REPLICATE _A:a cA:b)*:b):b cA:b)*:c)*:d + 1 (SEL@0 (REPLICATE (NOT (REPLICATE _A:a cA:b)*:b):b cA:b)*:c):d diff --git a/test_regress/t/t_opt_const_dfg.py b/test_regress/t/t_opt_const_dfg.py index eb5626311..88bf99d4f 100755 --- a/test_regress/t/t_opt_const_dfg.py +++ b/test_regress/t/t_opt_const_dfg.py @@ -18,7 +18,7 @@ test.compile(verilator_flags2=["-Wno-UNOPTTHREADS", "--stats", test.pli_filename test.execute() if test.vlt: - test.file_grep(test.stats, r'Optimizations, Const bit op reduction\s+(\d+)', 43) + test.file_grep(test.stats, r'Optimizations, Const bit op reduction\s+(\d+)', 42) test.file_grep(test.stats, r'SplitVar, packed variables split automatically\s+(\d+)', 1) test.passes()