diff mbox series

[2/3] tree-optimization/115701 - fix maybe_duplicate_ssa_info_at_copy

Message ID 20240630105348.E3E111340C@imap1.dmz-prg2.suse.org
State New
Headers show
Series [1/3] tree-optimization/115701 - factor out maybe_duplicate_ssa_info_at_copy | expand

Commit Message

Richard Biener June 30, 2024, 10:53 a.m. UTC
The following restricts copying of points-to info from defs that
might be in regions invoking UB and are never executed.

Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed.

	PR tree-optimization/115701
	* tree-ssanames.cc (maybe_duplicate_ssa_info_at_copy):
	Only copy info from within the same BB.

	* gcc.dg/torture/pr115701.c: New testcase.
---
 gcc/testsuite/gcc.dg/torture/pr115701.c | 22 ++++++++++++++++++++++
 gcc/tree-ssanames.cc                    | 22 ++++++++--------------
 2 files changed, 30 insertions(+), 14 deletions(-)
 create mode 100644 gcc/testsuite/gcc.dg/torture/pr115701.c
diff mbox series

Patch

diff --git a/gcc/testsuite/gcc.dg/torture/pr115701.c b/gcc/testsuite/gcc.dg/torture/pr115701.c
new file mode 100644
index 00000000000..9b7c34b23d7
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr115701.c
@@ -0,0 +1,22 @@ 
+/* { dg-do run } */
+/* IPA PTA disables local PTA recompute after IPA.  */
+/* { dg-additional-options "-fipa-pta" } */
+
+int a, c, d;
+static int b;
+int main()
+{
+  int *e = &a, **f = &e;
+  while (1) {
+    int **g, ***h = &f;
+    if (c)
+      *g = e;
+    else if (!b)
+      break;
+    *e = **g;
+    e = &d;
+  }
+  if (e != &a)
+    __builtin_abort();
+  return 0;
+}
diff --git a/gcc/tree-ssanames.cc b/gcc/tree-ssanames.cc
index bb9ed373f36..4f83fcbb517 100644
--- a/gcc/tree-ssanames.cc
+++ b/gcc/tree-ssanames.cc
@@ -775,25 +775,19 @@  duplicate_ssa_name_range_info (tree name, tree src)
 void
 maybe_duplicate_ssa_info_at_copy (tree dest, tree src)
 {
+  /* While points-to info is flow-insensitive we have to avoid copying
+     info from not executed regions invoking UB to dominating defs.  */
+  if (gimple_bb (SSA_NAME_DEF_STMT (src))
+      != gimple_bb (SSA_NAME_DEF_STMT (dest)))
+    return;
+
   if (POINTER_TYPE_P (TREE_TYPE (dest))
       && SSA_NAME_PTR_INFO (dest)
       && ! SSA_NAME_PTR_INFO (src))
-    {
-      duplicate_ssa_name_ptr_info (src, SSA_NAME_PTR_INFO (dest));
-      /* Points-to information is cfg insensitive,
-	 but VRP might record context sensitive alignment
-	 info, non-nullness, etc.  So reset context sensitive
-	 info if the two SSA_NAMEs aren't defined in the same
-	 basic block.  */
-      if (gimple_bb (SSA_NAME_DEF_STMT (src))
-	  != gimple_bb (SSA_NAME_DEF_STMT (dest)))
-	reset_flow_sensitive_info (src);
-    }
+    duplicate_ssa_name_ptr_info (src, SSA_NAME_PTR_INFO (dest));
   else if (INTEGRAL_TYPE_P (TREE_TYPE (dest))
 	   && SSA_NAME_RANGE_INFO (dest)
-	   && ! SSA_NAME_RANGE_INFO (src)
-	   && (gimple_bb (SSA_NAME_DEF_STMT (src))
-	       == gimple_bb (SSA_NAME_DEF_STMT (dest))))
+	   && ! SSA_NAME_RANGE_INFO (src))
     duplicate_ssa_name_range_info (src, dest);
 }