re PR tree-optimization/88107 (ICE in find_outermost_region_in_block, at tree-cfg...
authorJakub Jelinek <jakub@redhat.com>
Fri, 1 Feb 2019 08:43:02 +0000 (09:43 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 1 Feb 2019 08:43:02 +0000 (09:43 +0100)
PR tree-optimization/88107
* tree-cfg.c (find_outermost_region_in_block): Add ALL argument,
instead of assertion that eh_region_outermost is non-NULL, if it
is NULL, set *ALL to true and return NULL.
(move_sese_region_to_fn): Adjust caller, if all is set, call
duplicate_eh_regions with NULL region.

* gcc.dg/gomp/pr88107.c: New test.

From-SVN: r268444

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/gomp/pr88107.c [new file with mode: 0644]
gcc/tree-cfg.c

index 6b3437fe7b071f4c06184169fc4d21068e3e851f..485bac73f2bdb2ef944f76b97a1b58d2b73861e5 100644 (file)
@@ -1,3 +1,12 @@
+2019-02-01  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/88107
+       * tree-cfg.c (find_outermost_region_in_block): Add ALL argument,
+       instead of assertion that eh_region_outermost is non-NULL, if it
+       is NULL, set *ALL to true and return NULL.
+       (move_sese_region_to_fn): Adjust caller, if all is set, call
+       duplicate_eh_regions with NULL region.
+
 2019-02-01  Richard Biener  <rguenth@suse.de>
 
        PR rtl-optimization/88593
index 520ee15d764a336243dbf382fdb24c34518ebdb3..fb18cf118736e89b36ebe45b86aa3b5982bc397b 100644 (file)
@@ -1,5 +1,8 @@
 2019-02-01  Jakub Jelinek  <jakub@redhat.com>
 
+       PR tree-optimization/88107
+       * gcc.dg/gomp/pr88107.c: New test.
+
        PR c++/87175
        * g++.dg/ext/attrib57.C: New test.
 
diff --git a/gcc/testsuite/gcc.dg/gomp/pr88107.c b/gcc/testsuite/gcc.dg/gomp/pr88107.c
new file mode 100644 (file)
index 0000000..3b53b56
--- /dev/null
@@ -0,0 +1,35 @@
+/* PR tree-optimization/88107 */
+/* { dg-do compile { target fgraphite } } */
+/* { dg-require-effective-target vect_simd_clones } */
+/* { dg-options "-O2 -fexceptions -floop-nest-optimize -fnon-call-exceptions -fopenmp-simd -ftree-parallelize-loops=2" } */
+
+#define N 1024
+int a[N], b[N];
+long int c[N];
+unsigned char d[N];
+
+#pragma omp declare simd notinbranch
+__attribute__((noinline)) static int
+foo (long int a, int b, int c)
+{
+  return a + b + c;
+}
+
+#pragma omp declare simd notinbranch
+__attribute__((noinline)) static long int
+bar (int a, int b, long int c)
+{
+  return a + b + c;
+}
+
+void
+baz (void)
+{
+  int i;
+  #pragma omp simd
+  for (i = 0; i < N; i++)
+    a[i] = foo (c[i], a[i], b[i]) + 6;
+  #pragma omp simd
+  for (i = 0; i < N; i++)
+    c[i] = bar (a[i], b[i], c[i]) * 2;
+}
index 62254270524116f30776791cb04435b090469a62..f196428a4c4ef639406fe7cafcbfbcb25957fdad 100644 (file)
@@ -7143,11 +7143,14 @@ move_block_to_fn (struct function *dest_cfun, basic_block bb,
 }
 
 /* Examine the statements in BB (which is in SRC_CFUN); find and return
-   the outermost EH region.  Use REGION as the incoming base EH region.  */
+   the outermost EH region.  Use REGION as the incoming base EH region.
+   If there is no single outermost region, return NULL and set *ALL to
+   true.  */
 
 static eh_region
 find_outermost_region_in_block (struct function *src_cfun,
-                               basic_block bb, eh_region region)
+                               basic_block bb, eh_region region,
+                               bool *all)
 {
   gimple_stmt_iterator si;
 
@@ -7166,7 +7169,11 @@ find_outermost_region_in_block (struct function *src_cfun,
          else if (stmt_region != region)
            {
              region = eh_region_outermost (src_cfun, stmt_region, region);
-             gcc_assert (region != NULL);
+             if (region == NULL)
+               {
+                 *all = true;
+                 return NULL;
+               }
            }
        }
     }
@@ -7501,12 +7508,17 @@ move_sese_region_to_fn (struct function *dest_cfun, basic_block entry_bb,
   if (saved_cfun->eh)
     {
       eh_region region = NULL;
+      bool all = false;
 
       FOR_EACH_VEC_ELT (bbs, i, bb)
-       region = find_outermost_region_in_block (saved_cfun, bb, region);
+       {
+         region = find_outermost_region_in_block (saved_cfun, bb, region, &all);
+         if (all)
+           break;
+       }
 
       init_eh_for_function ();
-      if (region != NULL)
+      if (region != NULL || all)
        {
          new_label_map = htab_create (17, tree_map_hash, tree_map_eq, free);
          eh_map = duplicate_eh_regions (saved_cfun, region, 0,