Message ID | 20121016153612.GA25204@kam.mff.cuni.cz |
---|---|
State | New |
Headers | show |
On Tue, 16 Oct 2012, Jan Hubicka wrote: > Hi, > while looking into cases where loop-iv.c still deduce useful bounds that are not > recorded by tree level I noticed that we do not duplicate the bounds when copying > the loop. > Fixed thus. > Bootstrapped/regtested x86_64-linux, OK? Ok. Thanks, Richard. > Honza > > * 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. > Index: cfgloopmanip.c > =================================================================== > --- cfgloopmanip.c (revision 192483) > +++ cfgloopmanip.c (working copy) > @@ -971,6 +970,20 @@ fix_loop_placements (struct loop *loop, > } > } > > +/* 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 * > @@ -979,6 +992,8 @@ duplicate_loop (struct loop *loop, struc > 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); > @@ -1687,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); > > Index: loop-unswitch.c > =================================================================== > --- loop-unswitch.c (revision 192483) > +++ loop-unswitch.c (working copy) > @@ -454,6 +454,7 @@ unswitch_loop (struct loop *loop, basic_ > 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); > Index: cfgloop.h > =================================================================== > --- cfgloop.h (revision 192483) > +++ cfgloop.h (working copy) > @@ -310,6 +310,7 @@ extern edge create_empty_if_region_on_ed > 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, > >
Index: cfgloopmanip.c =================================================================== --- cfgloopmanip.c (revision 192483) +++ cfgloopmanip.c (working copy) @@ -971,6 +970,20 @@ fix_loop_placements (struct loop *loop, } } +/* 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 * @@ -979,6 +992,8 @@ duplicate_loop (struct loop *loop, struc 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); @@ -1687,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); Index: loop-unswitch.c =================================================================== --- loop-unswitch.c (revision 192483) +++ loop-unswitch.c (working copy) @@ -454,6 +454,7 @@ unswitch_loop (struct loop *loop, basic_ 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); Index: cfgloop.h =================================================================== --- cfgloop.h (revision 192483) +++ cfgloop.h (working copy) @@ -310,6 +310,7 @@ extern edge create_empty_if_region_on_ed 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,