diff options
author | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2016-04-19 13:22:19 +0000 |
---|---|---|
committer | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2016-04-19 13:22:19 +0000 |
commit | 222ac318d49974b3b321309faf83f5590746df19 (patch) | |
tree | c229c8622615d24353d0e083b34905437310e60f | |
parent | 65e1720ff62bed1bffa43d3495ef7df4b3bf2a11 (diff) | |
download | gcc-222ac318d49974b3b321309faf83f5590746df19.tar.gz |
2016-04-19 Richard Biener <rguenther@suse.de>
PR tree-optimization/70724
* tree-ssa-sccvn.c (scc_vn_restore_ssa_info): Split SSA info
restoring out from ...
(free_scc_vn): ... here.
* tree-ssa-sccvn.h (scc_vn_restore_ssa_info): Declare.
* tres-ssa-pre.c (pass_pre::execute): Restore SSA info before
tail merging.
(pass_fre::execute): Restore SSA info.
* gcc.dg/torture/pr70724.c: New testcase.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@235203 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr70724.c | 39 | ||||
-rw-r--r-- | gcc/tree-ssa-pre.c | 4 | ||||
-rw-r--r-- | gcc/tree-ssa-sccvn.c | 39 | ||||
-rw-r--r-- | gcc/tree-ssa-sccvn.h | 1 |
6 files changed, 87 insertions, 12 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 39bbca2e1c8..6c338f7d5bc 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,16 @@ 2016-04-19 Richard Biener <rguenther@suse.de> + PR tree-optimization/70724 + * tree-ssa-sccvn.c (scc_vn_restore_ssa_info): Split SSA info + restoring out from ... + (free_scc_vn): ... here. + * tree-ssa-sccvn.h (scc_vn_restore_ssa_info): Declare. + * tres-ssa-pre.c (pass_pre::execute): Restore SSA info before + tail merging. + (pass_fre::execute): Restore SSA info. + +2016-04-19 Richard Biener <rguenther@suse.de> + * gimple-walk.h (struct walk_stmt_info): Add stmt member. * gimple-walk.c (walk_gimple_op): Initialize it. (walk_gimple_asm): Set wi->is_lhs before each callback invocation. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e6bd4062f21..da83d7e74df 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-04-19 Richard Biener <rguenther@suse.de> + + PR tree-optimization/70724 + * gcc.dg/torture/pr70724.c: New testcase. + 2016-04-18 Vladimir Makarov <vmakarov@redhat.com> PR middle-end/70689 diff --git a/gcc/testsuite/gcc.dg/torture/pr70724.c b/gcc/testsuite/gcc.dg/torture/pr70724.c new file mode 100644 index 00000000000..d4cffb38ab1 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr70724.c @@ -0,0 +1,39 @@ +/* { dg-do run } */ +/* { dg-additional-options "-ftracer" } */ + +extern void abort (void); + +typedef long int _PyTime_t; +typedef enum { _PyTime_ROUND_FLOOR = 0, _PyTime_ROUND_CEILING = 1 } + _PyTime_round_t; + +static _PyTime_t +_PyTime_Divide(const _PyTime_t t, const _PyTime_t k, + const _PyTime_round_t round) +{ + if (round == _PyTime_ROUND_CEILING) { + if (t >= 0) + return (t + k - 1) / k; + else + return t / k; + } + else { + if (t >= 0) + return t / k; + else + return (t - (k - 1)) / k; + } +} + +_PyTime_t __attribute__((noinline,noclone)) +_PyTime_AsMicroseconds(_PyTime_t t, _PyTime_round_t round) +{ + return _PyTime_Divide(t, 1000, round); +} + +int main() +{ + if (_PyTime_AsMicroseconds (10000, _PyTime_ROUND_FLOOR) != 10) + abort (); + return 0; +} diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c index c0e3b807c05..2d1eb70c03b 100644 --- a/gcc/tree-ssa-pre.c +++ b/gcc/tree-ssa-pre.c @@ -4804,6 +4804,9 @@ pass_pre::execute (function *fun) todo |= fini_eliminate (); loop_optimizer_finalize (); + /* Restore SSA info before tail-merging as that resets it as well. */ + scc_vn_restore_ssa_info (); + /* TODO: tail_merge_optimize may merge all predecessors of a block, in which case we can merge the block with the remaining predecessor of the block. It should either: @@ -4877,6 +4880,7 @@ pass_fre::execute (function *fun) todo |= fini_eliminate (); + scc_vn_restore_ssa_info (); free_scc_vn (); statistics_counter_event (fun, "Insertions", pre_stats.insertions); diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c index e61e03334af..f6735dd3089 100644 --- a/gcc/tree-ssa-sccvn.c +++ b/gcc/tree-ssa-sccvn.c @@ -4306,26 +4306,19 @@ init_scc_vn (void) } } +/* Restore SSA info that has been reset on value leaders. */ + void -free_scc_vn (void) +scc_vn_restore_ssa_info (void) { - size_t i; - - delete constant_to_value_id; - constant_to_value_id = NULL; - BITMAP_FREE (constant_value_ids); - shared_lookup_phiargs.release (); - shared_lookup_references.release (); - XDELETEVEC (rpo_numbers); - - for (i = 0; i < num_ssa_names; i++) + for (unsigned i = 0; i < num_ssa_names; i++) { tree name = ssa_name (i); if (name && has_VN_INFO (name)) { if (VN_INFO (name)->needs_insertion) - release_ssa_name (name); + ; else if (POINTER_TYPE_P (TREE_TYPE (name)) && VN_INFO (name)->info.ptr_info) SSA_NAME_PTR_INFO (name) = VN_INFO (name)->info.ptr_info; @@ -4338,6 +4331,28 @@ free_scc_vn (void) } } } +} + +void +free_scc_vn (void) +{ + size_t i; + + delete constant_to_value_id; + constant_to_value_id = NULL; + BITMAP_FREE (constant_value_ids); + shared_lookup_phiargs.release (); + shared_lookup_references.release (); + XDELETEVEC (rpo_numbers); + + for (i = 0; i < num_ssa_names; i++) + { + tree name = ssa_name (i); + if (name + && has_VN_INFO (name) + && VN_INFO (name)->needs_insertion) + release_ssa_name (name); + } obstack_free (&vn_ssa_aux_obstack, NULL); vn_ssa_aux_table.release (); diff --git a/gcc/tree-ssa-sccvn.h b/gcc/tree-ssa-sccvn.h index a3f9fa26ad3..1f6af4043fa 100644 --- a/gcc/tree-ssa-sccvn.h +++ b/gcc/tree-ssa-sccvn.h @@ -204,6 +204,7 @@ extern vn_ssa_aux_t VN_INFO_GET (tree); tree vn_get_expr_for (tree); bool run_scc_vn (vn_lookup_kind); void free_scc_vn (void); +void scc_vn_restore_ssa_info (void); tree vn_nary_op_lookup (tree, vn_nary_op_t *); tree vn_nary_op_lookup_stmt (gimple *, vn_nary_op_t *); tree vn_nary_op_lookup_pieces (unsigned int, enum tree_code, |