From: Jakub Jelinek Date: Wed, 18 Nov 2020 08:40:45 +0000 (+0100) Subject: openmp: Fix ICE on non-rectangular loop with known 0 iterations X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=ba009860aec4619f2424f5bdee812f14572dc3cc;p=gcc.git openmp: Fix ICE on non-rectangular loop with known 0 iterations The loops in the testcase are non-rectangular and have 0 iterations (the outer loop iterates, but the inner one never). In this case we just have the overall number of iterations computed (0), and don't have factor and other values computed. We never need to map logical iterations to the individual iterations in that case, and we were crashing during expansion of that code. 2020-11-18 Jakub Jelinek PR middle-end/97862 * omp-expand.c (expand_omp_for_init_vars): Don't use the sqrt path if number of iterations is constant 0. * c-c++-common/gomp/pr97862.c: New test. --- diff --git a/gcc/omp-expand.c b/gcc/omp-expand.c index b731fd69b1e..c0e94e5e323 100644 --- a/gcc/omp-expand.c +++ b/gcc/omp-expand.c @@ -2514,7 +2514,8 @@ expand_omp_for_init_vars (struct omp_for_data *fd, gimple_stmt_iterator *gsi, && (TREE_CODE (fd->loop.n2) == INTEGER_CST || fd->first_inner_iterations) && (optab_handler (sqrt_optab, TYPE_MODE (double_type_node)) - != CODE_FOR_nothing)) + != CODE_FOR_nothing) + && !integer_zerop (fd->loop.n2)) { tree outer_n1 = fd->adjn1 ? fd->adjn1 : fd->loops[i - 1].n1; tree itype = TREE_TYPE (fd->loops[i].v); diff --git a/gcc/testsuite/c-c++-common/gomp/pr97862.c b/gcc/testsuite/c-c++-common/gomp/pr97862.c new file mode 100644 index 00000000000..21aad3f5b29 --- /dev/null +++ b/gcc/testsuite/c-c++-common/gomp/pr97862.c @@ -0,0 +1,15 @@ +/* PR middle-end/97862 */ + +void +foo (void) +{ + int i, j; +#pragma omp for collapse(2) + for (i = 0; i < 1; ++i) + for (j = 0; j < i; ++j) + ; +#pragma omp for collapse(2) + for (i = 0; i < 20; i++) + for (j = 0; j < i - 19; j += 1) + ; +}