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;
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;
- gcc_assert (ssa_name (save_version) == NULL);
- VARRAY_TREE (ssa_names, save_version) = t;
+ /* 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
{
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;
}