aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew MacLeod <amacleod@redhat.com>2022-07-14 12:35:55 -0400
committerAndrew MacLeod <amacleod@redhat.com>2022-07-18 15:48:13 -0400
commit5e47c9333df6df1aa9da861f07e68f985d7d28fb (patch)
treee21ee755c87bec66fbc2a63ed7abb8c02a5a575c
parente9ee752bbe2cc5632b803b01dc7c98ff214aede9 (diff)
downloadgcc-5e47c9333df6df1aa9da861f07e68f985d7d28fb.zip
gcc-5e47c9333df6df1aa9da861f07e68f985d7d28fb.tar.gz
gcc-5e47c9333df6df1aa9da861f07e68f985d7d28fb.tar.bz2
Check if transitives need to be registered.
Whenever a relation is added, register_transitive is always called. If neither operand was in a relation before, or this is not a new relation, then there is no need to register transitives. PR tree-optimization/106280 * value-relation.cc (dom_oracle::register_relation): Register transitives only when it is possible for there to be one. (dom_oracle::set_one_relation): Return NULL if this is an existing relation.
-rw-r--r--gcc/value-relation.cc13
1 files changed, 10 insertions, 3 deletions
diff --git a/gcc/value-relation.cc b/gcc/value-relation.cc
index 13ce441..bd34425 100644
--- a/gcc/value-relation.cc
+++ b/gcc/value-relation.cc
@@ -967,8 +967,12 @@ dom_oracle::register_relation (basic_block bb, relation_kind k, tree op1,
equiv_oracle::register_relation (bb, k, op1, op2);
else
{
+ // if neither op1 nor op2 are in a relation before this is registered,
+ // there will be no transitive.
+ bool check = bitmap_bit_p (m_relation_set, SSA_NAME_VERSION (op1))
+ || bitmap_bit_p (m_relation_set, SSA_NAME_VERSION (op2));
relation_chain *ptr = set_one_relation (bb, k, op1, op2);
- if (ptr)
+ if (ptr && check)
register_transitives (bb, *ptr);
}
}
@@ -1010,13 +1014,16 @@ dom_oracle::set_one_relation (basic_block bb, relation_kind k, tree op1,
// Check into whether we can simply replace the relation rather than
// intersecting it. THis may help with some optimistic iterative
// updating algorithms.
- ptr->intersect (vr);
+ bool new_rel = ptr->intersect (vr);
if (dump_file && (dump_flags & TDF_DETAILS))
{
fprintf (dump_file, " to produce ");
ptr->dump (dump_file);
- fprintf (dump_file, "\n");
+ fprintf (dump_file, " %s.\n", new_rel ? "Updated" : "No Change");
}
+ // If there was no change, return no record..
+ if (!new_rel)
+ return NULL;
}
else
{