+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
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.
--- /dev/null
+/* 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;
+}
}
/* 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;
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;
+ }
}
}
}
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,