OSDN Git Service

Fix pr36224
[pf3gnuchains/gcc-fork.git] / gcc / tree-ssa-ter.c
index 824252e..670d963 100644 (file)
@@ -227,6 +227,7 @@ free_temp_expr_table (temp_expr_table_p t)
 #endif
 
   BITMAP_FREE (t->partition_in_use);
+  BITMAP_FREE (t->new_replaceable_dependencies);
 
   for (i = 0; i <= num_ssa_names; i++)
     if (t->expr_decl_uids[i])
@@ -235,6 +236,7 @@ free_temp_expr_table (temp_expr_table_p t)
 
   free (t->kill_list);
   free (t->partition_dependencies);
+  free (t->num_in_part);
 
   if (t->replaceable_expressions)
     ret = t->replaceable_expressions;
@@ -366,6 +368,10 @@ is_replaceable_p (tree stmt)
   if (TREE_CODE (stmt) != GIMPLE_MODIFY_STMT)
     return false;
 
+  /* If the statement may throw an exception, it cannot be replaced.  */
+  if (tree_could_throw_p (stmt))
+    return false;
+
   /* Punt if there is more than 1 def.  */
   def = SINGLE_SSA_TREE_OPERAND (stmt, SSA_OP_DEF);
   if (!def)
@@ -398,14 +404,9 @@ is_replaceable_p (tree stmt)
       && DECL_HARD_REGISTER (GENERIC_TREE_OPERAND (stmt, 1)))
     return false;
 
-  /* Calls to functions with side-effects cannot be replaced.  */
+  /* No function calls can be replaced.  */
   if ((call_expr = get_call_expr_in (stmt)) != NULL_TREE)
-    {
-      int call_flags = call_expr_flags (call_expr);
-      if (TREE_SIDE_EFFECTS (call_expr)
-         && !(call_flags & (ECF_PURE | ECF_CONST | ECF_NORETURN)))
-       return false;
-    }
+    return false;
 
   /* Leave any stmt with volatile operands alone as well.  */
   if (stmt_ann (stmt)->has_volatile_ops)
@@ -439,7 +440,7 @@ finished_with_expr (temp_expr_table_p tab, int version, bool free_expr)
 }
 
 
-/* Create an expression entry fora replaceable expression.  */
+/* Create an expression entry for a replaceable expression.  */
 
 static void 
 process_replaceable (temp_expr_table_p tab, tree stmt)