gimplify.c (gimplify_expr): Don't replace with DECL_INITIAL if fb_lvalue.
authorRichard Henderson <rth@redhat.com>
Fri, 30 Jul 2004 22:55:30 +0000 (15:55 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Fri, 30 Jul 2004 22:55:30 +0000 (15:55 -0700)
        * gimplify.c (gimplify_expr) <case CONST_DECL>: Don't replace
        with DECL_INITIAL if fb_lvalue.
        * tree-gimple.c (is_gimple_id): Add CONST_DECL.
        * tree-pretty-print.c (dump_decl_name): Dump unnamed CONST_DECL
        with <Cxxx>.
        * tree-ssa-ccp.c (maybe_fold_stmt_indirect): Fold CONST_DECL.
fortran/
        * trans-expr.c (gfc_conv_expr_reference): Create a CONST_DECL
        for TREE_CONSTANTs.
testsuite/
        * gfortran.fortran-torture/execute/intrinsic_rrspacing.f90: Fix
        write to constant argument.
        * gfortran.fortran-torture/execute/intrinsic_scale.f90: Likewise.

From-SVN: r85365

gcc/ChangeLog
gcc/fortran/ChangeLog
gcc/fortran/trans-expr.c
gcc/gimplify.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.fortran-torture/execute/intrinsic_rrspacing.f90
gcc/testsuite/gfortran.fortran-torture/execute/intrinsic_scale.f90
gcc/tree-gimple.c
gcc/tree-pretty-print.c
gcc/tree-ssa-ccp.c

index b36cc87ae2f89a434cf589abc3aae0d6a15ae67c..e46f01bd7069aeb6f8a2be00ee77a14e72560da4 100644 (file)
@@ -1,3 +1,12 @@
+2004-07-30  Richard Henderson  <rth@redhat.com>
+
+       * gimplify.c (gimplify_expr) <case CONST_DECL>: Don't replace
+       with DECL_INITIAL if fb_lvalue.
+       * tree-gimple.c (is_gimple_id): Add CONST_DECL.
+       * tree-pretty-print.c (dump_decl_name): Dump unnamed CONST_DECL
+       with <Cxxx>.
+       * tree-ssa-ccp.c (maybe_fold_stmt_indirect): Fold CONST_DECL.
+
 2004-07-30  Diego Novillo  <dnovillo@redhat.com>
 
        * tree-ssa-alias.c (compute_points_to_and_addr_escape): If a
index 1e0d825cf68f12cc3ed13565175841a16f48e755..677342764c37af1393e69ce2957ac5ef28e85e17 100644 (file)
@@ -1,3 +1,8 @@
+2004-07-30  Richard Henderson  <rth@redhat.com>
+
+       * trans-expr.c (gfc_conv_expr_reference): Create a CONST_DECL
+       for TREE_CONSTANTs.
+
 2004-07-25  Richard Henderson  <rth@redhat.com>
 
        * trans-decl.c (gfc_build_function_decl): Set DECL_ARTIFICIAL
index 4745f0cc3be801f82ba4b62845a382dd59f4e2da..81d879e5dde919b05aff4d7d41361e4153a7c410 100644 (file)
@@ -1612,8 +1612,17 @@ gfc_conv_expr_reference (gfc_se * se, gfc_expr * expr)
   gfc_conv_expr (se, expr);
 
   /* Create a temporary var to hold the value.  */
-  var = gfc_create_var (TREE_TYPE (se->expr), NULL);
-  gfc_add_modify_expr (&se->pre, var, se->expr);
+  if (TREE_CONSTANT (se->expr))
+    {
+      var = build_decl (CONST_DECL, NULL, TREE_TYPE (se->expr));
+      DECL_INITIAL (var) = se->expr;
+      pushdecl (var);
+    }
+  else
+    {
+      var = gfc_create_var (TREE_TYPE (se->expr), NULL);
+      gfc_add_modify_expr (&se->pre, var, se->expr);
+    }
   gfc_add_block_to_block (&se->pre, &se->post);
 
   /* Take the address of that value.  */
index 304a20b108259c4aac8fb939d61f875cff6b8edd..53cf1feac32494457a51bd9e0b5bb75d7d362e47 100644 (file)
@@ -3576,7 +3576,14 @@ gimplify_expr (tree *expr_p, tree *pre_p, tree *post_p,
          break;
 
        case CONST_DECL:
-         *expr_p = DECL_INITIAL (*expr_p);
+         /* If we require an lvalue, such as for ADDR_EXPR, retain the
+            CONST_DECL node.  Otherwise the decl is replacable by its
+            value.  */
+         /* ??? Should be == fb_lvalue, but ADDR_EXPR passes fb_either.  */
+         if (fallback & fb_lvalue)
+           ret = GS_ALL_DONE;
+         else
+           *expr_p = DECL_INITIAL (*expr_p);
          break;
 
        case DECL_EXPR:
index aaa540cc2bdc888aa338a5457f0bab1dabb62f51..7280c2da47815867790de1cf3c0750c93d62e64a 100644 (file)
@@ -1,3 +1,9 @@
+2004-07-30  Richard Henderson  <rth@redhat.com>
+
+       * gfortran.fortran-torture/execute/intrinsic_rrspacing.f90: Fix
+       write to constant argument.
+       * gfortran.fortran-torture/execute/intrinsic_scale.f90: Likewise.
+
 2004-07-30  Richard Henderson  <rth@redhat.com>
 
         * gfortran.fortran-torture/execute/intrinsic_nearest.f90: Disable
index 0f411a633b2fddfd89c284e2795953edd53ec941..e74cf6494fc5e944cfb641a78f9360f4a68ce155 100644 (file)
@@ -8,18 +8,20 @@ program test_rrspacing
   call test_real8(33.0_8)
   call test_real8(-33.0_8)
 end
-subroutine test_real4(x)
-  real x,y
+subroutine test_real4(orig)
+  real x,y,orig
   integer p
+  x = orig
   p = 24
   y = abs (x * 2.0 ** (- exponent (x))) * (2.0 ** p)
   x = rrspacing(x)
   if (abs (x - y) .gt. abs(x * 1e-6)) call abort
 end
 
-subroutine test_real8(x)
-  real*8 x,y,t
+subroutine test_real8(orig)
+  real*8 x,y,t,orig
   integer p
+  x = orig
   p = 53
   y = abs (x * 2.0 ** (- exponent (x))) * (2.0 ** p)
   x = rrspacing(x)
index 09acda5261cf9a99fe90f11d7a8571bc7c3c03dd..775c4d7b4b5225716dc9aeff31adb0014afd56b0 100644 (file)
@@ -10,17 +10,19 @@ program test_scale
   call test_real8 (33.0_8, -4)
   call test_real8 (-33._8, 4)
 end
-subroutine test_real4 (x, i)
-  real x,y
+subroutine test_real4 (orig, i)
+  real x,y,orig
   integer i
+  x = orig
   y = x * (2.0 ** i)
   x = scale (x, i)
   if (abs (x - y) .gt. abs(x * 1e-6)) call abort
 end
 
-subroutine test_real8 (x, i)
-  real*8 x,y
+subroutine test_real8 (orig, i)
+  real*8 x,y,orig
   integer i
+  x = orig
   y = x * (2.0 ** i)
   x = scale (x, i)
   if (abs (x - y) .gt. abs(x * 1e-6)) call abort
index 4f26a084fc03f087f8a5b86ccc9aa27d92eab3dc..413395ae5314cde2a774c6af274dc8a75f1acf15 100644 (file)
@@ -413,6 +413,7 @@ is_gimple_id (tree t)
   return (is_gimple_variable (t)
          || TREE_CODE (t) == FUNCTION_DECL
          || TREE_CODE (t) == LABEL_DECL
+         || TREE_CODE (t) == CONST_DECL
          /* Allow string constants, since they are addressable.  */
          || TREE_CODE (t) == STRING_CST);
 }
index d1479e4869d3e6d1049756bf3e6ce1f5b5e4d2b8..a3a3a01d75e90b373f92502a9569643e554509f5 100644 (file)
@@ -165,7 +165,10 @@ dump_decl_name (pretty_printer *buffer, tree node, int flags)
        pp_printf (buffer, "<L" HOST_WIDE_INT_PRINT_DEC ">",
                   LABEL_DECL_UID (node));
       else
-       pp_printf (buffer, "<D%u>", DECL_UID (node));
+       {
+         char c = TREE_CODE (node) == CONST_DECL ? 'C' : 'D';
+         pp_printf (buffer, "<%c%u>", c, DECL_UID (node));
+       }
     }
 }
 
index c8ab92a896beab2cf8496e4c1f89a89882a212ff..f883e373cc4911c2ecc5c7bbe22b764a75b1bcb6 100644 (file)
@@ -1868,6 +1868,11 @@ maybe_fold_stmt_indirect (tree expr, tree base, tree offset)
       /* Strip the ADDR_EXPR.  */
       base = TREE_OPERAND (base, 0);
 
+      /* Fold away CONST_DECL to its value, if the type is scalar.  */
+      if (TREE_CODE (base) == CONST_DECL
+         && is_gimple_min_invariant (DECL_INITIAL (base)))
+       return DECL_INITIAL (base);
+
       /* Try folding *(&B+O) to B[X].  */
       t = maybe_fold_offset_to_array_ref (base, offset, TREE_TYPE (expr));
       if (t)