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;
}