Hi, Richi. This patch is how I use LCM functions: https://gcc.gnu.org/pipermail/gcc-patches/2023-August/627953.html
>> they are just necessary >> to compute pre_edge_lcm_avs which I see you already do. In Phase 4 I use pre_edge_lcm_av to PRE fo current VSETVL cfg information. However, it's not enough since I need phase 3 fuse VSETVL information to get better codegen. The is how I use the functions: + /* Compute global availability. */ compute_available (m_vector_manager->vector_comp, m_vector_manager->vector_kill, m_vector_manager->vector_avout, m_vector_manager->vector_avin); - changed_p |= cleanup_illegal_dirty_blocks (); + /* Compute global anticipatability. */ + compute_antinout_edge (m_vector_manager->vector_antic, + m_vector_manager->vector_transp, + m_vector_manager->vector_antin, + m_vector_manager->vector_antout); + /* Compute earliestness. */ + compute_earliest (m_vector_manager->vector_edge_list, + m_vector_manager->vector_exprs.length (), + m_vector_manager->vector_antin, + m_vector_manager->vector_antout, + m_vector_manager->vector_avout, + m_vector_manager->vector_kill, + m_vector_manager->vector_earliest); + changed_p |= earliest_fusion (); You can see I explicitly call 'compute_earliest' followed by 'earliest_fusion'I need the result from 'compute_earliest' to do the VSETVL fusion that's the information 'pre_edge_lcm_av' didn't give us. >> Just to say >> you are possibly going to blow up compile-time complexity of your >> VSETVL dataflow problem? No, I export 'compute_earliest' as global because 'pre_edge_lcm_av' didn't give us the 'earliest' result that I need. Thanks. juzhe.zh...@rivai.ai From: Richard Biener Date: 2023-08-21 15:09 To: Juzhe-Zhong CC: gcc-patches; jeffreyalaw Subject: Re: [PATCH] LCM: Export 2 helpful functions as global for VSETVL PASS use in RISC-V backend On Mon, 21 Aug 2023, Juzhe-Zhong wrote: > This patch exports 'compute_antinout_edge' and 'compute_earliest' as global > scope > which is going to be used in VSETVL PASS of RISC-V backend. > > The demand fusion is the fusion of VSETVL information to emit VSETVL which > dominate and pre-config for most > of the RVV instructions in order to elide redundant VSETVLs. > > For exmaple: > > for > for > for > if (cond} > VSETVL demand 1: SEW/LMUL = 16 and TU policy > else > VSETVL demand 2: SEW = 32 > > VSETVL pass should be able to fuse demand 1 and demand 2 into new demand: SEW > = 32, LMUL = M2, TU policy. > Then emit such VSETVL at the outmost of the for loop to get the most optimal > codegen and run-time execution. > > Currenty the VSETVL PASS Phase 3 (demand fusion) is really messy and > un-reliable as well as un-maintainable. > And, I recently read dragon book and morgan's book again, I found there > "earliest" can allow us to do the > demand fusion in a very reliable and optimal way. > > So, this patch exports these 2 functions which are very helpful for VSETVL > pass. It would be nice to put these internal functions into a class or a namespace given their non LCM name. I don't see how you are going to use these intermediate DF functions - they are just necessary to compute pre_edge_lcm_avs which I see you already do. Just to say you are possibly going to blow up compile-time complexity of your VSETVL dataflow problem? > gcc/ChangeLog: > > * lcm.cc (compute_antinout_edge): Export as global use. > (compute_earliest): Ditto. > (compute_rev_insert_delete): Ditto. > * lcm.h (compute_antinout_edge): Ditto. > (compute_earliest): Ditto. > > --- > gcc/lcm.cc | 7 ++----- > gcc/lcm.h | 3 +++ > 2 files changed, 5 insertions(+), 5 deletions(-) > > diff --git a/gcc/lcm.cc b/gcc/lcm.cc > index 94a3ed43aea..03421e490e4 100644 > --- a/gcc/lcm.cc > +++ b/gcc/lcm.cc > @@ -56,9 +56,6 @@ along with GCC; see the file COPYING3. If not see > #include "lcm.h" > > /* Edge based LCM routines. */ > -static void compute_antinout_edge (sbitmap *, sbitmap *, sbitmap *, sbitmap > *); > -static void compute_earliest (struct edge_list *, int, sbitmap *, sbitmap *, > - sbitmap *, sbitmap *, sbitmap *); > static void compute_laterin (struct edge_list *, sbitmap *, sbitmap *, > sbitmap *, sbitmap *); > static void compute_insert_delete (struct edge_list *edge_list, sbitmap *, > @@ -79,7 +76,7 @@ static void compute_rev_insert_delete (struct edge_list > *edge_list, sbitmap *, > This is done based on the flow graph, and not on the pred-succ lists. > Other than that, its pretty much identical to compute_antinout. */ > > -static void > +void > compute_antinout_edge (sbitmap *antloc, sbitmap *transp, sbitmap *antin, > sbitmap *antout) > { > @@ -170,7 +167,7 @@ compute_antinout_edge (sbitmap *antloc, sbitmap *transp, > sbitmap *antin, > > /* Compute the earliest vector for edge based lcm. */ > > -static void > +void > compute_earliest (struct edge_list *edge_list, int n_exprs, sbitmap *antin, > sbitmap *antout, sbitmap *avout, sbitmap *kill, > sbitmap *earliest) > diff --git a/gcc/lcm.h b/gcc/lcm.h > index e08339352e0..7145d6fc46d 100644 > --- a/gcc/lcm.h > +++ b/gcc/lcm.h > @@ -31,4 +31,7 @@ extern struct edge_list *pre_edge_rev_lcm (int, sbitmap *, > sbitmap *, sbitmap *, > sbitmap *, sbitmap **, > sbitmap **); > +extern void compute_antinout_edge (sbitmap *, sbitmap *, sbitmap *, sbitmap > *); > +extern void compute_earliest (struct edge_list *, int, sbitmap *, sbitmap *, > + sbitmap *, sbitmap *, sbitmap *); > #endif /* GCC_LCM_H */ > -- Richard Biener <rguent...@suse.de> SUSE Software Solutions Germany GmbH, Frankenstrasse 146, 90461 Nuernberg, Germany; GF: Ivo Totev, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)