http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46032
Richard Guenther <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW Last reconfirmed| |2010.10.15 10:08:39 CC| |jakub at gcc dot gnu.org, | |rguenth at gcc dot gnu.org Ever Confirmed|0 |1 --- Comment #1 from Richard Guenther <rguenth at gcc dot gnu.org> 2010-10-15 10:08:39 UTC --- The problem is that local variables are accessed indirectly via the .omp_data_i pointer and alias analysis is unable to hoist the load of .omp_data_i_12(D)->coeff across the store to *pretmp.5_27[idx_1]. A fix is to make the argument DECL_BY_REFERENCE and the type restrict qualified. This will make alias analysis assume that the pointed-to object is not aliased unless later somebody takes its address. <bb 3>: pretmp.5_23 = .omp_data_i_12(D)->pData; pretmp.5_27 = .omp_data_i_12(D)->results; <bb 4>: # idx_1 = PHI <idx_8(3), idx_18(5)> D.2142_14 = *pretmp.5_23[idx_1]; D.2143_15 = .omp_data_i_12(D)->coeff; D.2144_16 = D.2142_14 * D.2143_15; *pretmp.5_27[idx_1] = D.2144_16; idx_18 = idx_1 + 1; if (D.2139_10 > idx_18) goto <bb 5>; else goto <bb 6>; <bb 5>: goto <bb 4>; Not completely enough though, as we consider *.omp_data_i escaped (and thus reachable by NONLOCAL). The following fixes that (with unknown consequences, I think fortran array descriptors are the only other user): Index: gcc/omp-low.c =================================================================== --- gcc/omp-low.c (revision 165474) +++ gcc/omp-low.c (working copy) @@ -1349,7 +1349,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 @@ -1584,6 +1585,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; DECL_ARGUMENTS (decl) = t; if (!task_copy) Index: gcc/tree-ssa-structalias.c =================================================================== --- gcc/tree-ssa-structalias.c (revision 165474) +++ gcc/tree-ssa-structalias.c (working copy) @@ -5575,7 +5575,6 @@ intra_create_variable_infos (void) var_ann_t ann; heapvar = create_tmp_var_raw (TREE_TYPE (TREE_TYPE (t)), "PARM_NOALIAS"); - DECL_EXTERNAL (heapvar) = 1; heapvar_insert (t, 0, heapvar); ann = get_var_ann (heapvar); ann->is_heapvar = 1; @@ -5590,6 +5589,12 @@ intra_create_variable_infos (void) rhsc.offset = 0; process_constraint (new_constraint (lhsc, rhsc)); vi->is_restrict_var = 1; + do + { + make_constraint_from (vi, nonlocal_id); + vi = vi->next; + } + while (vi); continue; } it means that stores to *.omp_data_i in the omp fn are considered not escaping to the caller (and thus can be DSEd). With the above patch the loop is vectorized with a runtime alias check, as we can't see that results and pData do not alias. Not even with IPA-PTA as the OMP function escapes through __builtin_GOMP_parallel_start.