diff options
author | Andrew MacLeod <amacleod@redhat.com> | 2023-04-21 15:03:43 -0400 |
---|---|---|
committer | Andrew MacLeod <amacleod@redhat.com> | 2023-04-21 16:34:05 -0400 |
commit | f828503eeb79ad1f1ada6db7deccc5abcc2f3ca3 (patch) | |
tree | 5bf85bc2b76f66361323926c92125ab2800f7310 /gcc | |
parent | 03cebd304955a6b9c5607e09312d77f1307cc98e (diff) | |
download | gcc-f828503eeb79ad1f1ada6db7deccc5abcc2f3ca3.zip gcc-f828503eeb79ad1f1ada6db7deccc5abcc2f3ca3.tar.gz gcc-f828503eeb79ad1f1ada6db7deccc5abcc2f3ca3.tar.bz2 |
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.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/testsuite/gcc.dg/pr109546.c | 24 | ||||
-rw-r--r-- | gcc/tree-vrp.cc | 4 |
2 files changed, 27 insertions, 1 deletions
diff --git a/gcc/testsuite/gcc.dg/pr109546.c b/gcc/testsuite/gcc.dg/pr109546.c new file mode 100644 index 0000000..ba8af0f --- /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 f4d48452..9b87064 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) { |