This adds a new ANNOTATE_EXPR kind, annot_expr_parallel_kind, which is stronger than ivdep which maps semantically to safelen=INT_MAX which alone doesn't tell us enough to auto-parallelize anything.
annot_expr_parallel_kind can map to the already existing loop flag can_be_parallel which can be used unconditionally by autopar. This patch changes the Fortran frontend to annotate DO CONCURRENT with parallel instead of ivdep. The patch is not enough to enable a runtime benefit because of some autopar costing issues but for other cases it should enable auto-parallelization of all DO CONCURRENT loops. Bootstrapped and tested on x86_64-unknown-linux-gnu, ok for the fortran part? Thanks, Richard. 2017-11-17 Richard Biener <rguent...@suse.de> PR fortran/83017 * tree-core.h (enum annot_expr_kind): Add annot_expr_parallel_kind. * tree-pretty-print.c (dump_generic_node): Handle annot_expr_parallel_kind. * tree-cfg.c (replace_loop_annotate_in_block): Likewise. * gimplify.c (gimple_boolify): Likewise. fortran/ * trans-stmt.c (gfc_trans_forall_loop): Annotate DO CONCURRENT loops with annot_expr_parallel_kind instead of just annot_expr_ivdep_kind. Index: gcc/tree-core.h =================================================================== --- gcc/tree-core.h (revision 254797) +++ gcc/tree-core.h (working copy) @@ -853,6 +853,7 @@ enum annot_expr_kind { annot_expr_ivdep_kind, annot_expr_no_vector_kind, annot_expr_vector_kind, + annot_expr_parallel_kind, annot_expr_kind_last }; Index: gcc/tree-pretty-print.c =================================================================== --- gcc/tree-pretty-print.c (revision 254797) +++ gcc/tree-pretty-print.c (working copy) @@ -2638,6 +2640,9 @@ dump_generic_node (pretty_printer *pp, t case annot_expr_vector_kind: pp_string (pp, ", vector"); break; + case annot_expr_parallel_kind: + pp_string (pp, ", parallel"); + break; default: gcc_unreachable (); } Index: gcc/tree-cfg.c =================================================================== --- gcc/tree-cfg.c (revision 254797) +++ gcc/tree-cfg.c (working copy) @@ -287,6 +287,10 @@ replace_loop_annotate_in_block (basic_bl loop->force_vectorize = true; cfun->has_force_vectorize_loops = true; break; + case annot_expr_parallel_kind: + loop->can_be_parallel = true; + loop->safelen = INT_MAX; + break; default: gcc_unreachable (); } Index: gcc/gimplify.c =================================================================== --- gcc/gimplify.c (revision 254797) +++ gcc/gimplify.c (working copy) @@ -3749,6 +3749,7 @@ gimple_boolify (tree expr) case annot_expr_ivdep_kind: case annot_expr_no_vector_kind: case annot_expr_vector_kind: + case annot_expr_parallel_kind: TREE_OPERAND (expr, 0) = gimple_boolify (TREE_OPERAND (expr, 0)); if (TREE_CODE (type) != BOOLEAN_TYPE) TREE_TYPE (expr) = boolean_type_node; Index: gcc/fortran/trans-stmt.c =================================================================== --- gcc/fortran/trans-stmt.c (revision 254797) +++ gcc/fortran/trans-stmt.c (working copy) @@ -3455,7 +3455,7 @@ gfc_trans_forall_loop (forall_info *fora if (forall_tmp->do_concurrent) cond = build2 (ANNOTATE_EXPR, TREE_TYPE (cond), cond, build_int_cst (integer_type_node, - annot_expr_ivdep_kind)); + annot_expr_parallel_kind)); tmp = build1_v (GOTO_EXPR, exit_label); tmp = fold_build3_loc (input_location, COND_EXPR, void_type_node,