[PATCH] Fix up orig_loop_num handling during move_sese_region_to_fn (PR tree-optimization/81945)
Richard Biener
rguenther@suse.de
Wed Dec 6 06:54:00 GMT 2017
On December 5, 2017 10:05:43 PM GMT+01:00, Jakub Jelinek <jakub@redhat.com> wrote:
>Hi!
>
>move_sese_region_to_fn moves a subset of the original loop tree
>to the dest_cfun (and adds the outermost loop new).
>Now, some loops might have non-zero orig_loop_num field. In the caller
>that is fine, if the orig_loop_num loop is moved, then get_loop will
>just
>return NULL and we'll clear it later. But if a loop with orig_loop_num
>!= 0
>is moved into the dest_cfun, where we create new numbers for the loops,
>orig_loop_num might be too large for the larray vector, or might point
>to an unrelated loop.
>
>The following patch goes through all the loops moved into dest_cfun and
>if
>they have non-zero orig_loop_num, it tries to remap them into a new
>number
>if it points to a loop that was also moved to dest_cfun, or clears it
>otherwise.
>
>Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
OK. I suppose if we ever encounter this in inlining we need sth similar there.
Richard.
>2017-12-05 Jakub Jelinek <jakub@redhat.com>
>
> PR tree-optimization/81945
> * cfgloop.h (FOR_EACH_LOOP_FN): Use FN instead of hardcoding fn.
> * tree-cfg.c (move_sese_region_to_fn): If any of the loops moved
> to dest_cfun has orig_loop_num set, either remap it to the new
> loop number if the loop got moved too, or clear it.
>
> * gcc.dg/graphite/pr81945.c: New test.
>
>--- gcc/cfgloop.h.jj 2017-11-27 18:52:20.000000000 +0100
>+++ gcc/cfgloop.h 2017-12-05 16:00:07.771838975 +0100
>@@ -766,7 +766,7 @@ loop_iterator::~loop_iterator ()
> (LOOP) = li.next ())
>
> #define FOR_EACH_LOOP_FN(FN, LOOP, FLAGS) \
>- for (loop_iterator li(fn, &(LOOP), FLAGS); \
>+ for (loop_iterator li(FN, &(LOOP), FLAGS); \
> (LOOP); \
> (LOOP) = li.next ())
>
>--- gcc/tree-cfg.c.jj 2017-12-04 20:10:29.000000000 +0100
>+++ gcc/tree-cfg.c 2017-12-05 15:54:53.000000000 +0100
>@@ -7468,6 +7468,8 @@ move_sese_region_to_fn (struct function
> loops->state = LOOPS_MAY_HAVE_MULTIPLE_LATCHES;
> set_loops_for_fn (dest_cfun, loops);
>
>+ vec<loop_p, va_gc> *larray = get_loops (saved_cfun)->copy ();
>+
> /* Move the outlined loop tree part. */
> num_nodes = bbs.length ();
> FOR_EACH_VEC_ELT (bbs, i, bb)
>@@ -7514,6 +7516,20 @@ move_sese_region_to_fn (struct function
> loop->aux = current_loops->tree_root;
> loop0->aux = current_loops->tree_root;
>
>+ /* Fix up orig_loop_num. If the block referenced in it has been
>moved
>+ to dest_cfun, update orig_loop_num field, otherwise clear it. */
>+ struct loop *dloop;
>+ FOR_EACH_LOOP_FN (dest_cfun, dloop, 0)
>+ if (dloop->orig_loop_num)
>+ {
>+ if ((*larray)[dloop->orig_loop_num] != NULL
>+ && get_loop (saved_cfun, dloop->orig_loop_num) == NULL)
>+ dloop->orig_loop_num = (*larray)[dloop->orig_loop_num]->num;
>+ else
>+ dloop->orig_loop_num = 0;
>+ }
>+ ggc_free (larray);
>+
> pop_cfun ();
>
> /* Move blocks from BBS into DEST_CFUN. */
>--- gcc/testsuite/gcc.dg/graphite/pr81945.c.jj 2017-12-05
>16:07:12.375610782 +0100
>+++ gcc/testsuite/gcc.dg/graphite/pr81945.c 2017-12-05
>16:07:24.925456255 +0100
>@@ -0,0 +1,21 @@
>+/* PR tree-optimization/81945 */
>+/* { dg-do compile { target pthread } } */
>+/* { dg-options "-O3 -ftree-parallelize-loops=2 -floop-nest-optimize"
>} */
>+
>+unsigned long int v;
>+
>+void
>+foo (int x, int y, long int *a)
>+{
>+ do
>+ {
>+ int **b;
>+
>+ while (y != 0)
>+ ;
>+ v *= 2;
>+ **b = *a;
>+ ++x;
>+ }
>+ while (x < 1);
>+}
>
> Jakub
More information about the Gcc-patches
mailing list