aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/trans-array.c
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2006-12-13 09:57:56 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2006-12-13 09:57:56 +0000
commit54200abb68aed1ddf147251fcbe402549482d499 (patch)
tree7999ad0c5cf8c4027a341ed6f21ea1817f74f26f /gcc/fortran/trans-array.c
parent691eb42f298517910cad955f90ebee321766dcf3 (diff)
downloadgcc-54200abb68aed1ddf147251fcbe402549482d499.zip
gcc-54200abb68aed1ddf147251fcbe402549482d499.tar.gz
gcc-54200abb68aed1ddf147251fcbe402549482d499.tar.bz2
re PR fortran/30115 (allocate() interface pessimizes aliasing)
2006-12-13 Richard Guenther <rguenther@suse.de> PR fortran/30115 * runtime/memory.c (allocate_size): Change interface to void *()(size_t, GFC_INTEGER_4 *). (allocate): Likewise. (allocate64): Likewise. (allocate_array): Change interface to void *()(void *, size_t, GFC_INTEGER_4 *). (allocate64_array): Likewise. (deallocate): Change interface to void ()(void *, GFC_INTEGER_4 *). * trans-array.c (gfc_array_allocate): Adjust for changed library interface. (gfc_array_deallocate): Likewise. (gfc_trans_dealloc_allocated): Likewise. * trans-stmt.c (gfc_trans_allocate): Likewise. (gfc_trans_deallocate): Likewise. * trans-decl.c (gfc_build_builtin_function_decls): Adjust function declarations to match the library changes. Mark allocation functions with DECL_IS_MALLOC. From-SVN: r119822
Diffstat (limited to 'gcc/fortran/trans-array.c')
-rw-r--r--gcc/fortran/trans-array.c29
1 files changed, 22 insertions, 7 deletions
diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c
index bfd0600..b65ec74 100644
--- a/gcc/fortran/trans-array.c
+++ b/gcc/fortran/trans-array.c
@@ -3355,8 +3355,8 @@ gfc_array_allocate (gfc_se * se, gfc_expr * expr, tree pstat)
lower, upper, &se->pre);
/* Allocate memory to store the data. */
- tmp = gfc_conv_descriptor_data_addr (se->expr);
- pointer = gfc_evaluate_now (tmp, &se->pre);
+ pointer = gfc_conv_descriptor_data_get (se->expr);
+ STRIP_NOPS (pointer);
if (TYPE_PRECISION (gfc_array_index_type) == 32)
{
@@ -3375,10 +3375,14 @@ gfc_array_allocate (gfc_se * se, gfc_expr * expr, tree pstat)
else
gcc_unreachable ();
- tmp = gfc_chainon_list (NULL_TREE, pointer);
+ tmp = NULL_TREE;
+ /* The allocate_array variants take the old pointer as first argument. */
+ if (allocatable_array)
+ tmp = gfc_chainon_list (tmp, pointer);
tmp = gfc_chainon_list (tmp, size);
tmp = gfc_chainon_list (tmp, pstat);
tmp = build_function_call_expr (allocate, tmp);
+ tmp = build2 (MODIFY_EXPR, void_type_node, pointer, tmp);
gfc_add_expr_to_block (&se->pre, tmp);
tmp = gfc_conv_descriptor_offset (se->expr);
@@ -3409,8 +3413,8 @@ gfc_array_deallocate (tree descriptor, tree pstat)
gfc_start_block (&block);
/* Get a pointer to the data. */
- tmp = gfc_conv_descriptor_data_addr (descriptor);
- var = gfc_evaluate_now (tmp, &block);
+ var = gfc_conv_descriptor_data_get (descriptor);
+ STRIP_NOPS (var);
/* Parameter is the address of the data component. */
tmp = gfc_chainon_list (NULL_TREE, var);
@@ -3418,6 +3422,11 @@ gfc_array_deallocate (tree descriptor, tree pstat)
tmp = build_function_call_expr (gfor_fndecl_deallocate, tmp);
gfc_add_expr_to_block (&block, tmp);
+ /* Zero the data pointer. */
+ tmp = build2 (MODIFY_EXPR, void_type_node,
+ var, build_int_cst (TREE_TYPE (var), 0));
+ gfc_add_expr_to_block (&block, tmp);
+
return gfc_finish_block (&block);
}
@@ -4690,8 +4699,8 @@ gfc_trans_dealloc_allocated (tree descriptor)
gfc_start_block (&block);
- tmp = gfc_conv_descriptor_data_addr (descriptor);
- var = gfc_evaluate_now (tmp, &block);
+ var = gfc_conv_descriptor_data_get (descriptor);
+ STRIP_NOPS (var);
tmp = gfc_create_var (gfc_array_index_type, NULL);
ptr = build_fold_addr_expr (tmp);
@@ -4702,6 +4711,12 @@ gfc_trans_dealloc_allocated (tree descriptor)
tmp = gfc_chainon_list (tmp, ptr);
tmp = build_function_call_expr (gfor_fndecl_deallocate, tmp);
gfc_add_expr_to_block (&block, tmp);
+
+ /* Zero the data pointer. */
+ tmp = build2 (MODIFY_EXPR, void_type_node,
+ var, build_int_cst (TREE_TYPE (var), 0));
+ gfc_add_expr_to_block (&block, tmp);
+
return gfc_finish_block (&block);
}