I made a stupid mistake when calculating the image index for corank > 1 arrays, which is fixed by the attached patch.

In addition, I help the middle end by telling it that caf_register returns freshly allocated memory, which does not alias with other pointers.

Committed to the branch as Rev. 209661.

Tobias
Index: ChangeLog.fortran-caf
===================================================================
--- ChangeLog.fortran-caf	(Revision 209535)
+++ ChangeLog.fortran-caf	(Arbeitskopie)
@@ -1,3 +1,10 @@
+2014-04-22  Tobias Burnus  <bur...@net-b.de>
+
+	* trans-decl.c (gfc_build_builtin_function_decls): Mark
+	coarray's register function as DECL_IS_MALLOC.
+	* trans-intrinsic.c (caf_get_image_index): Fix calculation for
+	corank > 1.
+
 2014-04-20  Tobias Burnus  <bur...@net-b.de>
 
 	* resolve.c (add_caf_get_intrinsic): Add check whether is is really
Index: trans-decl.c
===================================================================
--- trans-decl.c	(Revision 209535)
+++ trans-decl.c	(Arbeitskopie)
@@ -3261,6 +3261,7 @@ gfc_build_builtin_function_decls (void)
 	get_identifier (PREFIX("caf_register")), "...WWW", pvoid_type_node, 6,
         size_type_node, integer_type_node, ppvoid_type_node, pint_type,
         pchar_type_node, integer_type_node);
+      DECL_IS_MALLOC (gfor_fndecl_caf_register) = 1;
 
       gfor_fndecl_caf_deregister = gfc_build_library_function_decl_with_spec (
 	get_identifier (PREFIX("caf_deregister")), ".WWW", void_type_node, 4,
Index: trans-intrinsic.c
===================================================================
--- trans-intrinsic.c	(Revision 209535)
+++ trans-intrinsic.c	(Arbeitskopie)
@@ -954,8 +954,6 @@ caf_get_image_index (stmtblock_t *block, gfc_expr
 	tmp = fold_build2_loc (input_location, MINUS_EXPR,
 			       integer_type_node, se.expr,
 			       fold_convert(integer_type_node, lbound));
-	tmp = fold_build2_loc (input_location, PLUS_EXPR, integer_type_node,
-			       tmp, integer_one_node);
 	tmp = fold_build2_loc (input_location, MULT_EXPR, integer_type_node,
 			       extent, tmp);
 	img_idx = fold_build2_loc (input_location, PLUS_EXPR, integer_type_node,
@@ -977,8 +975,6 @@ caf_get_image_index (stmtblock_t *block, gfc_expr
 	lbound = fold_convert (integer_type_node, lbound);
 	tmp = fold_build2_loc (input_location, MINUS_EXPR,
 			       integer_type_node, se.expr, lbound);
-	tmp = fold_build2_loc (input_location, PLUS_EXPR, integer_type_node,
-			       tmp, integer_one_node);
 	tmp = fold_build2_loc (input_location, MULT_EXPR, integer_type_node,
 			       extent, tmp);
 	img_idx = fold_build2_loc (input_location, PLUS_EXPR, integer_type_node,
@@ -993,6 +989,8 @@ caf_get_image_index (stmtblock_t *block, gfc_expr
 				      extent, integer_one_node);
 	  }
       }
+  img_idx = fold_build2_loc (input_location, PLUS_EXPR, integer_type_node,
+			     img_idx, integer_one_node);
   return img_idx;
 }
 

Reply via email to