public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r12-6774] Only add equivalencies that are still valid.
@ 2022-01-20 15:30 Andrew Macleod
0 siblings, 0 replies; only message in thread
From: Andrew Macleod @ 2022-01-20 15:30 UTC (permalink / raw)
To: gcc-cvs
https://gcc.gnu.org/g:6b73c07ec2e836a5cf7bacd6c7257fb8512c681e
commit r12-6774-g6b73c07ec2e836a5cf7bacd6c7257fb8512c681e
Author: Andrew MacLeod <amacleod@redhat.com>
Date: Tue Jan 18 12:42:02 2022 -0500
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:
---
gcc/value-relation.cc | 41 +++++++++++++++++++++++++++++------------
gcc/value-relation.h | 2 ++
2 files changed, 31 insertions(+), 12 deletions(-)
diff --git a/gcc/value-relation.cc b/gcc/value-relation.cc
index 32ca693c464..0134e0328ba 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 44d0796d939..d840234f355 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
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2022-01-20 15:30 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-01-20 15:30 [gcc r12-6774] Only add equivalencies that are still valid Andrew Macleod
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).