Optimize muxes in DfgPeephole

This commit is contained in:
Geza Lore 2026-03-25 17:15:05 +00:00
parent 2759f2ab16
commit f12cdac8da
3 changed files with 37 additions and 0 deletions

View File

@ -1274,6 +1274,33 @@ class V3DfgPeephole final : public DfgVisitor {
}
}
void visit(DfgMux* const vtxp) override {
DfgVertex* const fromp = vtxp->fromp();
DfgVertex* const lsbp = vtxp->lsbp();
FileLine* const flp = vtxp->fileline();
if (DfgConst* const lsbConstp = lsbp->cast<DfgConst>()) {
APPLYING(REPLACE_MUX_WITH_SEL) {
replace(make<DfgSel>(vtxp, fromp, lsbConstp->num().toUInt()));
return;
}
}
if (isZero(fromp)) {
APPLYING(FOLD_MUX_FROM_ZERO) {
replace(makeZero(flp, vtxp->width()));
return;
}
}
if (isOnes(fromp)) {
APPLYING(FOLD_MUX_FROM_ONES) {
replace(makeOnes(flp, vtxp->width()));
return;
}
}
}
//=========================================================================
// DfgVertexBinary - bitwise
//=========================================================================

View File

@ -31,6 +31,8 @@
_FOR_EACH_DFG_PEEPHOLE_OPTIMIZATION_APPLY(macro, FOLD_ASSOC_BINARY_LHS_OF_RHS) \
_FOR_EACH_DFG_PEEPHOLE_OPTIMIZATION_APPLY(macro, FOLD_ASSOC_BINARY_RHS_OF_LHS) \
_FOR_EACH_DFG_PEEPHOLE_OPTIMIZATION_APPLY(macro, FOLD_BINARY) \
_FOR_EACH_DFG_PEEPHOLE_OPTIMIZATION_APPLY(macro, FOLD_MUX_FROM_ONES) \
_FOR_EACH_DFG_PEEPHOLE_OPTIMIZATION_APPLY(macro, FOLD_MUX_FROM_ZERO) \
_FOR_EACH_DFG_PEEPHOLE_OPTIMIZATION_APPLY(macro, FOLD_SEL) \
_FOR_EACH_DFG_PEEPHOLE_OPTIMIZATION_APPLY(macro, FOLD_SELF_EQ) \
_FOR_EACH_DFG_PEEPHOLE_OPTIMIZATION_APPLY(macro, FOLD_SELF_GT) \
@ -117,6 +119,7 @@
_FOR_EACH_DFG_PEEPHOLE_OPTIMIZATION_APPLY(macro, REPLACE_EXTEND) \
_FOR_EACH_DFG_PEEPHOLE_OPTIMIZATION_APPLY(macro, REPLACE_LOGAND_WITH_AND) \
_FOR_EACH_DFG_PEEPHOLE_OPTIMIZATION_APPLY(macro, REPLACE_LOGOR_WITH_OR) \
_FOR_EACH_DFG_PEEPHOLE_OPTIMIZATION_APPLY(macro, REPLACE_MUX_WITH_SEL) \
_FOR_EACH_DFG_PEEPHOLE_OPTIMIZATION_APPLY(macro, REPLACE_NESTED_CONCAT_OF_ADJOINING_SELS_ON_LHS) \
_FOR_EACH_DFG_PEEPHOLE_OPTIMIZATION_APPLY(macro, REPLACE_NESTED_CONCAT_OF_ADJOINING_SELS_ON_RHS) \
_FOR_EACH_DFG_PEEPHOLE_OPTIMIZATION_APPLY(macro, REPLACE_NOT_EQ) \

View File

@ -33,6 +33,8 @@ module t (
wire logic [127:0] rand_aa = {2{rand_a}};
wire logic [63:0] const_a;
wire logic [63:0] const_b;
wire logic [63:0] zero;
wire logic [63:0] ones;
wire logic signed [63:0] sconst_a;
wire logic signed [63:0] sconst_b;
logic [63:0] array [3:0];
@ -305,6 +307,9 @@ module t (
`signal(FOLD_SELF_LTS, srand_a < srand_a);
`signal(FOLD_SELF_LE, rand_a <= rand_a);
`signal(FOLD_SELF_LES, srand_a <= srand_a);
`signal(FOLD_MUX_FROM_ONES, ones[rand_a[5:0]]);
`signal(FOLD_MUX_FROM_ZERO, zero[rand_a[5:0]]);
`signal(REPLACE_MUX_WITH_SEL, rand_a[const_a[5:0]]);
// Operators that should work wiht mismatched widths
`signal(MISMATCHED_ShiftL,const_a << 4'd2);
@ -366,4 +371,6 @@ module t (
assign const_b = 64'h98badefc10325647;
assign sconst_a = 64'hfedcba9876543210;
assign sconst_b = 64'hba0123456789cdef;
assign zero = '0;
assign ones = '1;
endmodule