When registering an equivalence, the oracle creates an initial equivalence for an SSA_NAME with itself in the def block.   This primarily prevents dominator queries from searching past the definition block.

If the definition stmt for the SSA_NAME has not been placed in the CFG yet, we should defer creating this record until it has.    The next time an equivalence is registered, if the SSA_NAME is in the IL then this record will be created.

Bootstrapped on x86_64-pc-linux-gnu with no regressions.  Pushed.

Andrew



From 01c095ab77f8f43bf77e4c0be6c4f4c0d15a4c29 Mon Sep 17 00:00:00 2001
From: Andrew MacLeod <amacl...@redhat.com>
Date: Fri, 19 Jul 2024 17:39:40 -0400
Subject: [PATCH] Check for SSA_NAME not in the IL yet.

Check for an SSA_NAME not in the CFG before trying to create an
equivalence record in the defintion block.

	PR tree-optimization/116003
	gcc/
	* value-relation.cc (equiv_oracle::register_initial_def): Check
	if SSA_NAME is in the IL before registering.

	gcc/testsuite/
	* gcc.dg/pr116003.c: New.
---
 gcc/testsuite/gcc.dg/pr116003.c | 21 +++++++++++++++++++++
 gcc/value-relation.cc           |  6 +++++-
 2 files changed, 26 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/gcc.dg/pr116003.c

diff --git a/gcc/testsuite/gcc.dg/pr116003.c b/gcc/testsuite/gcc.dg/pr116003.c
new file mode 100644
index 00000000000..6021058a14e
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr116003.c
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fnon-call-exceptions -fprofile-arcs -finstrument-functions -fno-tree-copy-prop" } */
+
+_BitInt(5) b5;
+
+char c;
+int i;
+_BitInt(129) b129;
+
+void
+foo(_BitInt(128) b128)
+{
+l50:
+  b128 %= b128 - b129;
+l64:
+  b128 %= c;
+  if (__builtin_add_overflow(i, 0, &c))
+    goto l50;
+  if (__builtin_sub_overflow(c, 0, &b5))
+    goto l64;
+}
diff --git a/gcc/value-relation.cc b/gcc/value-relation.cc
index 9293d9ed65b..45722fcd13a 100644
--- a/gcc/value-relation.cc
+++ b/gcc/value-relation.cc
@@ -607,7 +607,11 @@ equiv_oracle::register_initial_def (tree ssa)
   if (SSA_NAME_IS_DEFAULT_DEF (ssa))
     return;
   basic_block bb = gimple_bb (SSA_NAME_DEF_STMT (ssa));
-  gcc_checking_assert (bb && !find_equiv_dom (ssa, bb));
+
+  // If defining stmt is not in the IL, simply return.
+  if (!bb)
+    return;
+  gcc_checking_assert (!find_equiv_dom (ssa, bb));
 
   unsigned v = SSA_NAME_VERSION (ssa);
   bitmap_set_bit (m_equiv_set, v);
-- 
2.45.0

Reply via email to