From: Richard Biener Date: Wed, 7 May 2014 10:01:36 +0000 (+0000) Subject: backport: [multiple changes] X-Git-Tag: releases/gcc-4.7.4~112 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=74923c5ccfca9f6db05b721f1fdabc04e8dae502;p=thirdparty%2Fgcc.git backport: [multiple changes] 2014-05-07 Richard Biener Backport from mainline 2013-11-29 Richard Biener PR tree-optimization/59334 * tree-ssa-dce.c (eliminate_unnecessary_stmts): Fix bug in previous commit. 2013-11-28 Richard Biener PR tree-optimization/59330 * tree-ssa-dce.c (eliminate_unnecessary_stmts): Simplify and fix delayed marking of free calls not necessary. * gcc.dg/torture/pr59330.c: New testcase. 2014-01-09 Richard Biener PR tree-optimization/59715 * tree-cfg.h (split_critical_edges): Declare. * tree-cfg.c (split_critical_edges): Export. * tree-ssa-sink.c (execute_sink_code): Split critical edges. * gcc.dg/torture/pr59715.c: New testcase. From-SVN: r210146 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ed7ce78c3bcd..156b5a550ce6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,25 @@ +2014-05-07 Richard Biener + + Backport from mainline + 2013-11-29 Richard Biener + + PR tree-optimization/59334 + * tree-ssa-dce.c (eliminate_unnecessary_stmts): Fix bug + in previous commit. + + 2013-11-28 Richard Biener + + PR tree-optimization/59330 + * tree-ssa-dce.c (eliminate_unnecessary_stmts): Simplify + and fix delayed marking of free calls not necessary. + + 2014-01-09 Richard Biener + + PR tree-optimization/59715 + * tree-cfg.h (split_critical_edges): Declare. + * tree-cfg.c (split_critical_edges): Export. + * tree-ssa-sink.c (execute_sink_code): Split critical edges. + 2014-05-07 Richard Biener PR tree-optimization/57864 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index aeacf94cef77..2bd98d4f0525 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,16 @@ +2014-05-07 Richard Biener + + Backport from mainline + 2013-11-28 Richard Biener + + PR tree-optimization/59330 + * gcc.dg/torture/pr59330.c: New testcase. + + 2014-01-09 Richard Biener + + PR tree-optimization/59715 + * gcc.dg/torture/pr59715.c: New testcase. + 2014-05-07 Richard Biener PR tree-optimization/57864 diff --git a/gcc/testsuite/gcc.dg/torture/pr59330.c b/gcc/testsuite/gcc.dg/torture/pr59330.c new file mode 100644 index 000000000000..74b832ea3143 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr59330.c @@ -0,0 +1,17 @@ +/* { dg-do run } */ + +void free(void *ptr) +{ +} + +void *foo(void) +{ + return 0; +} + +int main(void) +{ + void *p = foo(); + free(p); + return 0; +} diff --git a/gcc/testsuite/gcc.dg/torture/pr59715.c b/gcc/testsuite/gcc.dg/torture/pr59715.c new file mode 100644 index 000000000000..19c09de55d7e --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr59715.c @@ -0,0 +1,21 @@ +/* { dg-do run } */ + +extern void abort (void); + +int a = 2, b; + +int +main () +{ + int c; + if (!b) + { + b = a; + c = a == 0 ? 1 : 1 % a; + if (c) + b = 0; + } + if (b != 0) + abort (); + return 0; +} diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index c4a1ffa4ef3f..cfdf7aa4dcef 100644 --- a/gcc/tree-cfg.c +++ b/gcc/tree-cfg.c @@ -109,7 +109,6 @@ static int locus_map_eq (const void *, const void *); static void assign_discriminator (location_t, basic_block); static edge gimple_redirect_edge_and_branch (edge, basic_block); static edge gimple_try_redirect_by_replacing_jump (edge, basic_block); -static unsigned int split_critical_edges (void); /* Various helpers. */ static inline bool stmt_starts_bb_p (gimple, gimple); @@ -7399,7 +7398,7 @@ struct cfg_hooks gimple_cfg_hooks = { /* Split all critical edges. */ -static unsigned int +unsigned int split_critical_edges (void) { basic_block bb; diff --git a/gcc/tree-ssa-dce.c b/gcc/tree-ssa-dce.c index d99e77130d42..bb1ef08ece87 100644 --- a/gcc/tree-ssa-dce.c +++ b/gcc/tree-ssa-dce.c @@ -1310,26 +1310,19 @@ eliminate_unnecessary_stmts (void) stats.total++; /* We can mark a call to free as not necessary if the - defining statement of its argument is an allocation - function and that is not necessary itself. */ - if (gimple_call_builtin_p (stmt, BUILT_IN_FREE)) + defining statement of its argument is not necessary + (and thus is getting removed). */ + if (gimple_plf (stmt, STMT_NECESSARY) + && gimple_call_builtin_p (stmt, BUILT_IN_FREE)) { tree ptr = gimple_call_arg (stmt, 0); - tree callee2; - gimple def_stmt; - if (TREE_CODE (ptr) != SSA_NAME) - continue; - def_stmt = SSA_NAME_DEF_STMT (ptr); - if (!is_gimple_call (def_stmt) - || gimple_plf (def_stmt, STMT_NECESSARY)) - continue; - callee2 = gimple_call_fndecl (def_stmt); - if (callee2 == NULL_TREE - || DECL_BUILT_IN_CLASS (callee2) != BUILT_IN_NORMAL - || (DECL_FUNCTION_CODE (callee2) != BUILT_IN_MALLOC - && DECL_FUNCTION_CODE (callee2) != BUILT_IN_CALLOC)) - continue; - gimple_set_plf (stmt, STMT_NECESSARY, false); + if (TREE_CODE (ptr) == SSA_NAME) + { + gimple def_stmt = SSA_NAME_DEF_STMT (ptr); + if (!gimple_nop_p (def_stmt) + && !gimple_plf (def_stmt, STMT_NECESSARY)) + gimple_set_plf (stmt, STMT_NECESSARY, false); + } } /* If GSI is not necessary then remove it. */ diff --git a/gcc/tree-ssa-sink.c b/gcc/tree-ssa-sink.c index 19cacfc56eaa..0222dac1a4a7 100644 --- a/gcc/tree-ssa-sink.c +++ b/gcc/tree-ssa-sink.c @@ -636,7 +636,7 @@ static void execute_sink_code (void) { loop_optimizer_init (LOOPS_NORMAL); - + split_critical_edges (); connect_infinite_loops_to_exit (); memset (&sink_stats, 0, sizeof (sink_stats)); calculate_dominance_info (CDI_DOMINATORS);