Hi! If collapse_bb != NULL, then cont_bb isn't a latch of schedule(static,C) collapse(N) omp for loops, and the latch for simd loops was only correct if the loop contained just two basic blocks and not more.
Fixed thusly, bootstrapped/regtested on x86_64-linux, committed to trunk. 2013-11-26 Jakub Jelinek <ja...@redhat.com> PR middle-end/59152 * omp-low.c (expand_omp_for_static_chunk): Don't set loop->latch for the inner loop if collapse_bb is non-NULL. (expand_omp_simd): Use cont_bb rather than e->dest as latch. * c-c++-common/gomp/pr59152.c: New test. --- gcc/omp-low.c.jj 2013-11-25 18:30:18.000000000 +0100 +++ gcc/omp-low.c 2013-11-26 14:20:46.137171434 +0100 @@ -6491,7 +6491,8 @@ expand_omp_for_static_chunk (struct omp_ { struct loop *loop = alloc_loop (); loop->header = body_bb; - loop->latch = cont_bb; + if (collapse_bb == NULL) + loop->latch = cont_bb; add_loop (loop, trip_loop); } } @@ -6771,7 +6772,7 @@ expand_omp_simd (struct omp_region *regi { struct loop *loop = alloc_loop (); loop->header = l1_bb; - loop->latch = e->dest; + loop->latch = cont_bb; add_loop (loop, l1_bb->loop_father); if (safelen == NULL_TREE) loop->safelen = INT_MAX; --- gcc/testsuite/c-c++-common/gomp/pr59152.c.jj 2013-11-26 14:15:32.099779366 +0100 +++ gcc/testsuite/c-c++-common/gomp/pr59152.c 2013-11-26 13:59:36.000000000 +0100 @@ -0,0 +1,40 @@ +/* PR middle-end/59152 */ +/* { dg-do compile } */ +/* { dg-options "-fopenmp -fipa-pure-const" } */ + +extern int b[]; +void +foo (void) +{ + unsigned long v1, v2, v3; + #pragma omp parallel for schedule(static, 32) collapse(3) + for (v1 = 0; v1 < 20; v1 += 2) + for (v2 = __LONG_MAX__; v2 > __LONG_MAX__ - 30; v2 -= 3) + for (v3 = 10; v3 > 0; v3--) + #pragma omp atomic + b[v3]++; +} + +void +bar (void) +{ + unsigned long v1, v2, v3; + #pragma omp parallel for schedule(static) collapse(3) + for (v1 = 0; v1 < 20; v1 += 2) + for (v2 = __LONG_MAX__; v2 > __LONG_MAX__ - 30; v2 -= 3) + for (v3 = 10; v3 > 0; v3--) + #pragma omp atomic + b[v3]++; +} + +void +baz (void) +{ + unsigned long v1, v2, v3; + #pragma omp parallel for schedule(runtime) collapse(3) + for (v1 = 0; v1 < 20; v1 += 2) + for (v2 = __LONG_MAX__; v2 > __LONG_MAX__ - 30; v2 -= 3) + for (v3 = 10; v3 > 0; v3--) + #pragma omp atomic + b[v3]++; +} Jakub