Commit 2b56d6a4 by Tobias Burnus Committed by Tobias Burnus

re PR fortran/43178 (Pointless resetting to NULL for local ALLOCATABLEs)

2010-04-06  Tobias Burnus  <burnus@net-b.de>

        PR fortran/43178
        * trans-array.c (gfc_conv_expr_descriptor): Update
        gfc_trans_scalar_assign call.
        (has_default_initializer): New function.
        (gfc_trans_deferred_array): Nullify less often.
        * trans-expr.c (gfc_conv_subref_array_arg,
        gfc_trans_subcomponent_assign): Update call to
        gfc_trans_scalar_assign.
        (gfc_trans_scalar_assign): Add parameter and pass it on.
        (gfc_trans_assignment_1): Optionally, do not dealloc before
        assignment.
        * trans-openmp.c (gfc_trans_omp_array_reduction): Update
        call to gfc_trans_scalar_assign.
        * trans-decl.c (gfc_get_symbol_decl): Do not always apply
        initializer to static variables.
        (gfc_init_default_dt): Add dealloc parameter and pass it on.
        * trans-stmt.c (forall_make_variable_temp,
        generate_loop_for_temp_to_lhs, generate_loop_for_rhs_to_temp,
        gfc_trans_forall_1, gfc_trans_where_assign, gfc_trans_where_3
        gfc_trans_allocate): Update gfc_trans_assignment call.
        * trans.h (gfc_trans_scalar_assign, gfc_init_default_dt,
        gfc_init_default_dt, gfc_trans_assignment): Add bool dealloc
        parameter to prototype.

2010-04-06  Tobias Burnus  <burnus@net-b.de>

        PR fortran/43178
        * gfortran.dg/alloc_comp_basics_1.f90: Update
        * scan-tree-dump-times.
        * gfortran.dg/alloc_comp_constructor_1.f90: Ditto.
        * gfortran.dg/auto_dealloc_1.f90: Ditto.

