From ac70caaded6c0f5df39f9bd7e2ed9c7f82a8dbd4 Mon Sep 17 00:00:00 2001 From: bonzini Date: Wed, 11 Jan 2006 13:02:18 +0000 Subject: gcc: 2006-01-11 Paolo Bonzini PR tree-optimization/23109 PR tree-optimization/23948 PR tree-optimization/24123 * Makefile.in (tree-ssa-math-opts.o): Adjust dependencies. * tree-cfg.c (single_noncomplex_succ): New. * tree-flow.h (single_noncomplex_succ): Declare it. * tree-ssa-math-opts.c (enum place_reciprocal): Remove. * tree-ssa-math-opts.c (enum place_reciprocal): Remove. (struct occurrence, occ_head, occ_pool, is_divide_by, compute_merit, insert_bb, register_division_in, insert_reciprocals, replace_reciprocal, free_bb): New. (execute_cse_reciprocals_1): Rewritten. (execute_cse_reciprocals): Adjust calls to execute_cse_reciprocals_1. Do not commit any edge insertion. Always compute dominators and create the allocation pool. * target-def.h (TARGET_MIN_DIVISIONS_FOR_RECIP_MUL): New. * target.h (struct gcc_target): Add min_divistions_for_recip_mul. * targhooks.c (default_min_divistions_for_recip_mul): New. * targhooks.h (default_min_divistions_for_recip_mul): New prototype. * passes.c (init_optimization_passes): Run recip after tree loop optimizations. * doc/tm.texi (Misc): Document TARGET_MIN_DIVISIONS_FOR_RECIP_MUL. gcc/testsuite: 2006-01-11 Paolo Bonzini PR tree-optimization/23109 PR tree-optimization/23948 PR tree-optimization/24123 * gcc.dg/tree-ssa/recip-3.c, gcc.dg/tree-ssa/recip-4.c, gcc.dg/tree-ssa/recip-5.c, gcc.dg/tree-ssa/recip-6.c, gcc.dg/tree-ssa/recip-7.c, gcc.dg/tree-ssa/pr23109.c, g++.dg/tree-ssa/pr23948.C: New testcases. * gcc.dg/tree-ssa/recip-2.c, gcc.dg/tree-ssa/pr23234.c: Provide three divisions in order to do the optimization. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@109578 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/tree-cfg.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) (limited to 'gcc/tree-cfg.c') diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index 342b9d2fdb1..40a29bc7c2e 100644 --- a/gcc/tree-cfg.c +++ b/gcc/tree-cfg.c @@ -1389,6 +1389,30 @@ tree_merge_blocks (basic_block a, basic_block b) } +/* Return the one of two successors of BB that is not reachable by a + reached by a complex edge, if there is one. Else, return BB. We use + this in optimizations that use post-dominators for their heuristics, + to catch the cases in C++ where function calls are involved. */ + +basic_block +single_noncomplex_succ (basic_block bb) +{ + edge e0, e1; + if (EDGE_COUNT (bb->succs) != 2) + return bb; + + e0 = EDGE_SUCC (bb, 0); + e1 = EDGE_SUCC (bb, 1); + if (e0->flags & EDGE_COMPLEX) + return e1->dest; + if (e1->flags & EDGE_COMPLEX) + return e0->dest; + + return bb; +} + + + /* Walk the function tree removing unnecessary statements. * Empty statement nodes are removed -- cgit v1.2.1