Commit bf45c4c0 by Jan Hubicka Committed by Jan Hubicka

cfgloopmanip.c (copy_loop_info): New function.

	* cfgloopmanip.c (copy_loop_info): New function.
	(duplicate_loop): Use it.
	(loop_version): Use it.
	* loop-unswitch.c (unswitch_loop): Use it.
	* cfgloop.h (copy_loop_info): Declare.

From-SVN: r192543
parent b7442c2f
2012-10-17 Jan Hubicka <jh@suse.cz>
* cfgloopmanip.c (copy_loop_info): New function.
(duplicate_loop): Use it.
(loop_version): Use it.
* loop-unswitch.c (unswitch_loop): Use it.
* cfgloop.h (copy_loop_info): Declare.
2012-10-17 Jan Hubicka <jh@suse.cz>
* tree-ssa-loop-ivcanon.c (tree_estimate_loop_size): Add edge_to_cancel
parameter and use it to estimate code optimized out in the final iteration.
(loop_edge_to_cancel): New function.
......@@ -310,6 +310,7 @@ extern edge create_empty_if_region_on_edge (edge, tree);
extern struct loop *create_empty_loop_on_edge (edge, tree, tree, tree, tree,
tree *, tree *, struct loop *);
extern struct loop * duplicate_loop (struct loop *, struct loop *);
extern void copy_loop_info (struct loop *loop, struct loop *target);
extern void duplicate_subloops (struct loop *, struct loop *);
extern bool duplicate_loop_to_header_edge (struct loop *, edge,
unsigned, sbitmap, edge,
......
......@@ -970,6 +970,20 @@ fix_loop_placements (struct loop *loop, bool *irred_invalidated)
}
}
/* Duplicate loop bounds and other information we store about
the loop into its duplicate. */
void
copy_loop_info (struct loop *loop, struct loop *target)
{
gcc_checking_assert (!target->any_upper_bound && !target->any_estimate);
target->any_upper_bound = loop->any_upper_bound;
target->nb_iterations_upper_bound = loop->nb_iterations_upper_bound;
target->any_estimate = loop->any_estimate;
target->nb_iterations_estimate = loop->nb_iterations_estimate;
target->estimate_state = loop->estimate_state;
}
/* Copies copy of LOOP as subloop of TARGET loop, placing newly
created loop into loops structure. */
struct loop *
......@@ -978,6 +992,8 @@ duplicate_loop (struct loop *loop, struct loop *target)
struct loop *cloop;
cloop = alloc_loop ();
place_new_loop (cloop);
copy_loop_info (loop, cloop);
/* Mark the new loop as copy of LOOP. */
set_loop_copy (loop, cloop);
......@@ -1686,6 +1702,8 @@ loop_version (struct loop *loop,
false /* Do not redirect all edges. */,
then_scale, else_scale);
copy_loop_info (loop, nloop);
/* loopify redirected latch_edge. Update its PENDING_STMTS. */
lv_flush_pending_stmts (latch_edge);
......
......@@ -454,6 +454,7 @@ unswitch_loop (struct loop *loop, basic_block unswitch_on, rtx cond, rtx cinsn)
BRANCH_EDGE (switch_bb), FALLTHRU_EDGE (switch_bb), true,
prob, REG_BR_PROB_BASE - prob);
copy_loop_info (loop, nloop);
/* Remove branches that are now unreachable in new loops. */
remove_path (true_edge);
remove_path (false_edge);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment