re PR tree-optimization/81945 (ICE in operator[], at vec.h:749)
authorJakub Jelinek <jakub@redhat.com>
Wed, 6 Dec 2017 08:16:44 +0000 (09:16 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 6 Dec 2017 08:16:44 +0000 (09:16 +0100)
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.

From-SVN: r255438

gcc/ChangeLog
gcc/cfgloop.h
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/graphite/pr81945.c [new file with mode: 0644]
gcc/tree-cfg.c

index 603f7f0cf5819f96a600e94e8d766996d5de25b0..b3f5784b1a89e94ace7f2bda8e214a0dc3b4e585 100644 (file)
@@ -1,3 +1,11 @@
+2017-12-06  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.
+
 2017-12-05  Steve Ellcey  <sellcey@cavium.com>
 
        * config/aarch64/thunderx2-t99.md (thunderx2t99_branch): Add trap
index dce01bdd56a355c25ee80573b7f91ecbfada4894..687cdb55c534e0f5299a61a8e1dc73d555188adc 100644 (file)
@@ -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 ())
 
index 983bcd86b866202c8673c0cc91e8ef034ae5dcf2..1ec2e947a54dc79069ad50d8bd1c034f96b767e7 100644 (file)
@@ -1,3 +1,8 @@
+2017-12-06  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/81945
+       * gcc.dg/graphite/pr81945.c: New test.
+
 2017-12-05  Matthew Gretton-Dann  <matthew.gretton-dann@arm.com>
 
        * gcc.c-torture/unsorted/dump-noaddr.x: Generate dump files in
diff --git a/gcc/testsuite/gcc.dg/graphite/pr81945.c b/gcc/testsuite/gcc.dg/graphite/pr81945.c
new file mode 100644 (file)
index 0000000..0dc6619
--- /dev/null
@@ -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);
+}
index 2501a9cb8bb8b67b312b9386b014604ac58a87b5..e313df904433d3552630bea3d6ff5d3f5bfc2334 100644 (file)
@@ -7468,6 +7468,8 @@ move_sese_region_to_fn (struct function *dest_cfun, basic_block entry_bb,
   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 *dest_cfun, basic_block entry_bb,
   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.  */