From ba009860aec4619f2424f5bdee812f14572dc3cc Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Wed, 18 Nov 2020 09:40:45 +0100 Subject: [PATCH] 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. --- gcc/omp-expand.c | 3 ++- gcc/testsuite/c-c++-common/gomp/pr97862.c | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/c-c++-common/gomp/pr97862.c 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) + ; +} -- 2.30.2