https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63844
--- Comment #7 from Richard Biener <rguenth at gcc dot gnu.org> --- Ok, I think Tom had a similar patch for this but passing the .omp_data_i by effective "reference" (restrict qualified pointer and DECL_BY_REFERENCE) fixes this. Index: gcc/omp-low.c =================================================================== --- gcc/omp-low.c (revision 217692) +++ gcc/omp-low.c (working copy) @@ -1517,7 +1517,8 @@ fixup_child_record_type (omp_context *ct layout_type (type); } - TREE_TYPE (ctx->receiver_decl) = build_pointer_type (type); + TREE_TYPE (ctx->receiver_decl) + = build_qualified_type (build_pointer_type (type), TYPE_QUAL_RESTRICT); } /* Instantiate decls as necessary in CTX to satisfy the data sharing @@ -2006,6 +2007,7 @@ create_omp_child_function (omp_context * DECL_NAMELESS (t) = 1; DECL_ARG_TYPE (t) = ptr_type_node; DECL_CONTEXT (t) = current_function_decl; + DECL_BY_REFERENCE (t) = 1; TREE_USED (t) = 1; if (cilk_for_count) DECL_CHAIN (t) = DECL_ARGUMENTS (decl); there are more similar objects built, so the above may not fully optimize all cases.