aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2009-05-18 10:24:34 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2009-05-18 10:24:34 +0000
commitbfa31dad8a7ae5febc3a03fe6004d589019b77b2 (patch)
treeabb6405002d7187f691ad6cf028c033316497573
parentab7256e4ceed8d9829864d5605575766aa96efab (diff)
downloadgcc-bfa31dad8a7ae5febc3a03fe6004d589019b77b2.zip
gcc-bfa31dad8a7ae5febc3a03fe6004d589019b77b2.tar.gz
gcc-bfa31dad8a7ae5febc3a03fe6004d589019b77b2.tar.bz2
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
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/trans-expr.c11
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/array_memset_2.f906
4 files changed, 21 insertions, 7 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index a47a3ee..7a37d0e 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,9 @@
+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>
PR fortran/36947
diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c
index cf17598..a20d3ae 100644
--- a/gcc/fortran/trans-expr.c
+++ b/gcc/fortran/trans-expr.c
@@ -4428,11 +4428,14 @@ gfc_trans_zero_assign (gfc_expr * expr)
len = fold_build2 (MULT_EXPR, gfc_array_index_type, len,
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)))
- dest = gfc_build_addr_expr (pvoid_type_node, dest);
- else
- dest = fold_convert (pvoid_type_node, dest);
+ return build2 (MODIFY_EXPR, void_type_node,
+ dest, build_constructor (TREE_TYPE (dest), NULL));
+
+ /* Convert arguments to the correct types. */
+ dest = fold_convert (pvoid_type_node, dest);
len = fold_convert (size_type_node, len);
/* Construct call to __builtin_memset. */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index b79f8c0..73dc408 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+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>
PR fortran/36947
diff --git a/gcc/testsuite/gfortran.dg/array_memset_2.f90 b/gcc/testsuite/gfortran.dg/array_memset_2.f90
index 58ce8fe..7805f7b 100644
--- a/gcc/testsuite/gfortran.dg/array_memset_2.f90
+++ b/gcc/testsuite/gfortran.dg/array_memset_2.f90
@@ -20,8 +20,8 @@ program test
data c /2*1.0/
a(1,:) = 0. ! This can't be optimized to a memset.
- b(1,:) = 0. ! This is optimized to memset.
- c = 0. ! This is optimized to memset.
+ b(1,:) = 0. ! This is optimized to = {}.
+ c = 0. ! This is optimized to = {}.
d(:,1) = 0. ! This can't be otimized to a memset.
call bar(e)
@@ -33,6 +33,6 @@ program test
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-modules "foo" } }