From: Jakub Jelinek Date: Fri, 30 Aug 2019 11:35:08 +0000 (+0200) Subject: backport: re PR tree-optimization/88107 (ICE in find_outermost_region_in_block, at... X-Git-Tag: releases/gcc-7.5.0~266 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=231ab4cd97da6d146bd0a6659472c80342bb0e1b;p=thirdparty%2Fgcc.git backport: re PR tree-optimization/88107 (ICE in find_outermost_region_in_block, at tree-cfg.c:7157) Backported from mainline 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. * gcc.dg/gomp/pr88107.c: New test. From-SVN: r275095 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3747d5d57ea9..135034119acf 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,6 +1,15 @@ 2019-08-30 Jakub Jelinek Backported from mainline + 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-01-29 Jakub Jelinek PR c++/66676 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d3d1d59c42cc..b11b037af3f6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,6 +1,11 @@ 2019-08-30 Jakub Jelinek Backported from mainline + 2019-02-01 Jakub Jelinek + + PR tree-optimization/88107 + * gcc.dg/gomp/pr88107.c: New test. + 2019-01-29 Jakub Jelinek PR c++/66676 diff --git a/gcc/testsuite/gcc.dg/gomp/pr88107.c b/gcc/testsuite/gcc.dg/gomp/pr88107.c new file mode 100644 index 000000000000..3b53b5665658 --- /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 f9d75c5f64db..c223ee45be23 100644 --- a/gcc/tree-cfg.c +++ b/gcc/tree-cfg.c @@ -7002,11 +7002,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; @@ -7025,7 +7028,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; + } } } } @@ -7319,12 +7326,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,