/* Generic routines for manipulating SSA_NAME expressions
- Copyright (C) 2003 Free Software Foundation, Inc.
+ Copyright (C) 2003, 2004 Free Software Foundation, Inc.
This file is part of GCC.
/* Array of all SSA_NAMEs used in the function. */
varray_type ssa_names;
-
+
+/* Bitmap of ssa names marked for rewriting. */
+bitmap ssa_names_to_rewrite;
+
/* Free list of SSA_NAMEs. This list is wiped at the end of each function
after we leave SSA form. */
static GTY (()) tree free_ssanames;
unsigned int ssa_name_nodes_created;
#endif
+/* Returns true if ssa name VAR is marked for rewrite. */
+
+bool
+marked_for_rewrite_p (tree var)
+{
+ if (ssa_names_to_rewrite
+ && bitmap_bit_p (ssa_names_to_rewrite, SSA_NAME_VERSION (var)))
+ return true;
+
+ return false;
+}
+
+/* Returns true if any ssa name is marked for rewrite. */
+
+bool
+any_marked_for_rewrite_p (void)
+{
+ if (!ssa_names_to_rewrite)
+ return false;
+
+ return bitmap_first_set_bit (ssa_names_to_rewrite) != -1;
+}
+
+/* Mark ssa name VAR for rewriting. */
+
+void
+mark_for_rewrite (tree var)
+{
+ if (!ssa_names_to_rewrite)
+ ssa_names_to_rewrite = BITMAP_XMALLOC ();
+
+ bitmap_set_bit (ssa_names_to_rewrite, SSA_NAME_VERSION (var));
+}
+
+/* Unmark all ssa names marked for rewrite. */
+
+void
+unmark_all_for_rewrite (void)
+{
+ if (!ssa_names_to_rewrite)
+ return;
+
+ bitmap_clear (ssa_names_to_rewrite);
+}
+
+/* Return the bitmap of ssa names to rewrite. Copy the bitmap,
+ so that the optimizers cannot access internals directly */
+
+bitmap
+marked_ssa_names (void)
+{
+ bitmap ret = BITMAP_XMALLOC ();
+ if (ssa_names_to_rewrite)
+ bitmap_copy (ret, ssa_names_to_rewrite);
+
+ return ret;
+}
+
/* Initialize management of SSA_NAMEs. */
void
void
fini_ssanames (void)
{
+ ggc_free (ssa_names);
+ ssa_names = NULL;
free_ssanames = NULL;
}
{
tree t;
-#if defined ENABLE_CHECKING
- if ((!DECL_P (var)
- && TREE_CODE (var) != INDIRECT_REF)
- || (!IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (stmt)))
- && TREE_CODE (stmt) != PHI_NODE))
- abort ();
-#endif
+ gcc_assert (DECL_P (var)
+ || TREE_CODE (var) == INDIRECT_REF);
+
+ gcc_assert (!stmt || EXPR_P (stmt) || TREE_CODE (stmt) == PHI_NODE);
/* If our free list has an element, then use it. Also reuse the
SSA version number of the element on the free list which helps
memset (t, 0, tree_size (t));
TREE_SET_CODE (t, SSA_NAME);
SSA_NAME_VERSION (t) = save_version;
+ gcc_assert (ssa_name (save_version) == NULL);
+ VARRAY_TREE (ssa_names, save_version) = t;
}
else
{
SSA_NAME_VAR (t) = var;
SSA_NAME_DEF_STMT (t) = stmt;
SSA_NAME_PTR_INFO (t) = NULL;
+ SSA_NAME_IN_FREE_LIST (t) = 0;
return t;
}
void
release_ssa_name (tree var)
{
+ if (!var)
+ return;
+
+ /* Never release the default definition for a symbol. It's a
+ special SSA name that should always exist once it's created. */
+ if (var == var_ann (SSA_NAME_VAR (var))->default_def)
+ return;
+
+ /* If the ssa name is marked for rewriting, it may have multiple definitions,
+ but we may happen to remove just one of them. So do not remove the
+ ssa name now. */
+ if (marked_for_rewrite_p (var))
+ return;
+
/* release_ssa_name can be called multiple times on a single SSA_NAME.
However, it should only end up on our free list one time. We
keep a status bit in the SSA_NAME node itself to indicate it has
defining statement. */
if (! SSA_NAME_IN_FREE_LIST (var))
{
+ VARRAY_TREE (ssa_names, SSA_NAME_VERSION (var)) = NULL;
SSA_NAME_IN_FREE_LIST (var) = 1;
TREE_CHAIN (var) = free_ssanames;
free_ssanames = var;
return new_name;
}
+
+/* Release all the SSA_NAMEs created by STMT. */
+
+void
+release_defs (tree stmt)
+{
+ tree def;
+ ssa_op_iter iter;
+
+ FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_ALL_DEFS)
+ if (TREE_CODE (def) == SSA_NAME)
+ release_ssa_name (def);
+}
+
+
+/* Replace the symbol associated with SSA_NAME with SYM. */
+
+void
+replace_ssa_name_symbol (tree ssa_name, tree sym)
+{
+ SSA_NAME_VAR (ssa_name) = sym;
+ TREE_TYPE (ssa_name) = TREE_TYPE (sym);
+}
+
#include "gt-tree-ssanames.h"