From ac33bce89cdab0c0c43edec60b98a1fccdf3bd4b Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Fri, 1 Feb 2019 09:43:02 +0100 Subject: [PATCH] re PR tree-optimization/88107 (ICE in find_outermost_region_in_block, at tree-cfg.c:7157) 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 | 9 ++++++++ gcc/testsuite/ChangeLog | 3 +++ gcc/testsuite/gcc.dg/gomp/pr88107.c | 35 +++++++++++++++++++++++++++++ gcc/tree-cfg.c | 22 +++++++++++++----- 4 files changed, 64 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/gomp/pr88107.c 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 + + 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 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 + 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, -- 2.30.2