On Tue, Nov 2, 2021 at 10:00 PM Bernhard Reutner-Fischer <rep.dot....@gmail.com> wrote: > > On 2 November 2021 14:43:38 CET, Richard Biener <richard.guent...@gmail.com> > wrote: > >On Mon, Nov 1, 2021 at 10:02 PM Bernhard Reutner-Fischer via > >Gcc-patches <gcc-patches@gcc.gnu.org> wrote: > >> > >> On Mon, 1 Nov 2021 15:21:03 +0100 > >> Aldy Hernandez <al...@redhat.com> wrote: > >> > >> > I'm not convinced this makes the code clearer to read, especially if > >> > it's not on a critical path. But if you feel strongly, please submit > >> > a patch ;-). > >> > >> No i don't feel strongly about it. > >> Compiling e.g. -O2 ira.o > >> # Overhead Samples Command Shared Object Symbol > >> # ........ ............ ....... ............. ......................... > >> # > >> 100.00% 4197 cc1plus cc1plus [.] mark_reachable_blocks > >> 100.00% 22000 cc1plus cc1plus [.] > >> path_oracle::killing_def > >> and the mark_elimination is reload. > >> So it's not just a handful of calls saved but some. And it would be > >> smaller code as it saves a call. Well maybe another day. > > > >Note that single bit set/clear are already implemented as test && set/clear. > >Note that unfortunately the sbitmap bitmap_set/clear_bit overloads do not > >return the previous state of the bit. Maybe providing > > All 3 spots here, dse, ira and killing_def do not look at the bit but use it > as a bool, fwiw. > These 3 are the only users I (resp coccinelle) found who do the redundant > bitmap_bit_p, bitmap_clear_bit. > > >bitmap_test_and_set_bit () and bitmap_test_and_clear_bit () would be > >better (but note we currently return true when the bit changed, not when > >it was set). > > A big portion of users of bitmap_bit_p could use a bitmap_bit_p that returns > bool as is. > The rest would know the bit they asked for, no? > Hence bitmap_bit_p could be changed to return a bool rather easily. testb > instead of testl on x86_64 fwiw. > thanks,
Yes, I think bitmap_bit_p returns [0, 1] already, 'int' is just some pre-bool standard return type... I'm going to test a patch changing the signature. Richard. > > > > >Richard. > > > >> thanks, > >> > > >> > Aldy > >> > > >> > On Mon, Nov 1, 2021 at 3:10 PM Bernhard Reutner-Fischer > >> > <rep.dot....@gmail.com> wrote: > >> > > > >> > > On Thu, 28 Oct 2021 01:55:30 +0200 > >> > > Bernhard Reutner-Fischer <rep.dot....@gmail.com> wrote: > >> > > > >> > > > On Wed, 27 Oct 2021 20:13:21 +0200 > >> > > > Aldy Hernandez via Gcc-patches <gcc-patches@gcc.gnu.org> wrote: > >> > > > >> > > > > @@ -1306,6 +1307,24 @@ path_oracle::killing_def (tree ssa) > >> > > > > ptr->m_next = m_equiv.m_next; > >> > > > > m_equiv.m_next = ptr; > >> > > > > bitmap_ior_into (m_equiv.m_names, b); > >> > > > > + > >> > > > > + // Walk the relation list an remove SSA from any relations. > >> > > > > >> > > > s/an /and / > >> > > > > >> > > > > + if (!bitmap_bit_p (m_relations.m_names, v)) > >> > > > > + return; > >> > > > > + > >> > > > > + bitmap_clear_bit (m_relations.m_names, v); > >> > > > > >> > > > IIRC bitmap_clear_bit returns true if the bit was set, false > >> > > > otherwise, > >> > > > so should be used as if(!bitmap_clear_bit) above. > >> > > > >> > > > > + relation_chain **prev = &(m_relations.m_head); > >> > > > > >> > > > s/[()]// > >> > > > thanks, > >> > > > >> > > There seems to be two other spots where a redundant bitmap_bit_p checks > >> > > if we want to bitmap_clear_bit. In dse and ira. > >> > > Like: > >> > > $ cat ~/coccinelle/gcc_bitmap_bit_p-0.cocci ; echo EOF > >> > > // replace redundant bitmap_bit_p() bitmap_clear_bit with the latter > >> > > @ rule1 @ > >> > > identifier fn; > >> > > expression bitmap, bit; > >> > > @@ > >> > > > >> > > fn(...) { > >> > > <... > >> > > ( > >> > > -if (bitmap_bit_p (bitmap, bit)) > >> > > +if (bitmap_clear_bit (bitmap, bit)) > >> > > { > >> > > ... > >> > > - bitmap_clear_bit (bitmap, bit); > >> > > ... > >> > > } > >> > > | > >> > > -if (bitmap_bit_p (bitmap, bit)) > >> > > +if (bitmap_clear_bit (bitmap, bit)) > >> > > { > >> > > ... > >> > > } > >> > > ... > >> > > -bitmap_clear_bit (bitmap, bit); > >> > > ) > >> > > ...> > >> > > } > >> > > EOF > >> > > $ find gcc/ -type f -a \( -name "*.c" -o -name "*.cc" \) -a \( ! -path > >> > > "gcc/testsuite/*" -a ! -path "gcc/contrib/*" \) -exec spatch -sp_file > >> > > ~/coccinelle/gcc_bitmap_bit_p-0.cocci --show-diff {} \; > >> > > diff = > >> > > --- gcc/dse.c > >> > > +++ /tmp/cocci-output-1104419-443759-dse.c > >> > > @@ -3238,9 +3238,8 @@ mark_reachable_blocks (sbitmap unreachab > >> > > edge e; > >> > > edge_iterator ei; > >> > > > >> > > - if (bitmap_bit_p (unreachable_blocks, bb->index)) > >> > > + if (bitmap_clear_bit(unreachable_blocks, bb->index)) > >> > > { > >> > > - bitmap_clear_bit (unreachable_blocks, bb->index); > >> > > FOR_EACH_EDGE (e, ei, bb->preds) > >> > > { > >> > > mark_reachable_blocks (unreachable_blocks, e->src); > >> > > diff = > >> > > --- gcc/ira.c > >> > > +++ /tmp/cocci-output-1104678-d8679a-ira.c > >> > > @@ -2944,17 +2944,15 @@ mark_elimination (int from, int to) > >> > > FOR_EACH_BB_FN (bb, cfun) > >> > > { > >> > > r = DF_LR_IN (bb); > >> > > - if (bitmap_bit_p (r, from)) > >> > > + if (bitmap_clear_bit(r, from)) > >> > > { > >> > > - bitmap_clear_bit (r, from); > >> > > bitmap_set_bit (r, to); > >> > > } > >> > > if (! df_live) > >> > > continue; > >> > > r = DF_LIVE_IN (bb); > >> > > - if (bitmap_bit_p (r, from)) > >> > > + if (bitmap_clear_bit(r, from)) > >> > > { > >> > > - bitmap_clear_bit (r, from); > >> > > bitmap_set_bit (r, to); > >> > > } > >> > > } > >> > > # in ira.c one would have to fixup the curly braces manually > >> > > PS: coccinelle seems to ruin the spaces before braces in the '+' even > >> > > though i have written them correctly according to GNU style.. > >> > > > >> > > >> >