diff mbox series

tree-optimization/115138 - ptr-vs-ptr and FUNCTION_DECLs

Message ID 20240523113743.84997384C2C1@sourceware.org
State New
Headers show
Series tree-optimization/115138 - ptr-vs-ptr and FUNCTION_DECLs | expand

Commit Message

Richard Biener May 23, 2024, 11:37 a.m. UTC
I failed to realize we do not represent FUNCTION_DECLs or LABEL_DECLs
in vars explicitly and thus have to compare pt.vars_contains_nonlocal.

Bootstrapped and tested with bootstrap-O3 and D to verify the
comparison fail is fixed.  I'm now doing a regular bootstrap and
regtest with the volatile fix and will push afterwards.

	PR tree-optimization/115138
	* tree-ssa-alias.cc (ptrs_compare_unequal): Make sure
	pt.vars_contains_nonlocal differs since we do not represent
	FUNCTION_DECLs or LABEL_DECLs in vars explicitly.

	* gcc.dg/torture/pr115138.c: New testcase.
---
 gcc/testsuite/gcc.dg/torture/pr115138.c | 28 +++++++++++++++++++++++++
 gcc/tree-ssa-alias.cc                   |  6 ++++++
 2 files changed, 34 insertions(+)
 create mode 100644 gcc/testsuite/gcc.dg/torture/pr115138.c
diff mbox series

Patch

diff --git a/gcc/testsuite/gcc.dg/torture/pr115138.c b/gcc/testsuite/gcc.dg/torture/pr115138.c
new file mode 100644
index 00000000000..6becaecbaff
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr115138.c
@@ -0,0 +1,28 @@ 
+/* { dg-do run } */
+
+int foo (int) {}
+int bar (int) {}
+
+typedef int (*pred)(int);
+
+int x, y;
+pred A () { if (x) return foo; else return bar; }
+pred B () { if (y) return foo; else return bar; }
+int __attribute__((noipa)) baz()
+{
+  pred a = A();
+  pred b = B();
+  if (a != b)
+    return 42;
+  return 0;
+}
+
+int main()
+{
+  if (baz () != 0)
+    __builtin_abort ();
+  y = 1;
+  if (baz () != 42)
+    __builtin_abort ();
+  return 0;
+}
diff --git a/gcc/tree-ssa-alias.cc b/gcc/tree-ssa-alias.cc
index d64d6d02f4a..1a91d63a31e 100644
--- a/gcc/tree-ssa-alias.cc
+++ b/gcc/tree-ssa-alias.cc
@@ -501,6 +501,12 @@  ptrs_compare_unequal (tree ptr1, tree ptr2)
 	      || pi2->pt.vars_contains_interposable)
 	    return false;
 	  if ((!pi1->pt.null || !pi2->pt.null)
+	      /* ???  We do not represent FUNCTION_DECL and LABEL_DECL
+		 in pt.vars but only set pt.vars_contains_nonlocal.  This
+		 makes compares involving those and other nonlocals
+		 imprecise.  */
+	      && (!pi1->pt.vars_contains_nonlocal
+		  || !pi2->pt.vars_contains_nonlocal)
 	      && (!pt_solution_includes_const_pool (&pi1->pt)
 		  || !pt_solution_includes_const_pool (&pi2->pt)))
 	    return !pt_solutions_intersect (&pi1->pt, &pi2->pt);