mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-02-01 06:39:39 +08:00
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.
This commit is contained in:
parent
09845ad756
commit
6b73c07ec2
@ -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));
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user