diff options
author | rakdver <rakdver@138bc75d-0d04-0410-961f-82ee72b054a4> | 2006-12-20 14:15:53 +0000 |
---|---|---|
committer | rakdver <rakdver@138bc75d-0d04-0410-961f-82ee72b054a4> | 2006-12-20 14:15:53 +0000 |
commit | f3c40e6dbeefd9efe87c6919805b669e3eb8b223 (patch) | |
tree | c833734dce382efda016f8ef594a2fe91177e6ef | |
parent | e99f512dc08a5c316088d2df0d19665bcfd8b42e (diff) | |
download | gcc-f3c40e6dbeefd9efe87c6919805b669e3eb8b223.tar.gz |
* loop-unswitch.c (unswitch_loop): Update arguments of
duplicate_loop_to_header_edge call.
* tree-ssa-loop-ivcanon.c (try_unroll_loop_completely): Ditto.
* loop-unroll.c (peel_loop_completely, unroll_loop_constant_iterations,
unroll_loop_runtime_iterations, peel_loop_simple, unroll_loop_stupid):
Ditto.
* cfgloopmanip.c (loop_version): Ditto.
(duplicate_loop_to_header_edge): Change
type of to_remove to VEC(edge), remove n_to_remove argument.
* tree-ssa-loop-manip.c (tree_duplicate_loop_to_header_edge):
Change type of to_remove to VEC(edge), remove n_to_remove argument.
(tree_unroll_loop): Update arguments of
tree_duplicate_loop_to_header_edge call.
* cfghooks.c (cfg_hook_duplicate_loop_to_header_edge):
Change type of to_remove to VEC(edge), remove n_to_remove argument.
* cfghooks.h (struct cfg_hooks): Type of
cfg_hook_duplicate_loop_to_header_edge changed.
(cfg_hook_duplicate_loop_to_header_edge): Declaration changed.
* cfgloop.h (duplicate_loop_to_header_edge): Ditto.
* tree-flow.h (tree_duplicate_loop_to_header_edge): Ditto.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@120074 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 23 | ||||
-rw-r--r-- | gcc/cfghooks.c | 6 | ||||
-rw-r--r-- | gcc/cfghooks.h | 14 | ||||
-rw-r--r-- | gcc/cfgloop.h | 4 | ||||
-rw-r--r-- | gcc/cfgloopmanip.c | 23 | ||||
-rw-r--r-- | gcc/loop-unroll.c | 61 | ||||
-rw-r--r-- | gcc/loop-unswitch.c | 9 | ||||
-rw-r--r-- | gcc/tree-flow.h | 4 | ||||
-rw-r--r-- | gcc/tree-ssa-loop-ivcanon.c | 7 | ||||
-rw-r--r-- | gcc/tree-ssa-loop-manip.c | 8 |
10 files changed, 88 insertions, 71 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 611093f2b74..f991a4d066d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,26 @@ +2006-12-20 Zdenek Dvorak <dvorakz@suse.cz> + + * loop-unswitch.c (unswitch_loop): Update arguments of + duplicate_loop_to_header_edge call. + * tree-ssa-loop-ivcanon.c (try_unroll_loop_completely): Ditto. + * loop-unroll.c (peel_loop_completely, unroll_loop_constant_iterations, + unroll_loop_runtime_iterations, peel_loop_simple, unroll_loop_stupid): + Ditto. + * cfgloopmanip.c (loop_version): Ditto. + (duplicate_loop_to_header_edge): Change + type of to_remove to VEC(edge), remove n_to_remove argument. + * tree-ssa-loop-manip.c (tree_duplicate_loop_to_header_edge): + Change type of to_remove to VEC(edge), remove n_to_remove argument. + (tree_unroll_loop): Update arguments of + tree_duplicate_loop_to_header_edge call. + * cfghooks.c (cfg_hook_duplicate_loop_to_header_edge): + Change type of to_remove to VEC(edge), remove n_to_remove argument. + * cfghooks.h (struct cfg_hooks): Type of + cfg_hook_duplicate_loop_to_header_edge changed. + (cfg_hook_duplicate_loop_to_header_edge): Declaration changed. + * cfgloop.h (duplicate_loop_to_header_edge): Ditto. + * tree-flow.h (tree_duplicate_loop_to_header_edge): Ditto. + 2006-12-20 Dorit Nuzman <dorit@il.ibm.com> * config/spu/spu.md (vec_widen_umult_hi_v8hi): New. diff --git a/gcc/cfghooks.c b/gcc/cfghooks.c index 89df3e54ea3..50aca9f1b69 100644 --- a/gcc/cfghooks.c +++ b/gcc/cfghooks.c @@ -939,14 +939,14 @@ bool cfg_hook_duplicate_loop_to_header_edge (struct loop *loop, edge e, unsigned int ndupl, sbitmap wont_exit, edge orig, - edge *to_remove, - unsigned int *n_to_remove, int flags) + VEC (edge, heap) **to_remove, + int flags) { gcc_assert (cfg_hooks->cfg_hook_duplicate_loop_to_header_edge); return cfg_hooks->cfg_hook_duplicate_loop_to_header_edge (loop, e, ndupl, wont_exit, orig, to_remove, - n_to_remove, flags); + flags); } /* Conditional jumps are represented differently in trees and RTL, diff --git a/gcc/cfghooks.h b/gcc/cfghooks.h index 008072df3f1..fb6264df703 100644 --- a/gcc/cfghooks.h +++ b/gcc/cfghooks.h @@ -111,12 +111,10 @@ struct cfg_hooks /* A hook for duplicating loop in CFG, currently this is used in loop versioning. */ - bool (*cfg_hook_duplicate_loop_to_header_edge) (struct loop *loop, edge e, - unsigned int ndupl, - sbitmap wont_exit, - edge orig, edge *to_remove, - unsigned int *n_to_remove, - int flags); + bool (*cfg_hook_duplicate_loop_to_header_edge) (struct loop *, edge, + unsigned, sbitmap, + edge, VEC (edge, heap) **, + int); /* Add condition to new basic block and update CFG used in loop versioning. */ @@ -165,8 +163,8 @@ extern void execute_on_shrinking_pred (edge); extern bool cfg_hook_duplicate_loop_to_header_edge (struct loop *loop, edge, unsigned int ndupl, sbitmap wont_exit, - edge orig, edge *to_remove, - unsigned int *n_to_remove, + edge orig, + VEC (edge, heap) **to_remove, int flags); extern void lv_flush_pending_stmts (edge); diff --git a/gcc/cfgloop.h b/gcc/cfgloop.h index 4a13a6ac06b..aa12dbf3ed0 100644 --- a/gcc/cfgloop.h +++ b/gcc/cfgloop.h @@ -251,8 +251,8 @@ extern bool can_duplicate_loop_p (struct loop *loop); extern struct loop * duplicate_loop (struct loop *, struct loop *); extern bool duplicate_loop_to_header_edge (struct loop *, edge, - unsigned, sbitmap, edge, edge *, - unsigned *, int); + unsigned, sbitmap, edge, + VEC (edge, heap) **, int); extern struct loop *loopify (edge, edge, basic_block, edge, edge, bool); struct loop * loop_version (struct loop *, void *, diff --git a/gcc/cfgloopmanip.c b/gcc/cfgloopmanip.c index 83d4e4c0e13..9021fbafd4e 100644 --- a/gcc/cfgloopmanip.c +++ b/gcc/cfgloopmanip.c @@ -814,11 +814,12 @@ update_single_exit_for_duplicated_loops (struct loop *orig_loops[], unsigned n) original LOOP body, the other copies are numbered in order given by control flow through them) into TO_REMOVE array. Returns false if duplication is impossible. */ + bool duplicate_loop_to_header_edge (struct loop *loop, edge e, unsigned int ndupl, sbitmap wont_exit, - edge orig, edge *to_remove, - unsigned int *n_to_remove, int flags) + edge orig, VEC (edge, heap) **to_remove, + int flags) { struct loop *target, *aloop; struct loop **orig_loops; @@ -966,10 +967,6 @@ duplicate_loop_to_header_edge (struct loop *loop, edge e, if (current_loops->state & LOOPS_HAVE_MARKED_SINGLE_EXITS) update_single_exits_after_duplication (bbs, n, target); - /* Record exit edge in original loop body. */ - if (orig && TEST_BIT (wont_exit, 0)) - to_remove[(*n_to_remove)++] = orig; - spec_edges[SE_ORIG] = orig; spec_edges[SE_LATCH] = latch_edge; @@ -1043,7 +1040,10 @@ duplicate_loop_to_header_edge (struct loop *loop, edge e, /* Record exit edge in this copy. */ if (orig && TEST_BIT (wont_exit, j + 1)) - to_remove[(*n_to_remove)++] = new_spec_edges[SE_ORIG]; + { + if (to_remove) + VEC_safe_push (edge, heap, *to_remove, new_spec_edges[SE_ORIG]); + } /* Record the first copy in the control flow order if it is not the original loop (i.e. in case of peeling). */ @@ -1063,6 +1063,13 @@ duplicate_loop_to_header_edge (struct loop *loop, edge e, free (new_bbs); free (orig_loops); + /* Record the exit edge in the original loop body, and update the frequencies. */ + if (orig && TEST_BIT (wont_exit, 0)) + { + if (to_remove) + VEC_safe_push (edge, heap, *to_remove, orig); + } + /* Update the original loop. */ if (!is_latch) set_immediate_dominator (CDI_DOMINATORS, e->dest, e->src); @@ -1302,7 +1309,7 @@ loop_version (struct loop *loop, /* Duplicate loop. */ if (!cfg_hook_duplicate_loop_to_header_edge (loop, entry, 1, - NULL, NULL, NULL, NULL, 0)) + NULL, NULL, NULL, 0)) return NULL; /* After duplication entry edge now points to new loop head block. diff --git a/gcc/loop-unroll.c b/gcc/loop-unroll.c index 3a79dcca943..63eebed3183 100644 --- a/gcc/loop-unroll.c +++ b/gcc/loop-unroll.c @@ -446,8 +446,9 @@ peel_loop_completely (struct loop *loop) { sbitmap wont_exit; unsigned HOST_WIDE_INT npeel; - unsigned n_remove_edges, i; - edge *remove_edges, ein; + unsigned i; + VEC (edge, heap) *remove_edges; + edge ein; struct niter_desc *desc = get_simple_loop_desc (loop); struct opt_info *opt_info = NULL; @@ -463,8 +464,7 @@ peel_loop_completely (struct loop *loop) if (desc->noloop_assumptions) RESET_BIT (wont_exit, 1); - remove_edges = XCNEWVEC (edge, npeel); - n_remove_edges = 0; + remove_edges = NULL; if (flag_split_ivs_in_unroller) opt_info = analyze_insns_in_loop (loop); @@ -473,7 +473,7 @@ peel_loop_completely (struct loop *loop) ok = duplicate_loop_to_header_edge (loop, loop_preheader_edge (loop), npeel, wont_exit, desc->out_edge, - remove_edges, &n_remove_edges, + &remove_edges, DLTHE_FLAG_UPDATE_FREQ | DLTHE_FLAG_COMPLETTE_PEEL | (opt_info @@ -489,9 +489,9 @@ peel_loop_completely (struct loop *loop) } /* Remove the exit edges. */ - for (i = 0; i < n_remove_edges; i++) - remove_path (remove_edges[i]); - free (remove_edges); + for (i = 0; VEC_iterate (edge, remove_edges, i, ein); i++) + remove_path (ein); + VEC_free (edge, heap, remove_edges); } ein = desc->in_edge; @@ -630,8 +630,9 @@ unroll_loop_constant_iterations (struct loop *loop) unsigned HOST_WIDE_INT niter; unsigned exit_mod; sbitmap wont_exit; - unsigned n_remove_edges, i; - edge *remove_edges; + unsigned i; + VEC (edge, heap) *remove_edges; + edge e; unsigned max_unroll = loop->lpt_decision.times; struct niter_desc *desc = get_simple_loop_desc (loop); bool exit_at_end = loop_exit_at_end_p (loop); @@ -648,8 +649,7 @@ unroll_loop_constant_iterations (struct loop *loop) wont_exit = sbitmap_alloc (max_unroll + 1); sbitmap_ones (wont_exit); - remove_edges = XCNEWVEC (edge, max_unroll + exit_mod + 1); - n_remove_edges = 0; + remove_edges = NULL; if (flag_split_ivs_in_unroller || flag_variable_expansion_in_unroller) opt_info = analyze_insns_in_loop (loop); @@ -674,7 +674,7 @@ unroll_loop_constant_iterations (struct loop *loop) ok = duplicate_loop_to_header_edge (loop, loop_preheader_edge (loop), exit_mod, wont_exit, desc->out_edge, - remove_edges, &n_remove_edges, + &remove_edges, DLTHE_FLAG_UPDATE_FREQ | (opt_info && exit_mod > 1 ? DLTHE_RECORD_COPY_NUMBER @@ -713,7 +713,7 @@ unroll_loop_constant_iterations (struct loop *loop) ok = duplicate_loop_to_header_edge (loop, loop_preheader_edge (loop), exit_mod + 1, wont_exit, desc->out_edge, - remove_edges, &n_remove_edges, + &remove_edges, DLTHE_FLAG_UPDATE_FREQ | (opt_info && exit_mod > 0 ? DLTHE_RECORD_COPY_NUMBER @@ -740,7 +740,7 @@ unroll_loop_constant_iterations (struct loop *loop) ok = duplicate_loop_to_header_edge (loop, loop_latch_edge (loop), max_unroll, wont_exit, desc->out_edge, - remove_edges, &n_remove_edges, + &remove_edges, DLTHE_FLAG_UPDATE_FREQ | (opt_info ? DLTHE_RECORD_COPY_NUMBER @@ -777,9 +777,9 @@ unroll_loop_constant_iterations (struct loop *loop) desc->niter_expr = GEN_INT (desc->niter); /* Remove the edges. */ - for (i = 0; i < n_remove_edges; i++) - remove_path (remove_edges[i]); - free (remove_edges); + for (i = 0; VEC_iterate (edge, remove_edges, i, e); i++) + remove_path (e); + VEC_free (edge, heap, remove_edges); if (dump_file) fprintf (dump_file, @@ -923,8 +923,9 @@ unroll_loop_runtime_iterations (struct loop *loop) unsigned n_dom_bbs; sbitmap wont_exit; int may_exit_copy; - unsigned n_peel, n_remove_edges; - edge *remove_edges, e; + unsigned n_peel; + VEC (edge, heap) *remove_edges; + edge e; bool extra_zero_check, last_may_exit; unsigned max_unroll = loop->lpt_decision.times; struct niter_desc *desc = get_simple_loop_desc (loop); @@ -995,8 +996,7 @@ unroll_loop_runtime_iterations (struct loop *loop) /* Precondition the loop. */ split_edge_and_insert (loop_preheader_edge (loop), init_code); - remove_edges = XCNEWVEC (edge, max_unroll + n_peel + 1); - n_remove_edges = 0; + remove_edges = NULL; wont_exit = sbitmap_alloc (max_unroll + 2); @@ -1011,7 +1011,7 @@ unroll_loop_runtime_iterations (struct loop *loop) ezc_swtch = loop_preheader_edge (loop)->src; ok = duplicate_loop_to_header_edge (loop, loop_preheader_edge (loop), 1, wont_exit, desc->out_edge, - remove_edges, &n_remove_edges, + &remove_edges, DLTHE_FLAG_UPDATE_FREQ); gcc_assert (ok); @@ -1026,7 +1026,7 @@ unroll_loop_runtime_iterations (struct loop *loop) SET_BIT (wont_exit, 1); ok = duplicate_loop_to_header_edge (loop, loop_preheader_edge (loop), 1, wont_exit, desc->out_edge, - remove_edges, &n_remove_edges, + &remove_edges, DLTHE_FLAG_UPDATE_FREQ); gcc_assert (ok); @@ -1082,7 +1082,7 @@ unroll_loop_runtime_iterations (struct loop *loop) ok = duplicate_loop_to_header_edge (loop, loop_latch_edge (loop), max_unroll, wont_exit, desc->out_edge, - remove_edges, &n_remove_edges, + &remove_edges, DLTHE_FLAG_UPDATE_FREQ | (opt_info ? DLTHE_RECORD_COPY_NUMBER @@ -1116,9 +1116,9 @@ unroll_loop_runtime_iterations (struct loop *loop) } /* Remove the edges. */ - for (i = 0; i < n_remove_edges; i++) - remove_path (remove_edges[i]); - free (remove_edges); + for (i = 0; VEC_iterate (edge, remove_edges, i, e); i++) + remove_path (e); + VEC_free (edge, heap, remove_edges); /* We must be careful when updating the number of iterations due to preconditioning and the fact that the value must be valid at entry @@ -1264,8 +1264,7 @@ peel_loop_simple (struct loop *loop) opt_info_start_duplication (opt_info); ok = duplicate_loop_to_header_edge (loop, loop_preheader_edge (loop), - npeel, wont_exit, - NULL, NULL, + npeel, wont_exit, NULL, NULL, DLTHE_FLAG_UPDATE_FREQ | (opt_info ? DLTHE_RECORD_COPY_NUMBER @@ -1416,7 +1415,7 @@ unroll_loop_stupid (struct loop *loop) ok = duplicate_loop_to_header_edge (loop, loop_latch_edge (loop), nunroll, wont_exit, - NULL, NULL, NULL, + NULL, NULL, DLTHE_FLAG_UPDATE_FREQ | (opt_info ? DLTHE_RECORD_COPY_NUMBER diff --git a/gcc/loop-unswitch.c b/gcc/loop-unswitch.c index 82cf1eaeeeb..38706d174d8 100644 --- a/gcc/loop-unswitch.c +++ b/gcc/loop-unswitch.c @@ -410,14 +410,9 @@ unswitch_loop (struct loop *loop, basic_block unswitch_on, rtx cond, rtx cinsn) irred_flag = entry->flags & EDGE_IRREDUCIBLE_LOOP; entry->flags &= ~EDGE_IRREDUCIBLE_LOOP; zero_bitmap = sbitmap_alloc (2); - sbitmap_zero (zero_bitmap); if (!duplicate_loop_to_header_edge (loop, entry, 1, - zero_bitmap, NULL, NULL, NULL, 0)) - { - sbitmap_free (zero_bitmap); - return NULL; - } - sbitmap_free (zero_bitmap); + NULL, NULL, NULL, 0)) + return NULL; entry->flags |= irred_flag; /* Record the block with condition we unswitch on. */ diff --git a/gcc/tree-flow.h b/gcc/tree-flow.h index a85d732aa7d..5f63ba93b01 100644 --- a/gcc/tree-flow.h +++ b/gcc/tree-flow.h @@ -882,8 +882,8 @@ basic_block ip_end_pos (struct loop *); basic_block ip_normal_pos (struct loop *); bool tree_duplicate_loop_to_header_edge (struct loop *, edge, unsigned int, sbitmap, - edge, edge *, - unsigned int *, int); + edge, VEC (edge, heap) **, + int); struct loop *tree_ssa_loop_version (struct loop *, tree, basic_block *); tree expand_simple_operations (tree); diff --git a/gcc/tree-ssa-loop-ivcanon.c b/gcc/tree-ssa-loop-ivcanon.c index c26727a808d..fa92a689809 100644 --- a/gcc/tree-ssa-loop-ivcanon.c +++ b/gcc/tree-ssa-loop-ivcanon.c @@ -223,8 +223,6 @@ try_unroll_loop_completely (struct loop *loop, if (n_unroll) { sbitmap wont_exit; - edge *edges_to_remove = XNEWVEC (edge, n_unroll); - unsigned int n_to_remove = 0; old_cond = COND_EXPR_COND (cond); COND_EXPR_COND (cond) = dont_exit; @@ -237,8 +235,7 @@ try_unroll_loop_completely (struct loop *loop, if (!tree_duplicate_loop_to_header_edge (loop, loop_preheader_edge (loop), n_unroll, wont_exit, - exit, edges_to_remove, - &n_to_remove, + exit, NULL, DLTHE_FLAG_UPDATE_FREQ | DLTHE_FLAG_COMPLETTE_PEEL)) { @@ -246,11 +243,9 @@ try_unroll_loop_completely (struct loop *loop, update_stmt (cond); free_original_copy_tables (); free (wont_exit); - free (edges_to_remove); return false; } free (wont_exit); - free (edges_to_remove); free_original_copy_tables (); } diff --git a/gcc/tree-ssa-loop-manip.c b/gcc/tree-ssa-loop-manip.c index 22e5847b2f3..e68ca555166 100644 --- a/gcc/tree-ssa-loop-manip.c +++ b/gcc/tree-ssa-loop-manip.c @@ -562,8 +562,8 @@ copy_phi_node_args (unsigned first_new_block) bool tree_duplicate_loop_to_header_edge (struct loop *loop, edge e, unsigned int ndupl, sbitmap wont_exit, - edge orig, edge *to_remove, - unsigned int *n_to_remove, int flags) + edge orig, VEC (edge, heap) **to_remove, + int flags) { unsigned first_new_block; @@ -578,7 +578,7 @@ tree_duplicate_loop_to_header_edge (struct loop *loop, edge e, first_new_block = last_basic_block; if (!duplicate_loop_to_header_edge (loop, e, ndupl, wont_exit, - orig, to_remove, n_to_remove, flags)) + orig, to_remove, flags)) return false; /* Readd the removed phi args for e. */ @@ -853,7 +853,7 @@ tree_unroll_loop (struct loop *loop, unsigned factor, sbitmap_ones (wont_exit); ok = tree_duplicate_loop_to_header_edge (loop, loop_latch_edge (loop), factor - 1, - wont_exit, NULL, NULL, NULL, DLTHE_FLAG_UPDATE_FREQ); + wont_exit, exit, NULL, DLTHE_FLAG_UPDATE_FREQ); free (wont_exit); gcc_assert (ok); update_ssa (TODO_update_ssa); |