aboutsummaryrefslogtreecommitdiff
path: root/gcc/value-relation.cc
diff options
context:
space:
mode:
authorAldy Hernandez <aldyh@redhat.com>2021-10-19 20:57:49 +0200
committerAldy Hernandez <aldyh@redhat.com>2021-10-22 12:48:45 +0200
commit8a0faddadd159c19fe79572619ea6466eeed0135 (patch)
tree5f151ad5046a4a3d3e5189a631afc8d76959060f /gcc/value-relation.cc
parentfe8475c500939011b90504304aec61bf6f48ac7d (diff)
downloadgcc-8a0faddadd159c19fe79572619ea6466eeed0135.zip
gcc-8a0faddadd159c19fe79572619ea6466eeed0135.tar.gz
gcc-8a0faddadd159c19fe79572619ea6466eeed0135.tar.bz2
Disregard incoming equivalences to a path when defining a new one.
The equivalence oracle creates a new equiv set at each def point, killing any incoming equivalences, however in the path sensitive oracle we create brand new equivalences at each PHI: BB4: BB8: x_5 = PHI <y_8(4)> Here we note that x_5 == y_8 at the end of the path. The current code is intersecting this new equivalence with previously known equivalences coming into the path. This is incorrect, as this is a new definition. This patch kills any known equivalence before we register a new one. This hasn't caused problems so far, but upcoming changes to the pipeline has us threading more aggressively and triggering corner cases where this causes incorrect code. I have tested this patch with the usual regstrap cycle. I have also hacked a compiler comparing the old and new behavior to see if we were previously threading paths where the decision was made due to invalid equivalences. Luckily, there were no such paths, but there were 22 paths in a set of .ii files where disregarding incoming relations allowed us to thread the path. This is a miniscule improvement, but we moved a handful of thredable paths earlier in the pipeline, which is always good. Tested on x86-64 Linux. Co-authored-by: Andrew MacLeod <amacleod@redhat.com> gcc/ChangeLog: * gimple-range-path.cc (path_range_query::compute_phi_relations): Kill any global relations we may know before registering a new one. * value-relation.cc (path_oracle::killing_def): New. * value-relation.h (path_oracle::killing_def): New.
Diffstat (limited to 'gcc/value-relation.cc')
-rw-r--r--gcc/value-relation.cc23
1 files changed, 23 insertions, 0 deletions
diff --git a/gcc/value-relation.cc b/gcc/value-relation.cc
index ac5f3f9..2acf375 100644
--- a/gcc/value-relation.cc
+++ b/gcc/value-relation.cc
@@ -1285,6 +1285,29 @@ path_oracle::register_equiv (basic_block bb, tree ssa1, tree ssa2)
bitmap_ior_into (m_equiv.m_names, b);
}
+// Register killing definition of an SSA_NAME.
+
+void
+path_oracle::killing_def (tree ssa)
+{
+ if (dump_file && (dump_flags & TDF_DETAILS))
+ {
+ fprintf (dump_file, " Registering killing_def (path_oracle) ");
+ print_generic_expr (dump_file, ssa, TDF_SLIM);
+ fprintf (dump_file, "\n");
+ }
+
+ bitmap b = BITMAP_ALLOC (&m_bitmaps);
+ bitmap_set_bit (b, SSA_NAME_VERSION (ssa));
+ equiv_chain *ptr = (equiv_chain *) obstack_alloc (&m_chain_obstack,
+ sizeof (equiv_chain));
+ ptr->m_names = b;
+ ptr->m_bb = NULL;
+ ptr->m_next = m_equiv.m_next;
+ m_equiv.m_next = ptr;
+ bitmap_ior_into (m_equiv.m_names, b);
+}
+
// Register relation K between SSA1 and SSA2, resolving unknowns by
// querying from BB.