re PR tree-optimization/40168 (finding common subexpressions)
authorRichard Guenther <rguenther@suse.de>
Mon, 18 May 2009 10:24:34 +0000 (10:24 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Mon, 18 May 2009 10:24:34 +0000 (10:24 +0000)
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

gcc/fortran/ChangeLog
gcc/fortran/trans-expr.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/array_memset_2.f90

index a47a3ee..7a37d0e 100644 (file)
@@ -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
index cf17598..a20d3ae 100644 (file)
@@ -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.  */
index b79f8c0..73dc408 100644 (file)
@@ -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
index 58ce8fe..7805f7b 100644 (file)
@@ -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" } }