On Wed, 27 Oct 2021 20:13:21 +0200 Aldy Hernandez via Gcc-patches <gcc-patches@gcc.gnu.org> wrote:
[would have to think about this some more but it's late here. Nits:] > diff --git a/gcc/value-relation.cc b/gcc/value-relation.cc > index 2acf375ca9a..0ad4f7a9495 100644 > --- a/gcc/value-relation.cc > +++ b/gcc/value-relation.cc > @@ -1297,8 +1297,9 @@ path_oracle::killing_def (tree ssa) > fprintf (dump_file, "\n"); > } > > + unsigned v = SSA_NAME_VERSION (ssa); > bitmap b = BITMAP_ALLOC (&m_bitmaps); > - bitmap_set_bit (b, SSA_NAME_VERSION (ssa)); > + bitmap_set_bit (b, v); > equiv_chain *ptr = (equiv_chain *) obstack_alloc (&m_chain_obstack, > sizeof (equiv_chain)); > ptr->m_names = b; > @@ -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. I would not be surprised if this generates better code as we probably do not grok to optimize the !bit_p else clear_bit combo. Shame (?). > + relation_chain **prev = &(m_relations.m_head); s/[()]// thanks, > + relation_chain *next = NULL; > + for (relation_chain *ptr = m_relations.m_head; ptr; ptr = next) > + { > + gcc_checking_assert (*prev == ptr); > + next = ptr->m_next; > + if (SSA_NAME_VERSION (ptr->op1 ()) == v > + || SSA_NAME_VERSION (ptr->op2 ()) == v) > + *prev = ptr->m_next; > + else > + prev = &(ptr->m_next); > + } > } > > // Register relation K between SSA1 and SSA2, resolving unknowns by