diff options
author | Richard Guenther <rguenther@suse.de> | 2006-12-13 09:57:56 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2006-12-13 09:57:56 +0000 |
commit | 54200abb68aed1ddf147251fcbe402549482d499 (patch) | |
tree | 7999ad0c5cf8c4027a341ed6f21ea1817f74f26f /gcc/fortran/trans-array.c | |
parent | 691eb42f298517910cad955f90ebee321766dcf3 (diff) | |
download | gcc-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.c | 29 |
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); } |