From cebf79e0ba1a3ea6c8fc711c26f219500da5bba2 Mon Sep 17 00:00:00 2001 From: Jeff Law Date: Fri, 28 Jun 2019 15:01:56 -0600 Subject: [PATCH] re PR tree-optimization/90949 (null pointer check removed) PR tree-optimization/90949 * tree-ssa-copy.c (fini_copy_prop): Use reset_flow_sensitive_info. * tree-ssanames.c (reset_flow_sensitive_info): Reset non-null state. * gcc.c-torture/execute/pr90949.c: New test. From-SVN: r272798 --- gcc/ChangeLog | 9 ++++ gcc/testsuite/ChangeLog | 8 ++++ gcc/testsuite/gcc.c-torture/execute/pr90949.c | 42 +++++++++++++++++++ gcc/tree-ssa-copy.c | 11 +++-- gcc/tree-ssanames.c | 7 +++- 5 files changed, 70 insertions(+), 7 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/execute/pr90949.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 853191aa7cce..05cef9b2be1f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2019-06-28 Jeff Law + + Backport from mainline + 2019-06-21 Jeff Law + + PR tree-optimization/90949 + * tree-ssa-copy.c (fini_copy_prop): Use reset_flow_sensitive_info. + * tree-ssanames.c (reset_flow_sensitive_info): Reset non-null state. + 2019-06-27 Martin Jambor Backport from mainline diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2536a6f53178..e96edd002d4a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2019-06-21 Jeff Law + + Backport fom mainline + 2019-06-21 Jeff Law + + PR tree-optimization/90949 + * gcc.c-torture/execute/pr90949.c: New test. + 2019-06-21 Thomas Koenig Backport from trunk diff --git a/gcc/testsuite/gcc.c-torture/execute/pr90949.c b/gcc/testsuite/gcc.c-torture/execute/pr90949.c new file mode 100644 index 000000000000..8c2ae3972d4f --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr90949.c @@ -0,0 +1,42 @@ +void __attribute__ ((noipa, noinline)) my_puts (const char *str) { } + +void __attribute__ ((noipa, noinline)) my_free (void *p) { } + + +struct Node +{ + struct Node *child; +}; + +struct Node space[2] = { }; + +struct Node * __attribute__ ((noipa, noinline)) my_malloc (int bytes) +{ + return &space[0]; +} + +void +walk (struct Node *module, int cleanup) +{ + if (module == 0) + { + return; + } + if (!cleanup) + { + my_puts ("No cleanup"); + } + walk (module->child, cleanup); + if (cleanup) + { + my_free (module); + } +} + +int +main () +{ + struct Node *node = my_malloc (sizeof (struct Node)); + node->child = 0; + walk (node, 1); +} diff --git a/gcc/tree-ssa-copy.c b/gcc/tree-ssa-copy.c index c17218fc7bdb..73fe7b4cb78a 100644 --- a/gcc/tree-ssa-copy.c +++ b/gcc/tree-ssa-copy.c @@ -532,13 +532,12 @@ fini_copy_prop (void) duplicate_ssa_name_ptr_info (copy_of[i].value, SSA_NAME_PTR_INFO (var)); /* Points-to information is cfg insensitive, - but alignment info might be cfg sensitive, if it - e.g. is derived from VRP derived non-zero bits. - So, do not copy alignment info if the two SSA_NAMEs - aren't defined in the same basic block. */ + but [E]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 (var_bb != copy_of_bb) - mark_ptr_info_alignment_unknown - (SSA_NAME_PTR_INFO (copy_of[i].value)); + reset_flow_sensitive_info (copy_of[i].value); } else if (!POINTER_TYPE_P (TREE_TYPE (var)) && SSA_NAME_RANGE_INFO (var) diff --git a/gcc/tree-ssanames.c b/gcc/tree-ssanames.c index 6487542eb8f3..1212e454957d 100644 --- a/gcc/tree-ssanames.c +++ b/gcc/tree-ssanames.c @@ -744,7 +744,12 @@ reset_flow_sensitive_info (tree name) { /* points-to info is not flow-sensitive. */ if (SSA_NAME_PTR_INFO (name)) - mark_ptr_info_alignment_unknown (SSA_NAME_PTR_INFO (name)); + { + /* [E]VRP can derive context sensitive alignment info and + non-nullness properties. We must reset both. */ + mark_ptr_info_alignment_unknown (SSA_NAME_PTR_INFO (name)); + SSA_NAME_PTR_INFO (name)->pt.null = 1; + } } else SSA_NAME_RANGE_INFO (name) = NULL; -- 2.47.2