This is the mail archive of the fortran@gcc.gnu.org mailing list for the GNU Fortran project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Fix PR83017 (fortran part)


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  <rguenther@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,


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]