OSDN Git Service

- fix whitespace in laste gcc/ChangeLog entry
[pf3gnuchains/gcc-fork.git] / gcc / tree-ssa.c
index 5c9e0d8..ad2d6c2 100644 (file)
@@ -1,5 +1,5 @@
 /* Miscellaneous SSA utility functions.
-   Copyright (C) 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010
+   Copyright (C) 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010, 2011
    Free Software Foundation, Inc.
 
 This file is part of GCC.
@@ -43,6 +43,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "tree-dump.h"
 #include "tree-pass.h"
 #include "diagnostic-core.h"
+#include "cfgloop.h"
 
 /* Pointer map of variable mappings, keyed by edge.  */
 static struct pointer_map_t *edge_var_maps;
@@ -352,6 +353,10 @@ insert_debug_temp_for_var_def (gimple_stmt_iterator *gsi, tree var)
       value = degenerate_phi_result (def_stmt);
       if (value && walk_tree (&value, find_released_ssa_name, NULL, NULL))
        value = NULL;
+      /* error_mark_node is what fixup_noreturn_call changes PHI arguments
+        to.  */
+      else if (value == error_mark_node)
+       value = NULL;
     }
   else if (is_gimple_assign (def_stmt))
     {
@@ -455,13 +460,19 @@ insert_debug_temp_for_var_def (gimple_stmt_iterator *gsi, tree var)
        continue;
 
       if (value)
-       FOR_EACH_IMM_USE_ON_STMT (use_p, imm_iter)
-         /* unshare_expr is not needed here.  vexpr is either a
-            SINGLE_RHS, that can be safely shared, some other RHS
-            that was unshared when we found it had a single debug
-            use, or a DEBUG_EXPR_DECL, that can be safely
-            shared.  */
-         SET_USE (use_p, value);
+       {
+         FOR_EACH_IMM_USE_ON_STMT (use_p, imm_iter)
+           /* unshare_expr is not needed here.  vexpr is either a
+              SINGLE_RHS, that can be safely shared, some other RHS
+              that was unshared when we found it had a single debug
+              use, or a DEBUG_EXPR_DECL, that can be safely
+              shared.  */
+           SET_USE (use_p, value);
+         /* If we didn't replace uses with a debug decl fold the
+            resulting expression.  Otherwise we end up with invalid IL.  */
+         if (TREE_CODE (value) != DEBUG_EXPR_DECL)
+           fold_stmt_inplace (stmt);
+       }
       else
        gimple_debug_bind_reset_value (stmt);
 
@@ -497,6 +508,37 @@ insert_debug_temps_for_defs (gimple_stmt_iterator *gsi)
     }
 }
 
+/* Reset all debug stmts that use SSA_NAME(s) defined in STMT.  */
+
+void
+reset_debug_uses (gimple stmt)
+{
+  ssa_op_iter op_iter;
+  def_operand_p def_p;
+  imm_use_iterator imm_iter;
+  gimple use_stmt;
+
+  if (!MAY_HAVE_DEBUG_STMTS)
+    return;
+
+  FOR_EACH_PHI_OR_STMT_DEF (def_p, stmt, op_iter, SSA_OP_DEF)
+    {
+      tree var = DEF_FROM_PTR (def_p);
+
+      if (TREE_CODE (var) != SSA_NAME)
+       continue;
+
+      FOR_EACH_IMM_USE_STMT (use_stmt, imm_iter, var)
+       {
+         if (!gimple_debug_bind_p (use_stmt))
+           continue;
+
+         gimple_debug_bind_reset_value (use_stmt);
+         update_stmt (use_stmt);
+       }
+    }
+}
+
 /* Delete SSA DEFs for SSA versions in the TOREMOVE bitmap, removing
    dominated stmts before their dominators, so that release_ssa_defs
    stands a chance of propagating DEFs into debug bind stmts.  */
@@ -2164,13 +2206,27 @@ execute_update_addresses_taken (void)
                  }
              }
 
+           else if (gimple_debug_bind_p (stmt)
+                    && gimple_debug_bind_has_value_p (stmt))
+             {
+               tree *valuep = gimple_debug_bind_get_value_ptr (stmt);
+               tree decl;
+               maybe_rewrite_mem_ref_base (valuep);
+               decl = non_rewritable_mem_ref_base (*valuep);
+               if (decl && symbol_marked_for_renaming (decl))
+                 gimple_debug_bind_reset_value (stmt);
+             }
+
            if (gimple_references_memory_p (stmt)
                || is_gimple_debug (stmt))
              update_stmt (stmt);
          }
 
       /* Update SSA form here, we are called as non-pass as well.  */
-      update_ssa (TODO_update_ssa);
+      if (number_of_loops () > 1 && loops_state_satisfies_p (LOOP_CLOSED_SSA))
+       rewrite_into_loop_closed_ssa (NULL, TODO_update_ssa);
+      else
+       update_ssa (TODO_update_ssa);
     }
 
   BITMAP_FREE (not_reg_needs);