]> gcc.gnu.org Git - gcc.git/commitdiff
tree.def (RTL_EXPR): Update documentation.
authorMark Mitchell <mark@codesourcery.com>
Sun, 5 Mar 2000 20:43:44 +0000 (20:43 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Sun, 5 Mar 2000 20:43:44 +0000 (20:43 +0000)
* tree.def (RTL_EXPR): Update documentation.
* tree.h (RTL_EXPR_HAS_NO_SCOPE): New macro.
* expr.c (expand_expr): Handle RTL_EXPR_HAS_NO_SCOPE.
* function.c (preserve_rtl_expr_temp): New function.
(preserve_rtl_expr_temps): Likewise.
(preserve_rtl_expr_result): Use it.

From-SVN: r32344

gcc/ChangeLog
gcc/expr.c
gcc/function.c
gcc/tree.def
gcc/tree.h

index fa779241d5637f828acb3a9fec3e6ca19a5b2e4f..59c4a1409871dcebc05242290bd11c820ae11a17 100644 (file)
@@ -1,5 +1,12 @@
 2000-03-05  Mark Mitchell  <mark@codesourcery.com>
 
+       * tree.def (RTL_EXPR): Update documentation.
+       * tree.h (RTL_EXPR_HAS_NO_SCOPE): New macro.
+       * expr.c (expand_expr): Handle RTL_EXPR_HAS_NO_SCOPE.
+       * function.c (preserve_rtl_expr_temp): New function.
+       (preserve_rtl_expr_temps): Likewise.
+       (preserve_rtl_expr_result): Use it.
+
        Revert this patch:
        2000-03-04  Mark Mitchell  <mark@codesourcery.com>
 
index fb266e272264d85cf69ef821761e878909483743..28b3b442ba0994d294fecb8d13f102df94c8bc2a 100644 (file)
@@ -6306,8 +6306,13 @@ expand_expr (exp, target, tmode, modifier)
          emit_insns (RTL_EXPR_SEQUENCE (exp));
          RTL_EXPR_SEQUENCE (exp) = const0_rtx;
        }
-      preserve_rtl_expr_result (RTL_EXPR_RTL (exp));
-      free_temps_for_rtl_expr (exp);
+      if (RTL_EXPR_HAS_NO_SCOPE (exp))
+       preserve_rtl_expr_temps (exp);
+      else
+       {
+         preserve_rtl_expr_result (RTL_EXPR_RTL (exp));
+         free_temps_for_rtl_expr (exp);
+       }
       return RTL_EXPR_RTL (exp);
 
     case CONSTRUCTOR:
index 78c5ab85ef13fe3f3af54629417aef432e8cc319..fe7f61b7f8a3d23b31a66ed48e00f8ab76b629a6 100644 (file)
@@ -293,6 +293,7 @@ static void mark_function_chain PARAMS ((void *));
 static void prepare_function_start PARAMS ((void));
 static void do_clobber_return_reg PARAMS ((rtx, void *));
 static void do_use_return_reg PARAMS ((rtx, void *));
+static void preserve_rtl_expr_temp PARAMS ((struct temp_slot *));
 \f
 /* Pointer to chain of `struct function' for containing functions.  */
 struct function *outer_function_chain;
@@ -1129,6 +1130,36 @@ preserve_temp_slots (x)
       p->level--;
 }
 
+/* Preserve the temporary slot given by P (originally created during
+   the building of an RTL_EXPR) at least as long as things in our
+   current scope.  */
+
+static void
+preserve_rtl_expr_temp (p)
+     struct temp_slot *p;
+{
+  /* Set the slot level to that of the currently prevailing scope.  */
+  p->level = MIN (p->level, temp_slot_level);
+  /* This slot is no longer associated with the RTL_EXPR from which it
+     originated.  */
+  p->rtl_expr = NULL_TREE;
+}
+
+/* Preserve the temporary slots created during the building of the
+   RTL_EXPR given by T at least as long as things in our current
+   scope.  */
+
+void
+preserve_rtl_expr_temps (t)
+     tree t;
+{
+  struct temp_slot *p;
+
+  for (p = temp_slots; p; p = p->next)
+    if (p->in_use && p->rtl_expr == t)
+      preserve_rtl_expr_temp (p);
+}
+
 /* X is the result of an RTL_EXPR.  If it is a temporary slot associated
    with that RTL_EXPR, promote it into a temporary slot at the present
    level so it will not be freed when we free slots made in the
@@ -1148,11 +1179,8 @@ preserve_rtl_expr_result (x)
   /* If we can find a match, move it to our level unless it is already at
      an upper level.  */
   p = find_temp_slot_from_address (XEXP (x, 0));
-  if (p != 0)
-    {
-      p->level = MIN (p->level, temp_slot_level);
-      p->rtl_expr = 0;
-    }
+  if (p)
+    preserve_rtl_expr_temp (p);
 
   return;
 }
index 551d5cb17582cb52705fcb687b313e639b36b548..d691150fafb7658a6d3f4468ab1de2798e5ed52a 100644 (file)
@@ -686,10 +686,14 @@ DEFTREECODE (SAVE_EXPR, "save_expr", 'e', 3)
    but where we must re-expand.  */
 DEFTREECODE (UNSAVE_EXPR, "unsave_expr", 'e', 1)
 
-/* Represents something whose RTL has already been expanded
-   as a sequence which should be emitted when this expression is expanded.
-   The first operand is the RTL to emit.  It is the first of a chain of insns.
-   The second is the RTL expression for the result.  */
+/* Represents something whose RTL has already been expanded as a
+   sequence which should be emitted when this expression is expanded.
+   The first operand is the RTL to emit.  It is the first of a chain
+   of insns.  The second is the RTL expression for the result.  If
+   RTL_EXPR_HAS_NO_SCOPE does not hold for this expression, then all
+   temporaries created within this RTL_EXPR (except for the
+   RTL_EXPR_RTL) are out-of-scope after the RTL_EXPR is expanded.  (In
+   other words, their stack slots may be reused.)  */
 DEFTREECODE (RTL_EXPR, "rtl_expr", 'e', 2)
 
 /* & in C.  Value is the address at which the operand's value resides.
index 1a827581c6b3d573c95250ff5b8eb60aee6a89a6..722b219393f309edc0dfc761bc2b17ca803c36d4 100644 (file)
@@ -749,6 +749,10 @@ struct tree_vec
 /* In a RTL_EXPR node.  */
 #define RTL_EXPR_SEQUENCE(NODE) (*(struct rtx_def **) &EXPR_CHECK (NODE)->exp.operands[0])
 #define RTL_EXPR_RTL(NODE) (*(struct rtx_def **) &EXPR_CHECK (NODE)->exp.operands[1])
+/* Nonzero if the RTL_EXPR does not define a scope, i.e., if
+   temporaries defined during its scope should persist even after the
+   RTL_EXPR has been expanded.  */
+#define RTL_EXPR_HAS_NO_SCOPE(NODE) TREE_ASM_WRITTEN (NODE)
 
 /* In a CALL_EXPR node.  */
 #define CALL_EXPR_RTL(NODE) (*(struct rtx_def **) &EXPR_CHECK (NODE)->exp.operands[2])
This page took 0.102135 seconds and 5 git commands to generate.