From: Andrew MacLeod Date: Tue, 18 Jan 2022 17:42:02 +0000 (-0500) Subject: Only add equivalencies that are still valid. X-Git-Tag: upstream/12.2.0~1923 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=6b73c07ec2e836a5cf7bacd6c7257fb8512c681e;p=platform%2Fupstream%2Fgcc.git Only add equivalencies that are still valid. When equivalencies sets are merged, each member of the set should be queried to ensure its still valid rather than a bulk union. * value-relation.cc (relation_oracle::valid_equivs): Query and add if valid members of a set. (equiv_oracle::register_equiv): Call valid_equivs rather than bitmap direct operations. (path_oracle::register_equiv): Ditto. * value-relation.h (relation_oracle::valid_equivs): New prototype. --- diff --git a/gcc/value-relation.cc b/gcc/value-relation.cc index 32ca693..0134e03 100644 --- a/gcc/value-relation.cc +++ b/gcc/value-relation.cc @@ -188,6 +188,23 @@ relation_transitive (relation_kind r1, relation_kind r2) return rr_transitive_table[r1 - VREL_FIRST][r2 - VREL_FIRST]; } +// Given an equivalence set EQUIV, set all the bits in B that are still valid +// members of EQUIV in basic block BB. + +void +relation_oracle::valid_equivs (bitmap b, const_bitmap equivs, basic_block bb) +{ + unsigned i; + bitmap_iterator bi; + EXECUTE_IF_SET_IN_BITMAP (equivs, 0, i, bi) + { + tree ssa = ssa_name (i); + const_bitmap ssa_equiv = equiv_set (ssa, bb); + if (ssa_equiv == equivs) + bitmap_set_bit (b, i); + } +} + // ------------------------------------------------------------------------- // The very first element in the m_equiv chain is actually just a summary @@ -364,7 +381,7 @@ equiv_oracle::register_equiv (basic_block bb, unsigned v, equiv_chain *equiv) // Otherwise create an equivalence for this block which is a copy // of equiv, the add V to the set. bitmap b = BITMAP_ALLOC (&m_bitmaps); - bitmap_copy (b, equiv->m_names); + valid_equivs (b, equiv->m_names, bb); bitmap_set_bit (b, v); return b; } @@ -378,32 +395,32 @@ bitmap equiv_oracle::register_equiv (basic_block bb, equiv_chain *equiv_1, equiv_chain *equiv_2) { - // If equiv_1 is alreayd in BB, use it as the combined set. + // If equiv_1 is already in BB, use it as the combined set. if (equiv_1->m_bb == bb) { - bitmap_ior_into (equiv_1->m_names, equiv_2->m_names); + valid_equivs (equiv_1->m_names, equiv_2->m_names, bb); // Its hard to delete from a single linked list, so // just clear the second one. if (equiv_2->m_bb == bb) bitmap_clear (equiv_2->m_names); else - // Ensure equiv_2s names are in the summary for BB. - bitmap_ior_into (m_equiv[bb->index]->m_names, equiv_2->m_names); + // Ensure the new names are in the summary for BB. + bitmap_ior_into (m_equiv[bb->index]->m_names, equiv_1->m_names); return NULL; } // If equiv_2 is in BB, use it for the combined set. if (equiv_2->m_bb == bb) { - bitmap_ior_into (equiv_2->m_names, equiv_1->m_names); - // Add equiv_1 names into the summary. - bitmap_ior_into (m_equiv[bb->index]->m_names, equiv_1->m_names); + valid_equivs (equiv_2->m_names, equiv_1->m_names, bb); + // Ensure the new names are in the summary. + bitmap_ior_into (m_equiv[bb->index]->m_names, equiv_2->m_names); return NULL; } // At this point, neither equivalence is from this block. bitmap b = BITMAP_ALLOC (&m_bitmaps); - bitmap_copy (b, equiv_1->m_names); - bitmap_ior_into (b, equiv_2->m_names); + valid_equivs (b, equiv_1->m_names, bb); + valid_equivs (b, equiv_2->m_names, bb); return b; } @@ -1289,8 +1306,8 @@ path_oracle::register_equiv (basic_block bb, tree ssa1, tree ssa2) // Don't mess around, simply create a new record and insert it first. bitmap b = BITMAP_ALLOC (&m_bitmaps); - bitmap_copy (b, equiv_1); - bitmap_ior_into (b, equiv_2); + valid_equivs (b, equiv_1, bb); + valid_equivs (b, equiv_2, bb); equiv_chain *ptr = (equiv_chain *) obstack_alloc (&m_chain_obstack, sizeof (equiv_chain)); diff --git a/gcc/value-relation.h b/gcc/value-relation.h index 44d0796..d840234 100644 --- a/gcc/value-relation.h +++ b/gcc/value-relation.h @@ -96,6 +96,8 @@ public: virtual void dump (FILE *, basic_block) const = 0; virtual void dump (FILE *) const = 0; void debug () const; +protected: + void valid_equivs (bitmap b, const_bitmap equivs, basic_block bb); }; // This class represents an equivalency set, and contains a link to the next