On 10/24/2017 02:57 PM, David Malcolm wrote: > On Tue, 2017-10-24 at 12:44 -0600, Jeff Law wrote: >> This is similar to the introduction of the ssa_propagate_engine, but >> for >> the substitution/replacements bits. >> >> In a couple places the pass specific virtual functions are just >> wrappers >> around existing functions. A good example of this is >> ccp_folder::get_value. Many other routines in tree-ssa-ccp.c want to >> use get_constant_value. Some may be convertable to use the class >> instance, but I haven't looked closely. >> >> Another example is vrp_folder::get_value. In this case we're >> wrapping >> op_with_constant_singleton_value. In a later patch that moves into >> the >> to-be-introduced vr_values class so we'll delegate to that class >> rather >> than wrap. >> >> FWIW I did look at having a single class for the propagation engine >> and >> the substitution engine. That turned out to be a bit problematical >> due >> to the calls into the substitution engine from the evrp bits which >> don't >> use the propagation engine at all. Given propagation and >> substitution >> are distinct concepts I ultimately decided the cleanest path forward >> was >> to keep the two classes separate. >> >> Bootstrapped and regression tested on x86_64. OK for the trunk? >> >> Jeff >> > > [...snip...] > >> diff --git a/gcc/tree-ssa-ccp.c b/gcc/tree-ssa-ccp.c >> index fec562e..da06172 100644 >> --- a/gcc/tree-ssa-ccp.c >> +++ b/gcc/tree-ssa-ccp.c >> @@ -188,7 +188,6 @@ static ccp_prop_value_t *const_val; >> static unsigned n_const_val; >> >> static void canonicalize_value (ccp_prop_value_t *); >> -static bool ccp_fold_stmt (gimple_stmt_iterator *); >> static void ccp_lattice_meet (ccp_prop_value_t *, ccp_prop_value_t > *); >> >> /* Dump constant propagation value VAL to file OUTF prefixed by > PREFIX. */ >> @@ -909,6 +908,24 @@ do_dbg_cnt (void) >> } >> >> >> +/* We want to provide our own GET_VALUE and FOLD_STMT virtual > methods. */ >> +class ccp_folder : public substitute_and_fold_engine >> +{ >> + public: >> + tree get_value (tree); >> + bool fold_stmt (gimple_stmt_iterator *); >> +}; > > Should these two methods be marked OVERRIDE? (or indeed "FINAL > OVERRIDE"?) This tells the human reader that they're vfuncs, and C++11 > onwards can issue a warning if for some reason they stop being vfuncs > (e.g. the type signature changes somewhere). > > (likewise for all the other overrides in subclasses of s_a_f_engine). OVERRIDE seems like a no-brainer. I can't offhand think of a case where we'd want to derive further. FINAL (in theory) ought to help divirt, so it seems appropriate as well. Consider that done :-)
I'm also investigating if these classes need a virtual dtor. Jeff