tree-ssa-ccp.c (set_rhs): Change function to return a bool.
authorRoger Sayle <roger@eyesopen.com>
Sun, 4 Jul 2004 18:41:05 +0000 (18:41 +0000)
committerRoger Sayle <sayle@gcc.gnu.org>
Sun, 4 Jul 2004 18:41:05 +0000 (18:41 +0000)
* tree-ssa-ccp.c (set_rhs): Change function to return a bool.
Ensure the replacement rhs is valid gimple before performing
the substitution.  Return false if these sanity checks fail.
(fold_stmt): Only set changed to true, if set_rhs returns true.
(execute_fold_all_builtins): Only call modify_stmt if set_rhs
succeeds.

From-SVN: r84091

gcc/ChangeLog
gcc/tree-ssa-ccp.c

index 86ebbf54b4a385825042bd53e7903a8c9ad182de..a4d210ce78914074882f92e7b8d8ee6ef4b0700f 100644 (file)
@@ -1,3 +1,12 @@
+2004-07-04  Roger Sayle  <roger@eyesopen.com>
+
+       * tree-ssa-ccp.c (set_rhs): Change function to return a bool.
+       Ensure the replacement rhs is valid gimple before performing
+       the substitution.  Return false if these sanity checks fail.
+       (fold_stmt): Only set changed to true, if set_rhs returns true.
+       (execute_fold_all_builtins): Only call modify_stmt if set_rhs
+       succeeds.
+
 2004-07-04  Richard Henderson  <rth@redhat.com>
 
        PR c/16348
index 0b990717b33ce5d28312d88a0e6f857c39f36c28..70b91f26520179f36eba86e1e6fa34c75ce09741 100644 (file)
@@ -1,5 +1,5 @@
 /* Conditional constant propagation pass for the GNU compiler.
-   Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+   Copyright (C) 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
    Adapted from original RTL SSA-CCP by Daniel Berlin <dberlin@dberlin.org>
    Adapted to GIMPLE trees by Diego Novillo <dnovillo@redhat.com>
 
@@ -141,7 +141,7 @@ static void dump_lattice_value (FILE *, const char *, value);
 static bool replace_uses_in (tree, bool *);
 static latticevalue likely_value (tree);
 static tree get_rhs (tree);
-static void set_rhs (tree *, tree);
+static bool set_rhs (tree *, tree);
 static value *get_value (tree);
 static value get_default_value (tree);
 static tree ccp_fold_builtin (tree, tree);
@@ -2089,10 +2089,7 @@ fold_stmt (tree *stmt_p)
   STRIP_USELESS_TYPE_CONVERSION (result);
 
   if (result != rhs)
-    {
-      changed = true;
-      set_rhs (stmt_p, result);
-    }
+    changed |= set_rhs (stmt_p, result);
 
   return changed;
 }
@@ -2130,12 +2127,26 @@ get_rhs (tree stmt)
 
 /* Set the main expression of *STMT_P to EXPR.  */
 
-static void
+static bool
 set_rhs (tree *stmt_p, tree expr)
 {
   tree stmt = *stmt_p;
-  enum tree_code code = TREE_CODE (stmt);
+  enum tree_code code = TREE_CODE (expr);
 
+  /* Verify the constant folded result is valid gimple.  */
+  if (TREE_CODE_CLASS (code) == '2')
+    {
+      if (!is_gimple_val (TREE_OPERAND (expr, 0))
+         || !is_gimple_val (TREE_OPERAND (expr, 1)))
+       return false;
+    }
+  else if (TREE_CODE_CLASS (code) == '1')
+    {
+      if (!is_gimple_val (TREE_OPERAND (expr, 0)))
+       return false;
+    }
+
+  code = TREE_CODE (stmt);
   if (code == MODIFY_EXPR)
     TREE_OPERAND (stmt, 1) = expr;
   else if (code == COND_EXPR)
@@ -2196,6 +2207,8 @@ set_rhs (tree *stmt_p, tree expr)
            }
        }
     }
+
+  return true;
 }
 
 
@@ -2510,8 +2523,8 @@ execute_fold_all_builtins (void)
              print_generic_stmt (dump_file, *stmtp, dump_flags);
            }
 
-         set_rhs (stmtp, result);
-         modify_stmt (*stmtp);
+         if (set_rhs (stmtp, result))
+           modify_stmt (*stmtp);
 
          if (dump_file && (dump_flags & TDF_DETAILS))
            {