Check for equivalence after merging relations.

When registering a relation, we need to merge with any existing relation
before checking if it was an equivalence... otherwise it was not being
handled properly.

	gcc/
	PR tree-optimization/105458
	* value-relation.cc (path_oracle::register_relation): Merge, then check
	for equivalence.

	gcc/testsuite/
	* gcc.dg/pr105458.c: New.
This commit is contained in:
Andrew MacLeod 2022-05-16 21:39:30 -04:00
parent 61a6923e89
commit 6101a276c3
2 changed files with 24 additions and 4 deletions

View File

@ -0,0 +1,20 @@
/* PR tree-optimization/105458 */
/* { dg-do compile } */
/* { dg-options "-O1 -fexpensive-optimizations -fno-tree-dominator-opts " } */
void
yj (int j4)
{
int t3;
for (t3 = 0; t3 < 6; ++t3)
{
short int v4 = t3;
if (v4 == j4 || v4 > t3)
for (;;)
{
}
}
}

View File

@ -1384,16 +1384,16 @@ path_oracle::register_relation (basic_block bb, relation_kind k, tree ssa1,
fprintf (dump_file, " (root: bb%d)\n", bb->index);
}
relation_kind curr = query_relation (bb, ssa1, ssa2);
if (curr != VREL_VARYING)
k = relation_intersect (curr, k);
if (k == VREL_EQ)
{
register_equiv (bb, ssa1, ssa2);
return;
}
relation_kind curr = query_relation (bb, ssa1, ssa2);
if (curr != VREL_VARYING)
k = relation_intersect (curr, k);
bitmap_set_bit (m_relations.m_names, SSA_NAME_VERSION (ssa1));
bitmap_set_bit (m_relations.m_names, SSA_NAME_VERSION (ssa2));
relation_chain *ptr = (relation_chain *) obstack_alloc (&m_chain_obstack,