https://gcc.gnu.org/g:a5ab19d9db2d13db3ea21d0b2a0e3e5e02766bc8
commit r17-1602-ga5ab19d9db2d13db3ea21d0b2a0e3e5e02766bc8 Author: Andrew MacLeod <[email protected]> Date: Mon Jun 1 14:28:33 2026 -0400 Switch VRP to use prange. Use the points-to info in prange instead olf the value-range-equiv side table in VRP. Adjust testcases: - PTA causes less mem*_chk routines to be generated. - Gimple fold is causing issues by not properly handling pointer_plus. See PR 123160. XFAILing until resolved. - Adding noipa prevents VRP from propagating IPA info causing a failure. gcc/ * tree-vrp.cc (rvrp_folder::value_of_expr): Use prange PTA info. (value_on_edge): Likewise. gcc/testsuite/ * gcc.c-torture/execute/builtins/memcpy-chk.c: Adjust. * gcc.c-torture/execute/builtins/memmove-chk.c: Adjust. * gcc.dg/builtin-object-size-4.c: XFAIL until pr123160 is fixed. * gcc.dg/builtin-dynamic-object-size-4.c: Likewise. * gcc.misc-tests/gcov-14.c: Add noipa. Diff: --- .../gcc.c-torture/execute/builtins/memcpy-chk.c | 4 +- .../gcc.c-torture/execute/builtins/memmove-chk.c | 4 +- .../gcc.dg/builtin-dynamic-object-size-4.c | 1 + gcc/testsuite/gcc.dg/builtin-object-size-4.c | 1 + gcc/testsuite/gcc.misc-tests/gcov-14.c | 2 +- gcc/tree-vrp.cc | 58 +++++++++++++++++++--- 6 files changed, 58 insertions(+), 12 deletions(-) diff --git a/gcc/testsuite/gcc.c-torture/execute/builtins/memcpy-chk.c b/gcc/testsuite/gcc.c-torture/execute/builtins/memcpy-chk.c index 5b245e58e22b..985e1ad23688 100644 --- a/gcc/testsuite/gcc.c-torture/execute/builtins/memcpy-chk.c +++ b/gcc/testsuite/gcc.c-torture/execute/builtins/memcpy-chk.c @@ -146,7 +146,7 @@ test2_sub (long *buf3, char *buf4, char *buf6, int n) call. */ /* buf3 points to an unknown object, so __memcpy_chk should not be done. */ - if (memcpy ((char *) buf3 + 4, buf5, n + 6) != (char *) buf1 + 4 + if (memcpy ((char *) buf3 + 4, buf5, 6) != (char *) buf1 + 4 || memcmp (buf1, "aBcdRSTUVWklmnopq\0", 19)) abort (); @@ -158,7 +158,7 @@ test2_sub (long *buf3, char *buf4, char *buf6, int n) || i != 3) abort (); - if (memcpy ((char *) buf3 + 14, buf6, n + 2) != (char *) buf1 + 14 + if (memcpy ((char *) buf3 + 14, buf6, 2) != (char *) buf1 + 14 || memcmp (buf1, "aBcdRSTUVWkSmnrsq\0", 19)) abort (); diff --git a/gcc/testsuite/gcc.c-torture/execute/builtins/memmove-chk.c b/gcc/testsuite/gcc.c-torture/execute/builtins/memmove-chk.c index 73b35883ed1f..fbecf313ed15 100644 --- a/gcc/testsuite/gcc.c-torture/execute/builtins/memmove-chk.c +++ b/gcc/testsuite/gcc.c-torture/execute/builtins/memmove-chk.c @@ -149,7 +149,7 @@ test2_sub (long *buf3, char *buf4, char *buf6, int n) call. */ /* buf3 points to an unknown object, so __memmove_chk should not be done. */ - if (memmove ((char *) buf3 + 4, buf5, n + 6) != (char *) buf1 + 4 + if (memmove ((char *) buf3 + 4, buf5, 6) != (char *) buf1 + 4 || memcmp (buf1, "aBcdRSTUVWklmnopq\0", 19)) abort (); @@ -161,7 +161,7 @@ test2_sub (long *buf3, char *buf4, char *buf6, int n) || i != 3) abort (); - if (memmove ((char *) buf3 + 14, buf6, n + 2) != (char *) buf1 + 14 + if (memmove ((char *) buf3 + 14, buf6, 2) != (char *) buf1 + 14 || memcmp (buf1, "aBcdRSTUVWkSmnrsq\0", 19)) abort (); diff --git a/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-4.c b/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-4.c index 4a909b263a70..1a01d0e4beb3 100644 --- a/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-4.c +++ b/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-4.c @@ -1,6 +1,7 @@ /* { dg-do run } */ /* { dg-options "-O2 -Wno-stringop-overread" } */ /* { dg-additional-options "-DSKIP_STRNDUP" { target { ! strndup } } } */ +/* { dg-xfail-run-if "PTA now triggers PR123160" { "*-*-*" } } */ #define __builtin_object_size __builtin_dynamic_object_size #include "builtin-object-size-4.c" diff --git a/gcc/testsuite/gcc.dg/builtin-object-size-4.c b/gcc/testsuite/gcc.dg/builtin-object-size-4.c index ec7cde9522bf..511f844683b2 100644 --- a/gcc/testsuite/gcc.dg/builtin-object-size-4.c +++ b/gcc/testsuite/gcc.dg/builtin-object-size-4.c @@ -1,6 +1,7 @@ /* { dg-do run } */ /* { dg-options "-O2 -Wno-stringop-overread" } */ /* { dg-additional-options "-DSKIP_STRNDUP" { target { ! strndup } } } */ +/* { dg-xfail-run-if "PTA now triggers PR123160" { "*-*-*" } } */ #include "builtin-object-size-common.h" diff --git a/gcc/testsuite/gcc.misc-tests/gcov-14.c b/gcc/testsuite/gcc.misc-tests/gcov-14.c index 847b09cc13bf..97a77437d17b 100644 --- a/gcc/testsuite/gcc.misc-tests/gcov-14.c +++ b/gcc/testsuite/gcc.misc-tests/gcov-14.c @@ -15,7 +15,7 @@ extern __inline int Foo () return 0; /* count(-) */ } -int (* __attribute__ ((noinline)) Bar ()) () +int (* __attribute__ ((noinline,noipa)) Bar ()) () { return Foo; /* count(1) */ } diff --git a/gcc/tree-vrp.cc b/gcc/tree-vrp.cc index 8f80fc6b69c5..89c57d791c9d 100644 --- a/gcc/tree-vrp.cc +++ b/gcc/tree-vrp.cc @@ -977,10 +977,32 @@ public: { // Shortcircuit subst_and_fold callbacks for abnormal ssa_names. if (TREE_CODE (name) == SSA_NAME && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (name)) - return NULL; - tree ret = m_ranger->value_of_expr (name, s); - if (!ret && supported_pointer_equiv_p (name)) - ret = m_pta->get_equiv (name); + return NULL_TREE; + if (!value_range::supports_type_p (TREE_TYPE (name))) + return NULL_TREE; + + value_range r (TREE_TYPE (name)); + if (!m_ranger->range_of_expr (r, name, s)) + return NULL_TREE; + + // A constant used in an unreachable block often returns as UNDEFINED. + // If the result is undefined, check the global value for a constant. + if (r.undefined_p ()) + range_of_expr (r, name); + + tree ret; + if (r.singleton_p (&ret)) + return ret; + else + ret = NULL_TREE; + if (is_a <prange> (r)) + { + prange &p = as_a <prange> (r); + ret = p.pt_invariant (); + // A const points has to be gimple_min_invariant. + gcc_checking_assert (!ret || is_gimple_min_invariant (ret)); + } + return ret; } @@ -989,9 +1011,31 @@ public: // Shortcircuit subst_and_fold callbacks for abnormal ssa_names. if (TREE_CODE (name) == SSA_NAME && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (name)) return NULL; - tree ret = m_ranger->value_on_edge (e, name); - if (!ret && supported_pointer_equiv_p (name)) - ret = m_pta->get_equiv (name); + if (!value_range::supports_type_p (TREE_TYPE (name))) + return NULL_TREE; + + value_range r (TREE_TYPE (name)); + if (!m_ranger->range_on_edge (r, e, name)) + return NULL_TREE; + + // A constant used in an unreachable block often returns as UNDEFINED. + // If the result is undefined, check the global value for a constant. + if (r.undefined_p ()) + range_of_expr (r, name); + + tree ret; + if (r.singleton_p (&ret)) + return ret; + else + ret = NULL_TREE; + if (is_a <prange> (r)) + { + prange &p = as_a <prange> (r); + ret = p.pt_invariant (); + // A const points has to be gimple_min_invariant. + gcc_checking_assert (!ret || is_gimple_min_invariant (ret)); + } + return ret; }