From-SVN: r157993
parent 56186ac2
2010-04-06 Tobias Burnus <burnus@net-b.de>
PR fortran/43178
* trans-array.c (gfc_conv_expr_descriptor): Update
gfc_trans_scalar_assign call.
(has_default_initializer): New function.
(gfc_trans_deferred_array): Nullify less often.
* trans-expr.c (gfc_conv_subref_array_arg,
gfc_trans_subcomponent_assign): Update call to
gfc_trans_scalar_assign.
(gfc_trans_scalar_assign): Add parameter and pass it on.
(gfc_trans_assignment_1): Optionally, do not dealloc before
assignment.
* trans-openmp.c (gfc_trans_omp_array_reduction): Update
call to gfc_trans_scalar_assign.
* trans-decl.c (gfc_get_symbol_decl): Do not always apply
initializer to static variables.
(gfc_init_default_dt): Add dealloc parameter and pass it on.
* trans-stmt.c (forall_make_variable_temp,
generate_loop_for_temp_to_lhs, generate_loop_for_rhs_to_temp,
gfc_trans_forall_1, gfc_trans_where_assign, gfc_trans_where_3
gfc_trans_allocate): Update gfc_trans_assignment call.
* trans.h (gfc_trans_scalar_assign, gfc_init_default_dt,
gfc_init_default_dt, gfc_trans_assignment): Add bool dealloc
parameter to prototype.
2010-03-31 Paul Thomas <pault@gcc.gnu.org> 2010-03-31 Paul Thomas <pault@gcc.gnu.org>
* ioparm.def : Update copyright. * ioparm.def : Update copyright.
......
...@@ -5214,7 +5214,7 @@ gfc_conv_expr_descriptor (gfc_se * se, gfc_expr * expr, gfc_ss * ss) ...@@ -5214,7 +5214,7 @@ gfc_conv_expr_descriptor (gfc_se * se, gfc_expr * expr, gfc_ss * ss)
lse.string_length = rse.string_length; lse.string_length = rse.string_length;
tmp = gfc_trans_scalar_assign (&lse, &rse, expr->ts, true, tmp = gfc_trans_scalar_assign (&lse, &rse, expr->ts, true,
expr->expr_type == EXPR_VARIABLE); expr->expr_type == EXPR_VARIABLE, true);
gfc_add_expr_to_block (&block, tmp); gfc_add_expr_to_block (&block, tmp);
/* Finish the copying loops. */ /* Finish the copying loops. */
...@@ -6176,6 +6176,25 @@ gfc_copy_only_alloc_comp (gfc_symbol * der_type, tree decl, tree dest, int rank) ...@@ -6176,6 +6176,25 @@ gfc_copy_only_alloc_comp (gfc_symbol * der_type, tree decl, tree dest, int rank)
} }
/* Check for default initializer; sym->value is not enough as it is also
set for EXPR_NULL of allocatables. */
static bool
has_default_initializer (gfc_symbol *der)
{
gfc_component *c;
gcc_assert (der->attr.flavor == FL_DERIVED);
for (c = der->components; c; c = c->next)
if ((c->ts.type != BT_DERIVED && c->initializer)
|| (c->ts.type == BT_DERIVED
&& (!c->attr.pointer && has_default_initializer (c->ts.u.derived))))
break;
return c != NULL;
}
/* NULLIFY an allocatable/pointer array on function entry, free it on exit. /* NULLIFY an allocatable/pointer array on function entry, free it on exit.
Do likewise, recursively if necessary, with the allocatable components of Do likewise, recursively if necessary, with the allocatable components of
derived types. */ derived types. */
...@@ -6236,17 +6255,21 @@ gfc_trans_deferred_array (gfc_symbol * sym, tree body) ...@@ -6236,17 +6255,21 @@ gfc_trans_deferred_array (gfc_symbol * sym, tree body)
/* Get the descriptor type. */ /* Get the descriptor type. */
type = TREE_TYPE (sym->backend_decl); type = TREE_TYPE (sym->backend_decl);
if (sym_has_alloc_comp && !(sym->attr.pointer || sym->attr.allocatable)) if (sym_has_alloc_comp && !(sym->attr.pointer || sym->attr.allocatable))
{ {
if (!sym->attr.save) if (!sym->attr.save
&& !(TREE_STATIC (sym->backend_decl) && sym->attr.is_main_program))
{ {
rank = sym->as ? sym->as->rank : 0; if (sym->value == NULL || !has_default_initializer (sym->ts.u.derived))
tmp = gfc_nullify_alloc_comp (sym->ts.u.derived, descriptor, rank); {
gfc_add_expr_to_block (&fnblock, tmp); rank = sym->as ? sym->as->rank : 0;
if (sym->value) tmp = gfc_nullify_alloc_comp (sym->ts.u.derived, descriptor, rank);
gfc_add_expr_to_block (&fnblock, tmp);
}
else
{ {
tmp = gfc_init_default_dt (sym, NULL); tmp = gfc_init_default_dt (sym, NULL, false);
gfc_add_expr_to_block (&fnblock, tmp); gfc_add_expr_to_block (&fnblock, tmp);
} }
} }
......
...@@ -1258,9 +1258,15 @@ gfc_get_symbol_decl (gfc_symbol * sym) ...@@ -1258,9 +1258,15 @@ gfc_get_symbol_decl (gfc_symbol * sym)
if (sym->attr.assign) if (sym->attr.assign)
gfc_add_assign_aux_vars (sym); gfc_add_assign_aux_vars (sym);
if (TREE_STATIC (decl) && !sym->attr.use_assoc) if (TREE_STATIC (decl) && !sym->attr.use_assoc
&& (sym->attr.save || sym->ns->proc_name->attr.is_main_program
|| gfc_option.flag_max_stack_var_size == 0
|| sym->attr.data || sym->ns->proc_name->attr.flavor == FL_MODULE))
{ {
/* Add static initializer. */ /* Add static initializer. For procedures, it is only needed if
SAVE is specified otherwise they need to be reinitialized
every time the procedure is entered. The TREE_STATIC is
in this case due to -fmax-stack-var-size=. */
DECL_INITIAL (decl) = gfc_conv_initializer (sym->value, &sym->ts, DECL_INITIAL (decl) = gfc_conv_initializer (sym->value, &sym->ts,
TREE_TYPE (decl), sym->attr.dimension, TREE_TYPE (decl), sym->attr.dimension,
sym->attr.pointer || sym->attr.allocatable); sym->attr.pointer || sym->attr.allocatable);
...@@ -2981,9 +2987,10 @@ gfc_trans_vla_type_sizes (gfc_symbol *sym, stmtblock_t *body) ...@@ -2981,9 +2987,10 @@ gfc_trans_vla_type_sizes (gfc_symbol *sym, stmtblock_t *body)
/* Initialize a derived type by building an lvalue from the symbol /* Initialize a derived type by building an lvalue from the symbol
and using trans_assignment to do the work. */ and using trans_assignment to do the work. Set dealloc to false
if no deallocation prior the assignment is needed. */
tree tree
gfc_init_default_dt (gfc_symbol * sym, tree body) gfc_init_default_dt (gfc_symbol * sym, tree body, bool dealloc)
{ {
stmtblock_t fnblock; stmtblock_t fnblock;
gfc_expr *e; gfc_expr *e;
...@@ -2994,7 +3001,7 @@ gfc_init_default_dt (gfc_symbol * sym, tree body) ...@@ -2994,7 +3001,7 @@ gfc_init_default_dt (gfc_symbol * sym, tree body)
gcc_assert (!sym->attr.allocatable); gcc_assert (!sym->attr.allocatable);
gfc_set_sym_referenced (sym); gfc_set_sym_referenced (sym);
e = gfc_lval_expr_from_sym (sym); e = gfc_lval_expr_from_sym (sym);
tmp = gfc_trans_assignment (e, sym->value, false); tmp = gfc_trans_assignment (e, sym->value, false, dealloc);
if (sym->attr.dummy && (sym->attr.optional if (sym->attr.dummy && (sym->attr.optional
|| sym->ns->proc_name->attr.entry_master)) || sym->ns->proc_name->attr.entry_master))
{ {
...@@ -3045,7 +3052,7 @@ init_intent_out_dt (gfc_symbol * proc_sym, tree body) ...@@ -3045,7 +3052,7 @@ init_intent_out_dt (gfc_symbol * proc_sym, tree body)
gfc_add_expr_to_block (&fnblock, tmp); gfc_add_expr_to_block (&fnblock, tmp);
} }
else if (f->sym->value) else if (f->sym->value)
body = gfc_init_default_dt (f->sym, body); body = gfc_init_default_dt (f->sym, body, true);
} }
gfc_add_expr_to_block (&fnblock, body); gfc_add_expr_to_block (&fnblock, body);
...@@ -3148,7 +3155,7 @@ gfc_trans_deferred_vars (gfc_symbol * proc_sym, tree fnbody) ...@@ -3148,7 +3155,7 @@ gfc_trans_deferred_vars (gfc_symbol * proc_sym, tree fnbody)
&& sym->value && sym->value
&& !sym->attr.data && !sym->attr.data
&& sym->attr.save == SAVE_NONE) && sym->attr.save == SAVE_NONE)
fnbody = gfc_init_default_dt (sym, fnbody); fnbody = gfc_init_default_dt (sym, fnbody, false);
gfc_get_backend_locus (&loc); gfc_get_backend_locus (&loc);
gfc_set_backend_locus (&sym->declared_at); gfc_set_backend_locus (&sym->declared_at);
...@@ -3246,7 +3253,7 @@ gfc_trans_deferred_vars (gfc_symbol * proc_sym, tree fnbody) ...@@ -3246,7 +3253,7 @@ gfc_trans_deferred_vars (gfc_symbol * proc_sym, tree fnbody)
&& sym->value && sym->value
&& !sym->attr.data && !sym->attr.data
&& sym->attr.save == SAVE_NONE) && sym->attr.save == SAVE_NONE)
fnbody = gfc_init_default_dt (sym, fnbody); fnbody = gfc_init_default_dt (sym, fnbody, false);
else else
gcc_unreachable (); gcc_unreachable ();
} }
......
...@@ -2386,7 +2386,7 @@ gfc_conv_subref_array_arg (gfc_se * parmse, gfc_expr * expr, int g77, ...@@ -2386,7 +2386,7 @@ gfc_conv_subref_array_arg (gfc_se * parmse, gfc_expr * expr, int g77,
if (intent != INTENT_OUT) if (intent != INTENT_OUT)
{ {
tmp = gfc_trans_scalar_assign (&lse, &rse, expr->ts, true, false); tmp = gfc_trans_scalar_assign (&lse, &rse, expr->ts, true, false, true);
gfc_add_expr_to_block (&body, tmp); gfc_add_expr_to_block (&body, tmp);
gcc_assert (rse.ss == gfc_ss_terminator); gcc_assert (rse.ss == gfc_ss_terminator);
gfc_trans_scalarizing_loops (&loop, &body); gfc_trans_scalarizing_loops (&loop, &body);
...@@ -2484,7 +2484,7 @@ gfc_conv_subref_array_arg (gfc_se * parmse, gfc_expr * expr, int g77, ...@@ -2484,7 +2484,7 @@ gfc_conv_subref_array_arg (gfc_se * parmse, gfc_expr * expr, int g77,
gcc_assert (lse.ss == gfc_ss_terminator); gcc_assert (lse.ss == gfc_ss_terminator);
tmp = gfc_trans_scalar_assign (&lse, &rse, expr->ts, false, false); tmp = gfc_trans_scalar_assign (&lse, &rse, expr->ts, false, false, true);
gfc_add_expr_to_block (&body, tmp); gfc_add_expr_to_block (&body, tmp);
/* Generate the copying loops. */ /* Generate the copying loops. */
...@@ -4111,7 +4111,7 @@ gfc_trans_subarray_assign (tree dest, gfc_component * cm, gfc_expr * expr) ...@@ -4111,7 +4111,7 @@ gfc_trans_subarray_assign (tree dest, gfc_component * cm, gfc_expr * expr)
gfc_conv_expr (&rse, expr); gfc_conv_expr (&rse, expr);
tmp = gfc_trans_scalar_assign (&lse, &rse, cm->ts, true, false); tmp = gfc_trans_scalar_assign (&lse, &rse, cm->ts, true, false, true);
gfc_add_expr_to_block (&body, tmp); gfc_add_expr_to_block (&body, tmp);
gcc_assert (rse.ss == gfc_ss_terminator); gcc_assert (rse.ss == gfc_ss_terminator);
...@@ -4369,7 +4369,7 @@ gfc_trans_subcomponent_assign (tree dest, gfc_component * cm, gfc_expr * expr) ...@@ -4369,7 +4369,7 @@ gfc_trans_subcomponent_assign (tree dest, gfc_component * cm, gfc_expr * expr)
if (cm->ts.type == BT_CHARACTER) if (cm->ts.type == BT_CHARACTER)
lse.string_length = cm->ts.u.cl->backend_decl; lse.string_length = cm->ts.u.cl->backend_decl;
lse.expr = dest; lse.expr = dest;
tmp = gfc_trans_scalar_assign (&lse, &se, cm->ts, true, false); tmp = gfc_trans_scalar_assign (&lse, &se, cm->ts, true, false, true);
gfc_add_expr_to_block (&block, tmp); gfc_add_expr_to_block (&block, tmp);
} }
return gfc_finish_block (&block); return gfc_finish_block (&block);
...@@ -4897,11 +4897,12 @@ gfc_conv_string_parameter (gfc_se * se) ...@@ -4897,11 +4897,12 @@ gfc_conv_string_parameter (gfc_se * se)
/* Generate code for assignment of scalar variables. Includes character /* Generate code for assignment of scalar variables. Includes character
strings and derived types with allocatable components. */ strings and derived types with allocatable components.
If you know that the LHS has no allocations, set dealloc to false. */
tree tree
gfc_trans_scalar_assign (gfc_se * lse, gfc_se * rse, gfc_typespec ts, gfc_trans_scalar_assign (gfc_se * lse, gfc_se * rse, gfc_typespec ts,
bool l_is_temp, bool r_is_var) bool l_is_temp, bool r_is_var, bool dealloc)
{ {
stmtblock_t block; stmtblock_t block;
tree tmp; tree tmp;
...@@ -4949,7 +4950,7 @@ gfc_trans_scalar_assign (gfc_se * lse, gfc_se * rse, gfc_typespec ts, ...@@ -4949,7 +4950,7 @@ gfc_trans_scalar_assign (gfc_se * lse, gfc_se * rse, gfc_typespec ts,
the same as the rhs. This must be done following the assignment the same as the rhs. This must be done following the assignment
to prevent deallocating data that could be used in the rhs to prevent deallocating data that could be used in the rhs
expression. */ expression. */
if (!l_is_temp) if (!l_is_temp && dealloc)
{ {
tmp = gfc_evaluate_now (lse->expr, &lse->pre); tmp = gfc_evaluate_now (lse->expr, &lse->pre);
tmp = gfc_deallocate_alloc_comp (ts.u.derived, tmp, 0); tmp = gfc_deallocate_alloc_comp (ts.u.derived, tmp, 0);
...@@ -5279,10 +5280,13 @@ gfc_trans_array_constructor_copy (gfc_expr * expr1, gfc_expr * expr2) ...@@ -5279,10 +5280,13 @@ gfc_trans_array_constructor_copy (gfc_expr * expr1, gfc_expr * expr2)
/* Subroutine of gfc_trans_assignment that actually scalarizes the /* Subroutine of gfc_trans_assignment that actually scalarizes the
assignment. EXPR1 is the destination/LHS and EXPR2 is the source/RHS. */ assignment. EXPR1 is the destination/LHS and EXPR2 is the source/RHS.
init_flag indicates initialization expressions and dealloc that no
deallocate prior assignment is needed (if in doubt, set true). */
static tree static tree
gfc_trans_assignment_1 (gfc_expr * expr1, gfc_expr * expr2, bool init_flag) gfc_trans_assignment_1 (gfc_expr * expr1, gfc_expr * expr2, bool init_flag,
bool dealloc)
{ {
gfc_se lse; gfc_se lse;
gfc_se rse; gfc_se rse;
...@@ -5399,7 +5403,7 @@ gfc_trans_assignment_1 (gfc_expr * expr1, gfc_expr * expr2, bool init_flag) ...@@ -5399,7 +5403,7 @@ gfc_trans_assignment_1 (gfc_expr * expr1, gfc_expr * expr2, bool init_flag)
&& expr2->expr_type != EXPR_VARIABLE && expr2->expr_type != EXPR_VARIABLE
&& !gfc_is_constant_expr (expr2) && !gfc_is_constant_expr (expr2)
&& expr1->rank && !expr2->rank); && expr1->rank && !expr2->rank);
if (scalar_to_array) if (scalar_to_array && dealloc)
{ {
tmp = gfc_deallocate_alloc_comp (expr2->ts.u.derived, rse.expr, 0); tmp = gfc_deallocate_alloc_comp (expr2->ts.u.derived, rse.expr, 0);
gfc_add_expr_to_block (&loop.post, tmp); gfc_add_expr_to_block (&loop.post, tmp);
...@@ -5408,7 +5412,7 @@ gfc_trans_assignment_1 (gfc_expr * expr1, gfc_expr * expr2, bool init_flag) ...@@ -5408,7 +5412,7 @@ gfc_trans_assignment_1 (gfc_expr * expr1, gfc_expr * expr2, bool init_flag)
tmp = gfc_trans_scalar_assign (&lse, &rse, expr1->ts, tmp = gfc_trans_scalar_assign (&lse, &rse, expr1->ts,
l_is_temp || init_flag, l_is_temp || init_flag,
(expr2->expr_type == EXPR_VARIABLE) (expr2->expr_type == EXPR_VARIABLE)
|| scalar_to_array); || scalar_to_array, dealloc);
gfc_add_expr_to_block (&body, tmp); gfc_add_expr_to_block (&body, tmp);
if (lss == gfc_ss_terminator) if (lss == gfc_ss_terminator)
...@@ -5445,7 +5449,7 @@ gfc_trans_assignment_1 (gfc_expr * expr1, gfc_expr * expr2, bool init_flag) ...@@ -5445,7 +5449,7 @@ gfc_trans_assignment_1 (gfc_expr * expr1, gfc_expr * expr2, bool init_flag)
rse.string_length = string_length; rse.string_length = string_length;
tmp = gfc_trans_scalar_assign (&lse, &rse, expr1->ts, tmp = gfc_trans_scalar_assign (&lse, &rse, expr1->ts,
false, false); false, false, dealloc);
gfc_add_expr_to_block (&body, tmp); gfc_add_expr_to_block (&body, tmp);
} }
...@@ -5503,7 +5507,8 @@ copyable_array_p (gfc_expr * expr) ...@@ -5503,7 +5507,8 @@ copyable_array_p (gfc_expr * expr)
/* Translate an assignment. */ /* Translate an assignment. */
tree tree
gfc_trans_assignment (gfc_expr * expr1, gfc_expr * expr2, bool init_flag) gfc_trans_assignment (gfc_expr * expr1, gfc_expr * expr2, bool init_flag,
bool dealloc)
{ {
tree tmp; tree tmp;
...@@ -5546,19 +5551,19 @@ gfc_trans_assignment (gfc_expr * expr1, gfc_expr * expr2, bool init_flag) ...@@ -5546,19 +5551,19 @@ gfc_trans_assignment (gfc_expr * expr1, gfc_expr * expr2, bool init_flag)
} }
/* Fallback to the scalarizer to generate explicit loops. */ /* Fallback to the scalarizer to generate explicit loops. */
return gfc_trans_assignment_1 (expr1, expr2, init_flag); return gfc_trans_assignment_1 (expr1, expr2, init_flag, dealloc);
} }
tree tree
gfc_trans_init_assign (gfc_code * code) gfc_trans_init_assign (gfc_code * code)
{ {
return gfc_trans_assignment (code->expr1, code->expr2, true); return gfc_trans_assignment (code->expr1, code->expr2, true, false);
} }
tree tree
gfc_trans_assign (gfc_code * code) gfc_trans_assign (gfc_code * code)
{ {
return gfc_trans_assignment (code->expr1, code->expr2, false); return gfc_trans_assignment (code->expr1, code->expr2, false, true);
} }
......
...@@ -624,11 +624,12 @@ gfc_trans_omp_array_reduction (tree c, gfc_symbol *sym, locus where) ...@@ -624,11 +624,12 @@ gfc_trans_omp_array_reduction (tree c, gfc_symbol *sym, locus where)
build_int_cst (pvoid_type_node, 0), build_int_cst (pvoid_type_node, 0),
size, NULL, NULL); size, NULL, NULL);
gfc_conv_descriptor_data_set (&block, decl, ptr); gfc_conv_descriptor_data_set (&block, decl, ptr);
gfc_add_expr_to_block (&block, gfc_trans_assignment (e1, e2, false)); gfc_add_expr_to_block (&block, gfc_trans_assignment (e1, e2, false,
false));
stmt = gfc_finish_block (&block); stmt = gfc_finish_block (&block);
} }
else else
stmt = gfc_trans_assignment (e1, e2, false); stmt = gfc_trans_assignment (e1, e2, false, false);
if (TREE_CODE (stmt) != BIND_EXPR) if (TREE_CODE (stmt) != BIND_EXPR)
stmt = build3_v (BIND_EXPR, NULL, stmt, poplevel (1, 0, 0)); stmt = build3_v (BIND_EXPR, NULL, stmt, poplevel (1, 0, 0));
else else
...@@ -645,12 +646,13 @@ gfc_trans_omp_array_reduction (tree c, gfc_symbol *sym, locus where) ...@@ -645,12 +646,13 @@ gfc_trans_omp_array_reduction (tree c, gfc_symbol *sym, locus where)
stmtblock_t block; stmtblock_t block;
gfc_start_block (&block); gfc_start_block (&block);
gfc_add_expr_to_block (&block, gfc_trans_assignment (e3, e4, false)); gfc_add_expr_to_block (&block, gfc_trans_assignment (e3, e4, false,
true));
gfc_add_expr_to_block (&block, gfc_trans_dealloc_allocated (decl)); gfc_add_expr_to_block (&block, gfc_trans_dealloc_allocated (decl));
stmt = gfc_finish_block (&block); stmt = gfc_finish_block (&block);
} }
else else
stmt = gfc_trans_assignment (e3, e4, false); stmt = gfc_trans_assignment (e3, e4, false, true);
if (TREE_CODE (stmt) != BIND_EXPR) if (TREE_CODE (stmt) != BIND_EXPR)
stmt = build3_v (BIND_EXPR, NULL, stmt, poplevel (1, 0, 0)); stmt = build3_v (BIND_EXPR, NULL, stmt, poplevel (1, 0, 0));
else else
......
...@@ -1852,7 +1852,7 @@ forall_make_variable_temp (gfc_code *c, stmtblock_t *pre, stmtblock_t *post) ...@@ -1852,7 +1852,7 @@ forall_make_variable_temp (gfc_code *c, stmtblock_t *pre, stmtblock_t *post)
} }
tmp = gfc_trans_scalar_assign (&tse, &rse, e->ts, true, tmp = gfc_trans_scalar_assign (&tse, &rse, e->ts, true,
e->expr_type == EXPR_VARIABLE); e->expr_type == EXPR_VARIABLE, true);
gfc_add_expr_to_block (pre, tmp); gfc_add_expr_to_block (pre, tmp);
} }
gfc_free_expr (e); gfc_free_expr (e);
...@@ -2216,7 +2216,7 @@ generate_loop_for_temp_to_lhs (gfc_expr *expr, tree tmp1, tree count3, ...@@ -2216,7 +2216,7 @@ generate_loop_for_temp_to_lhs (gfc_expr *expr, tree tmp1, tree count3,
/* Use the scalar assignment. */ /* Use the scalar assignment. */
rse.string_length = lse.string_length; rse.string_length = lse.string_length;
tmp = gfc_trans_scalar_assign (&lse, &rse, expr->ts, false, false); tmp = gfc_trans_scalar_assign (&lse, &rse, expr->ts, false, true, true);
/* Form the mask expression according to the mask tree list. */ /* Form the mask expression according to the mask tree list. */
if (wheremask) if (wheremask)
...@@ -2314,7 +2314,7 @@ generate_loop_for_rhs_to_temp (gfc_expr *expr2, tree tmp1, tree count3, ...@@ -2314,7 +2314,7 @@ generate_loop_for_rhs_to_temp (gfc_expr *expr2, tree tmp1, tree count3,
/* Use the scalar assignment. */ /* Use the scalar assignment. */
lse.string_length = rse.string_length; lse.string_length = rse.string_length;
tmp = gfc_trans_scalar_assign (&lse, &rse, expr2->ts, true, tmp = gfc_trans_scalar_assign (&lse, &rse, expr2->ts, true,
expr2->expr_type == EXPR_VARIABLE); expr2->expr_type == EXPR_VARIABLE, true);
/* Form the mask expression according to the mask tree list. */ /* Form the mask expression according to the mask tree list. */
if (wheremask) if (wheremask)
...@@ -3091,7 +3091,7 @@ gfc_trans_forall_1 (gfc_code * code, forall_info * nested_forall_info) ...@@ -3091,7 +3091,7 @@ gfc_trans_forall_1 (gfc_code * code, forall_info * nested_forall_info)
else else
{ {
/* Use the normal assignment copying routines. */ /* Use the normal assignment copying routines. */
assign = gfc_trans_assignment (c->expr1, c->expr2, false); assign = gfc_trans_assignment (c->expr1, c->expr2, false, true);
/* Generate body and loops. */ /* Generate body and loops. */
tmp = gfc_trans_nested_forall_loop (nested_forall_info, tmp = gfc_trans_nested_forall_loop (nested_forall_info,
...@@ -3452,7 +3452,7 @@ gfc_trans_where_assign (gfc_expr *expr1, gfc_expr *expr2, ...@@ -3452,7 +3452,7 @@ gfc_trans_where_assign (gfc_expr *expr1, gfc_expr *expr2,
/* Use the scalar assignment as is. */ /* Use the scalar assignment as is. */
tmp = gfc_trans_scalar_assign (&lse, &rse, expr1->ts, tmp = gfc_trans_scalar_assign (&lse, &rse, expr1->ts,
loop.temp_ss != NULL, false); loop.temp_ss != NULL, false, true);
tmp = build3_v (COND_EXPR, maskexpr, tmp, build_empty_stmt (input_location)); tmp = build3_v (COND_EXPR, maskexpr, tmp, build_empty_stmt (input_location));
...@@ -3506,7 +3506,8 @@ gfc_trans_where_assign (gfc_expr *expr1, gfc_expr *expr2, ...@@ -3506,7 +3506,8 @@ gfc_trans_where_assign (gfc_expr *expr1, gfc_expr *expr2,
maskexpr); maskexpr);
/* Use the scalar assignment as is. */ /* Use the scalar assignment as is. */
tmp = gfc_trans_scalar_assign (&lse, &rse, expr1->ts, false, false); tmp = gfc_trans_scalar_assign (&lse, &rse, expr1->ts, false, false,
true);
tmp = build3_v (COND_EXPR, maskexpr, tmp, tmp = build3_v (COND_EXPR, maskexpr, tmp,
build_empty_stmt (input_location)); build_empty_stmt (input_location));
gfc_add_expr_to_block (&body, tmp); gfc_add_expr_to_block (&body, tmp);
...@@ -3913,8 +3914,9 @@ gfc_trans_where_3 (gfc_code * cblock, gfc_code * eblock) ...@@ -3913,8 +3914,9 @@ gfc_trans_where_3 (gfc_code * cblock, gfc_code * eblock)
gfc_conv_expr (&edse, edst); gfc_conv_expr (&edse, edst);
} }
tstmt = gfc_trans_scalar_assign (&tdse, &tsse, tdst->ts, false, false); tstmt = gfc_trans_scalar_assign (&tdse, &tsse, tdst->ts, false, false, true);
estmt = eblock ? gfc_trans_scalar_assign (&edse, &esse, edst->ts, false, false) estmt = eblock ? gfc_trans_scalar_assign (&edse, &esse, edst->ts, false,
false, true)
: build_empty_stmt (input_location); : build_empty_stmt (input_location);
tmp = build3_v (COND_EXPR, cexpr, tstmt, estmt); tmp = build3_v (COND_EXPR, cexpr, tstmt, estmt);
gfc_add_expr_to_block (&body, tmp); gfc_add_expr_to_block (&body, tmp);
...@@ -4176,7 +4178,7 @@ gfc_trans_allocate (gfc_code * code) ...@@ -4176,7 +4178,7 @@ gfc_trans_allocate (gfc_code * code)
} }
else else
tmp = gfc_trans_assignment (gfc_expr_to_initialize (expr), tmp = gfc_trans_assignment (gfc_expr_to_initialize (expr),
rhs, false); rhs, false, false);
gfc_free_expr (rhs); gfc_free_expr (rhs);
gfc_add_expr_to_block (&block, tmp); gfc_add_expr_to_block (&block, tmp);
} }
......
...@@ -320,7 +320,8 @@ void gfc_conv_subref_array_arg (gfc_se *, gfc_expr *, int, sym_intent, bool); ...@@ -320,7 +320,8 @@ void gfc_conv_subref_array_arg (gfc_se *, gfc_expr *, int, sym_intent, bool);
/* gfc_trans_* shouldn't call push/poplevel, use gfc_push/pop_scope */ /* gfc_trans_* shouldn't call push/poplevel, use gfc_push/pop_scope */
/* Generate code for a scalar assignment. */ /* Generate code for a scalar assignment. */
tree gfc_trans_scalar_assign (gfc_se *, gfc_se *, gfc_typespec, bool, bool); tree gfc_trans_scalar_assign (gfc_se *, gfc_se *, gfc_typespec, bool, bool,
bool);
/* Translate COMMON blocks. */ /* Translate COMMON blocks. */
void gfc_trans_common (gfc_namespace *); void gfc_trans_common (gfc_namespace *);
...@@ -401,7 +402,7 @@ tree gfc_get_symbol_decl (gfc_symbol *); ...@@ -401,7 +402,7 @@ tree gfc_get_symbol_decl (gfc_symbol *);
tree gfc_conv_initializer (gfc_expr *, gfc_typespec *, tree, bool, bool); tree gfc_conv_initializer (gfc_expr *, gfc_typespec *, tree, bool, bool);
/* Assign a default initializer to a derived type. */ /* Assign a default initializer to a derived type. */
tree gfc_init_default_dt (gfc_symbol *, tree); tree gfc_init_default_dt (gfc_symbol *, tree, bool);
/* Substitute a temporary variable in place of the real one. */ /* Substitute a temporary variable in place of the real one. */
void gfc_shadow_sym (gfc_symbol *, tree, gfc_saved_var *); void gfc_shadow_sym (gfc_symbol *, tree, gfc_saved_var *);
...@@ -485,7 +486,7 @@ tree gfc_deallocate_with_status (tree, tree, bool, gfc_expr*); ...@@ -485,7 +486,7 @@ tree gfc_deallocate_with_status (tree, tree, bool, gfc_expr*);
tree gfc_call_realloc (stmtblock_t *, tree, tree); tree gfc_call_realloc (stmtblock_t *, tree, tree);
/* Generate code for an assignment, includes scalarization. */ /* Generate code for an assignment, includes scalarization. */
tree gfc_trans_assignment (gfc_expr *, gfc_expr *, bool); tree gfc_trans_assignment (gfc_expr *, gfc_expr *, bool, bool);
/* Generate code for a pointer assignment. */ /* Generate code for a pointer assignment. */
tree gfc_trans_pointer_assignment (gfc_expr *, gfc_expr *); tree gfc_trans_pointer_assignment (gfc_expr *, gfc_expr *);
......
2010-04-06 Tobias Burnus <burnus@net-b.de>
PR fortran/43178
* gfortran.dg/alloc_comp_basics_1.f90: Update scan-tree-dump-times.
* gfortran.dg/alloc_comp_constructor_1.f90: Ditto.
* gfortran.dg/auto_dealloc_1.f90: Ditto.
2010-04-06 Richard Guenther <rguenther@suse.de> 2010-04-06 Richard Guenther <rguenther@suse.de>
PR tree-optimization/43627 PR tree-optimization/43627
......
...@@ -139,6 +139,6 @@ contains ...@@ -139,6 +139,6 @@ contains
end subroutine check_alloc2 end subroutine check_alloc2
end program alloc end program alloc
! { dg-final { scan-tree-dump-times "builtin_free" 21 "original" } } ! { dg-final { scan-tree-dump-times "builtin_free" 18 "original" } }
! { dg-final { cleanup-tree-dump "original" } } ! { dg-final { cleanup-tree-dump "original" } }
! { dg-final { cleanup-modules "alloc_m" } } ! { dg-final { cleanup-modules "alloc_m" } }
...@@ -104,5 +104,5 @@ contains ...@@ -104,5 +104,5 @@ contains
end function blaha end function blaha
end program test_constructor end program test_constructor
! { dg-final { scan-tree-dump-times "builtin_free" 21 "original" } } ! { dg-final { scan-tree-dump-times "builtin_free" 19 "original" } }
! { dg-final { cleanup-tree-dump "original" } } ! { dg-final { cleanup-tree-dump "original" } }
...@@ -53,7 +53,7 @@ contains ...@@ -53,7 +53,7 @@ contains
end module end module
! { dg-final { scan-tree-dump-times "__builtin_free" 5 "original" } } ! { dg-final { scan-tree-dump-times "__builtin_free" 4 "original" } }
! { dg-final { cleanup-modules "automatic_deallocation" } } ! { dg-final { cleanup-modules "automatic_deallocation" } }
! { dg-final { cleanup-tree-dump "original" } } ! { dg-final { cleanup-tree-dump "original" } }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment