Commit bfa31dad by Richard Guenther Committed by Richard Biener

re PR tree-optimization/40168 (finding common subexpressions)

2009-05-18  Richard Guenther  <rguenther@suse.de>

	PR fortran/40168
	* trans-expr.c (gfc_trans_zero_assign): For local array
	destinations use an assignment from an empty constructor.

	* gfortran.dg/array_memset_2.f90: Adjust.

From-SVN: r147659
parent ab7256e4
2009-05-18 Richard Guenther <rguenther@suse.de>
PR fortran/40168
* trans-expr.c (gfc_trans_zero_assign): For local array
destinations use an assignment from an empty constructor.
2009-05-18 Janus Weil <janus@gcc.gnu.org> 2009-05-18 Janus Weil <janus@gcc.gnu.org>
PR fortran/36947 PR fortran/36947
......
...@@ -4428,11 +4428,14 @@ gfc_trans_zero_assign (gfc_expr * expr) ...@@ -4428,11 +4428,14 @@ gfc_trans_zero_assign (gfc_expr * expr)
len = fold_build2 (MULT_EXPR, gfc_array_index_type, len, len = fold_build2 (MULT_EXPR, gfc_array_index_type, len,
fold_convert (gfc_array_index_type, tmp)); fold_convert (gfc_array_index_type, tmp));
/* Convert arguments to the correct types. */ /* If we are zeroing a local array avoid taking its address by emitting
a = {} instead. */
if (!POINTER_TYPE_P (TREE_TYPE (dest))) if (!POINTER_TYPE_P (TREE_TYPE (dest)))
dest = gfc_build_addr_expr (pvoid_type_node, dest); return build2 (MODIFY_EXPR, void_type_node,
else dest, build_constructor (TREE_TYPE (dest), NULL));
dest = fold_convert (pvoid_type_node, dest);
/* Convert arguments to the correct types. */
dest = fold_convert (pvoid_type_node, dest);
len = fold_convert (size_type_node, len); len = fold_convert (size_type_node, len);
/* Construct call to __builtin_memset. */ /* Construct call to __builtin_memset. */
......
2009-05-18 Richard Guenther <rguenther@suse.de>
PR fortran/40168
* gfortran.dg/array_memset_2.f90: Adjust.
2009-05-18 Janus Weil <janus@gcc.gnu.org> 2009-05-18 Janus Weil <janus@gcc.gnu.org>
PR fortran/36947 PR fortran/36947
......
...@@ -20,8 +20,8 @@ program test ...@@ -20,8 +20,8 @@ program test
data c /2*1.0/ data c /2*1.0/
a(1,:) = 0. ! This can't be optimized to a memset. a(1,:) = 0. ! This can't be optimized to a memset.
b(1,:) = 0. ! This is optimized to memset. b(1,:) = 0. ! This is optimized to = {}.
c = 0. ! This is optimized to memset. c = 0. ! This is optimized to = {}.
d(:,1) = 0. ! This can't be otimized to a memset. d(:,1) = 0. ! This can't be otimized to a memset.
call bar(e) call bar(e)
...@@ -33,6 +33,6 @@ program test ...@@ -33,6 +33,6 @@ program test
end program end program
! { dg-final { scan-tree-dump-times "memset" 2 "original" } } ! { dg-final { scan-tree-dump-times "= {}" 2 "original" } }
! { dg-final { cleanup-tree-dump "original" } } ! { dg-final { cleanup-tree-dump "original" } }
! { dg-final { cleanup-modules "foo" } } ! { dg-final { cleanup-modules "foo" } }
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