re PR middle-end/41453 (use INTENT(out) for optimization)

2018-09-22  Thomas Koenig  <tkoenig@gcc.gnu.org>

	PR fortran/41453
	* trans.h (gfc_conv_expr_reference): Add optional argument
	add_clobber to prototype.
	(gfc_conv_procedure_call):  Set add_clobber argument to
	gfc_conv_procedure_reference to true for scalar, INTENT(OUT),
	non-pointer, non-allocatable, non-dummy variables whose type
	is neither BT_CHARACTER, BT_DERIVED or BT_CLASS, but only if
	the procedure is not elemental.
	* trans-expr.c (gfc_conv_procedure_reference): Add clobber
	statement before call if add_clobber is set.

2018-09-22  Thomas Koenig  <tkoenig@gcc.gnu.org>

	PR fortran/41453
	* gfortran.dg/intent_optimize_2.f90: New test.

From-SVN: r264506
This commit is contained in:
Thomas Koenig 2018-09-22 18:44:01 +00:00
parent 73a958c67e
commit 056e6860b3
5 changed files with 67 additions and 3 deletions

View file

@ -1,3 +1,16 @@
2018-09-22 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/41453
* trans.h (gfc_conv_expr_reference): Add optional argument
add_clobber to prototype.
(gfc_conv_procedure_call): Set add_clobber argument to
gfc_conv_procedure_reference to true for scalar, INTENT(OUT),
non-pointer, non-allocatable, non-dummy variables whose type
is neither BT_CHARACTER, BT_DERIVED or BT_CLASS, but only if
the procedure is not elemental.
* trans-expr.c (gfc_conv_procedure_reference): Add clobber
statement before call if add_clobber is set.
2018-09-22 Paul Thomas <pault@gcc.gnu.org>
PR fortran/85603

View file

@ -5276,8 +5276,17 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym,
}
}
else
gfc_conv_expr_reference (&parmse, e);
{
bool add_clobber;
add_clobber = fsym && fsym->attr.intent == INTENT_OUT
&& !fsym->attr.allocatable && !fsym->attr.pointer
&& !e->symtree->n.sym->attr.pointer
&& !e->symtree->n.sym->attr.dummy /* See PR 41453. */
&& e->ts.type != BT_CHARACTER && e->ts.type != BT_DERIVED
&& e->ts.type != BT_CLASS && !sym->attr.elemental;
gfc_conv_expr_reference (&parmse, e, add_clobber);
}
/* Catch base objects that are not variables. */
if (e->ts.type == BT_CLASS
&& e->expr_type != EXPR_VARIABLE
@ -8060,7 +8069,7 @@ gfc_conv_expr_type (gfc_se * se, gfc_expr * expr, tree type)
values only. */
void
gfc_conv_expr_reference (gfc_se * se, gfc_expr * expr)
gfc_conv_expr_reference (gfc_se * se, gfc_expr * expr, bool add_clobber)
{
gfc_ss *ss;
tree var;
@ -8100,6 +8109,16 @@ gfc_conv_expr_reference (gfc_se * se, gfc_expr * expr)
gfc_add_block_to_block (&se->pre, &se->post);
se->expr = var;
}
else if (add_clobber)
{
tree clobber;
tree var;
/* FIXME: This fails if var is passed by reference, see PR
41453. */
var = expr->symtree->n.sym->backend_decl;
clobber = build_clobber (TREE_TYPE (var));
gfc_add_modify (&se->pre, var, clobber);
}
return;
}

View file

@ -485,7 +485,8 @@ tree gfc_build_compare_string (tree, tree, tree, tree, int, enum tree_code);
void gfc_conv_expr (gfc_se * se, gfc_expr * expr);
void gfc_conv_expr_val (gfc_se * se, gfc_expr * expr);
void gfc_conv_expr_lhs (gfc_se * se, gfc_expr * expr);
void gfc_conv_expr_reference (gfc_se * se, gfc_expr *);
void gfc_conv_expr_reference (gfc_se * se, gfc_expr * expr,
bool add_clobber = false);
void gfc_conv_expr_type (gfc_se * se, gfc_expr *, tree);

View file

@ -1,3 +1,8 @@
2018-09-22 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/41453
* gfortran.dg/intent_optimize_2.f90: New test.
2018-09-22 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR fortran/87318

View file

@ -0,0 +1,26 @@
! { dg-do compile }
! { dg-options "-O -fno-inline -fdump-tree-optimized -fdump-tree-original" }
! PR fortran/41453
! Check that there is one clobber in the *.original tree, plus that
! the constant 123456789 has been removed due to the INTENT(OUT).
module x
implicit none
contains
subroutine foo(a)
integer, intent(out) :: a
a = 42
end subroutine foo
end module x
program main
use x
implicit none
integer :: a
a = 123456789
call foo(a)
print *,a
end program main
! { dg-final { scan-tree-dump-times "123456789" 0 "optimized" } }
! { dg-final { scan-tree-dump-times "CLOBBER" 1 "original" } }