diff options
author | Andrew MacLeod <amacleod@redhat.com> | 2022-07-14 12:35:55 -0400 |
---|---|---|
committer | Andrew MacLeod <amacleod@redhat.com> | 2022-07-18 15:48:13 -0400 |
commit | 5e47c9333df6df1aa9da861f07e68f985d7d28fb (patch) | |
tree | e21ee755c87bec66fbc2a63ed7abb8c02a5a575c | |
parent | e9ee752bbe2cc5632b803b01dc7c98ff214aede9 (diff) | |
download | gcc-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.cc | 13 |
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 { |