/* 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.
varray_type ssa_names;
/* Bitmap of ssa names marked for rewriting. */
-bitmap ssa_names_to_rewrite;
+static 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. */
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;
+ return bitmap_bit_p (ssa_names_to_rewrite, SSA_NAME_VERSION (var));
}
/* Returns true if any ssa name is marked for rewrite. */
if (!ssa_names_to_rewrite)
return false;
- return bitmap_first_set_bit (ssa_names_to_rewrite) != -1;
+ return !bitmap_empty_p (ssa_names_to_rewrite);
}
/* 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));
}
void
unmark_all_for_rewrite (void)
{
- if (!ssa_names_to_rewrite)
- return;
-
bitmap_clear (ssa_names_to_rewrite);
}
marked_ssa_names (void)
{
bitmap ret = BITMAP_XMALLOC ();
- if (ssa_names_to_rewrite)
- bitmap_copy (ret, ssa_names_to_rewrite);
+
+ bitmap_copy (ret, ssa_names_to_rewrite);
return ret;
}
large. */
VARRAY_PUSH_TREE (ssa_names, NULL_TREE);
free_ssanames = NULL;
+ ssa_names_to_rewrite = BITMAP_XMALLOC ();
}
/* Finalize management of SSA_NAMEs. */
void
fini_ssanames (void)
{
+ BITMAP_XFREE (ssa_names_to_rewrite);
+ 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)
- || (stmt
- && !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
- keep sbitmaps and arrays sized HIGHEST_SSA_VERSION smaller. */
+ /* If our free list has an element, then use it. */
if (free_ssanames)
{
- unsigned int save_version;
-
t = free_ssanames;
free_ssanames = TREE_CHAIN (free_ssanames);
#ifdef GATHER_STATISTICS
ssa_name_nodes_reused++;
#endif
- /* Clear the node so that it looks just like one we would have
- received from make_node. */
- save_version = SSA_NAME_VERSION (t);
- memset (t, 0, tree_size (t));
- TREE_SET_CODE (t, SSA_NAME);
- SSA_NAME_VERSION (t) = save_version;
+ /* The node was cleared out when we put it on the free list, so
+ there is no need to do so again here. */
+ gcc_assert (ssa_name (SSA_NAME_VERSION (t)) == NULL);
+ VARRAY_TREE (ssa_names, SSA_NAME_VERSION (t)) = t;
}
else
{
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)
defining statement. */
if (! SSA_NAME_IN_FREE_LIST (var))
{
+ tree saved_ssa_name_var = SSA_NAME_VAR (var);
+ int saved_ssa_name_version = SSA_NAME_VERSION (var);
+
+ VARRAY_TREE (ssa_names, SSA_NAME_VERSION (var)) = NULL;
+ memset (var, 0, tree_size (var));
+
+ /* First put back the right tree node so that the tree checking
+ macros do not complain. */
+ TREE_SET_CODE (var, SSA_NAME);
+
+ /* Restore the version number. */
+ SSA_NAME_VERSION (var) = saved_ssa_name_version;
+
+ /* Hopefully this can go away once we have the new incremental
+ SSA updating code installed. */
+ SSA_NAME_VAR (var) = saved_ssa_name_var;
+
+ /* Note this SSA_NAME is now in the first list. */
SSA_NAME_IN_FREE_LIST (var) = 1;
+
+ /* And finally link it into the free list. */
TREE_CHAIN (var) = free_ssanames;
free_ssanames = var;
}
ssa_op_iter iter;
FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_ALL_DEFS)
- release_ssa_name (def);
+ if (TREE_CODE (def) == SSA_NAME)
+ release_ssa_name (def);
}