OSDN Git Service

* tree.c (unsave_expr_now_r, unsafe_for_reeval): Properly do TREE_LIST.
authorkenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 12 Apr 2000 13:10:42 +0000 (13:10 +0000)
committerkenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 12 Apr 2000 13:10:42 +0000 (13:10 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@33104 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/tree.c

index a9fd304..29743ba 100644 (file)
@@ -1,5 +1,7 @@
 Wed Apr 12 08:47:38 2000  Richard Kenner  <kenner@vlsi1.ultra.nyu.edu>
 
+       * tree.c (unsave_expr_now_r, unsafe_for_reeval): Properly do TREE_LIST.
+
        * print-rtl.c (print_rtx): For CALL_PLACEHOLDER, output the
        CALL_INSN from the normal case.
 
index 66078e5..24eca04 100644 (file)
@@ -2649,27 +2649,22 @@ unsave_expr_now_r (expr)
   unsave_expr_1 (expr);
 
   code = TREE_CODE (expr);
-  if (code == CALL_EXPR 
-      && TREE_OPERAND (expr, 1)
-      && TREE_CODE (TREE_OPERAND (expr, 1)) == TREE_LIST)
-    {
-      tree exp = TREE_OPERAND (expr, 1);
-      while (exp)
-       {
-         unsave_expr_now_r (TREE_VALUE (exp));
-         exp = TREE_CHAIN (exp);
-       }
-    }
   switch (TREE_CODE_CLASS (code))
     {
     case 'c':  /* a constant */
     case 't':  /* a type node */
-    case 'x':  /* something random, like an identifier or an ERROR_MARK.  */
     case 'd':  /* A decl node */
     case 'b':  /* A block node */
       break;
 
+    case 'x':  /* miscellaneous: e.g., identifier, TREE_LIST or ERROR_MARK.  */
+      if (code == TREE_LIST)
+       {
+         unsave_expr_now_r (TREE_VALUE (expr));
+         unsave_expr_now_r (TREE_CHAIN (expr));
+       }
+      break;
+
     case 'e':  /* an expression */
     case 'r':  /* a reference */
     case 's':  /* an expression with side effects */
@@ -2724,8 +2719,10 @@ int
 unsafe_for_reeval (expr)
      tree expr;
 {
+  int unsafeness = 0;
   enum tree_code code;
-  register int i, tmp, unsafeness;
+  int i, tmp;
+  tree exp;
   int first_rtl;
 
   if (expr == NULL_TREE)
@@ -2733,7 +2730,6 @@ unsafe_for_reeval (expr)
 
   code = TREE_CODE (expr);
   first_rtl = first_rtl_op (code);
-  unsafeness = 0;
 
   switch (code)
     {
@@ -2741,20 +2737,18 @@ unsafe_for_reeval (expr)
     case RTL_EXPR:
       return 2;
 
-    case CALL_EXPR:
-      if (TREE_OPERAND (expr, 1)
-         && TREE_CODE (TREE_OPERAND (expr, 1)) == TREE_LIST)
+    case TREE_LIST:
+      for (exp = expr; exp != 0; exp = TREE_CHAIN (exp))
        {
-         tree exp = TREE_OPERAND (expr, 1);
-         while (exp)
-           {
-             tmp = unsafe_for_reeval (TREE_VALUE (exp));
-             if (tmp > 1)
-               return tmp;
-             exp = TREE_CHAIN (exp);
-           }
+         tmp = unsafe_for_reeval (TREE_VALUE (exp));
+         unsafeness = MAX (tmp, unsafeness);
        }
-      return 1;
+
+      return unsafeness;
+
+    case CALL_EXPR:
+      tmp = unsafe_for_reeval (TREE_OPERAND (expr, 1));
+      return MAX (tmp, 1);
 
     case TARGET_EXPR:
       unsafeness = 1;
@@ -2783,9 +2777,9 @@ unsafe_for_reeval (expr)
       for (i = first_rtl - 1; i >= 0; i--)
        {
          tmp = unsafe_for_reeval (TREE_OPERAND (expr, i));
-         if (tmp > unsafeness)
-           unsafeness = tmp;
+         unsafeness = MAX (tmp, unsafeness);
        }
+
       return unsafeness;
 
     default: