On 10/24/2017 02:49 PM, David Malcolm wrote: > On Tue, 2017-10-24 at 11:40 -0600, Jeff Law wrote: >> tree-ssa-propagate.c provides a fairly generic engine to propagate >> values through a lattice while in SSA form. The engine uses two >> callbacks to allow passes to provide pass specific handling of >> statements and phi nodes. >> >> The callback mechanism served us well in a C world. It is however >> somewhat painful to have state in those callbacks without resorting >> to >> global variables or passing around void * objects which contain the >> class instance pointer. >> >> For example, tree-vrp uses the propagation engine to compute global >> range information. Its callbacks vrp_visit_stmt and vrp_visit_phi >> and >> their children read/modify a variety of tree-vrp.c statics such as >> vr_data. >> >> In some changes I'm working on I'd really like to move vr_data into a >> distinct class and avoid having direct accesses to the underlying >> array. >> >> So the problem is how are routines like vrp_visit_stmt and >> vrp_visit_phi >> and their children supposed to access the class instance? >> >> One way would be to just add a void * argument to them and pass the >> class instance around. Alternately we could leave the global >> variable >> in place and have it set up, checked and wiped clean by the vr_data >> class's ctor/dtor. Both are valid and would work, but they're a bit >> ugly IMHO. >> >> This patch takes another approach. It builds a simple little class >> around ssa_propagate where the statement and phi visitors are virtual >> functions. Thus clients can override the visitors *and* they'll get >> a >> class instance pointer. >> >> I haven't gone hog wild with C++-ification, basically just enough to >> get >> the class around ssa_propagate and its children which are going to >> need >> to pass down the class instance to the virtual functions. There's a >> lot >> more that could be done here. >> >> As you can see the client side changes are pretty minimal. They just >> derive a new class from ssa_propagation_engine to provide their >> implementations of the statement and phi visitor. More importantly, >> they can hang data off that derived class which we'll exploit later. >> >> There will be a similar patch for the substitute_and_fold which has >> callbacks of its own. >> >> Bootstrapped and regression tested on x86_64. >> >> The ChangeLog makes the patch look huge. But it's actually >> relatively >> small and the client side bits are repetitive. >> >> OK for the trunk? >> >> Jeff > > Looks like you forgot to attach the patch. Ugh. Attached, with the FINAL OVERRIDE addition. Jeff