From: Andrew MacLeod Date: Fri, 21 Apr 2023 19:03:43 +0000 (-0400) Subject: Do not fold ADDR_EXPR conditions leading to builtin_unreachable early. X-Git-Tag: basepoints/gcc-15~9979 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f828503eeb79ad1f1ada6db7deccc5abcc2f3ca3;p=thirdparty%2Fgcc.git Do not fold ADDR_EXPR conditions leading to builtin_unreachable early. Ranges can not represent &var globally yet, so we cannot fold these expressions early or we lose the __builtin_unreachable information. PR tree-optimization/109546 gcc/ * tree-vrp.cc (remove_unreachable::remove_and_update_globals): Do not fold conditions with ADDR_EXPR early. gcc/testsuite/ * gcc.dg/pr109546.c: New. --- diff --git a/gcc/testsuite/gcc.dg/pr109546.c b/gcc/testsuite/gcc.dg/pr109546.c new file mode 100644 index 000000000000..ba8af0f31fa6 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr109546.c @@ -0,0 +1,24 @@ +/* { dg-do compile } */ +/* { dg-options "-O3 -fdump-tree-optimized" } */ + +void foo(void); +static int a, c; +static int *b = &a; +static int **d = &b; +void assert_fail() __attribute__((__noreturn__)); +int main() { + int *e = *d; + if (e == &a || e == &c); + else { + __builtin_unreachable(); + assert_fail(); + } + if (e == &a || e == &c); + else + foo(); +} + +/* { dg-final { scan-tree-dump-not "assert_fail" "optimized" } } */ +/* { dg-final { scan-tree-dump-not "foo" "optimized" } } */ + + diff --git a/gcc/tree-vrp.cc b/gcc/tree-vrp.cc index f4d484526c77..9b870640e238 100644 --- a/gcc/tree-vrp.cc +++ b/gcc/tree-vrp.cc @@ -150,7 +150,9 @@ remove_unreachable::remove_and_update_globals (bool final_p) // If this is already a constant condition, don't look either if (!lhs_p && !rhs_p) continue; - + // Do not remove addresses early. ie if (x == &y) + if (!final_p && lhs_p && TREE_CODE (gimple_cond_rhs (s)) == ADDR_EXPR) + continue; bool dominate_exit_p = true; FOR_EACH_GORI_EXPORT_NAME (m_ranger.gori (), e->src, name) {