http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46032
--- Comment #4 from Richard Guenther <rguenth at gcc dot gnu.org> 2010-10-15 12:09:38 UTC --- A few things to consider: __builtin_GOMP_parallel_start (main._omp_fn.0, &.omp_data_o.1, 0); main._omp_fn.0 (&.omp_data_o.1); __builtin_GOMP_parallel_end (); for PTA purposes we can ignore that __builtin_GOMP_parallel_start calls main._omp_fn.0 and I suppose the function pointer doesn't escape through it. We can't assume that .omp_data_o.1 does not escape through __builtin_GOMP_parallel_start though, as __builtin_GOMP_parallel_end needs to be a barrier for optimization for it (and thus needs to be considered reading and writing .omp_data_o.1). As it doesn't take any arguments the only way to ensure that is by making .omp_data_o.1 escape. We could probably arrange for __builtin_GOMP_parallel_end to get &.omp_data_o.1 as argument solely for alias-analysis purposes though. In that case we could use ".xw" for __builtin_GOMP_parallel_start and ".w" for __builtin_GOMP_parallel_end.