aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2019-02-01 08:43:02 +0000
committerJakub Jelinek <jakub@redhat.com>2019-02-01 08:43:02 +0000
commit15bd3d8c5200a78fd432d767d7a9dc577327fee3 (patch)
tree9b6949a0d1d15eba96227cb7488b39ba41992694
parent68a3265a6bc5fdb3974c657e44302abff89e1ea0 (diff)
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. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@268444 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/testsuite/ChangeLog3
-rw-r--r--gcc/testsuite/gcc.dg/gomp/pr88107.c35
-rw-r--r--gcc/tree-cfg.c22
4 files changed, 64 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6b3437fe7b0..485bac73f2b 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 520ee15d764..fb18cf11873 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 00000000000..3b53b566565
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/pr88107.c
@@ -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;
+}
diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c
index 62254270524..f196428a4c4 100644
--- a/gcc/tree-cfg.c
+++ b/gcc/tree-cfg.c
@@ -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,