The following fixes GIMPLE stmt sinking to not sink a stmt into a loop. It actually chooses the correct basic-block to sink to but just ignores that when computing the stmt iterator to sink to...
Bootstrap and regtest running on x86_64-unknown-linux-gnu. Richard. 2019-05-27 Richard Biener <rguent...@suse.de> PR tree-optimization/90637 * tree-ssa-sink.c (statement_sink_location): Honor the computed sink location for single-uses. * gcc.dg/gomp/pr90637.c: New testcase. Index: gcc/tree-ssa-sink.c =================================================================== --- gcc/tree-ssa-sink.c (revision 271644) +++ gcc/tree-ssa-sink.c (working copy) @@ -439,7 +439,10 @@ statement_sink_location (gimple *stmt, b if (sinkbb == frombb) return false; - *togsi = gsi_for_stmt (use); + if (sinkbb == gimple_bb (use)) + *togsi = gsi_for_stmt (use); + else + *togsi = gsi_after_labels (sinkbb); return true; } Index: gcc/testsuite/gcc.dg/gomp/pr90637.c =================================================================== --- gcc/testsuite/gcc.dg/gomp/pr90637.c (nonexistent) +++ gcc/testsuite/gcc.dg/gomp/pr90637.c (working copy) @@ -0,0 +1,14 @@ +/* PR tree-optimization/90637 */ +/* { dg-do compile } */ +/* { dg-options "-fopenmp -O1 --param sink-frequency-threshold=90" } */ + +int v; + +void +foo (int c) +{ + int i; +#pragma omp for simd if (c) lastprivate (v) schedule (static, 16) + for (i = 0; i < 64; ++i) + v = i; +}