This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Fix UID difference code-differences in bootstrap
- From: Richard Guenther <rguenther at suse dot de>
- To: gcc-patches at gcc dot gnu dot org
- Cc: aoliva at redhat dot com
- Date: Sat, 28 Nov 2009 23:36:57 +0100 (CET)
- Subject: [PATCH] Fix UID difference code-differences in bootstrap
This fixes the only case that causes code differences during
bootstrap when the UID increment is randomized. Alex, is
there a bootstrap kind that compares more (but does not choke
on UID differences)?
Bootstrapped and tested on x86_64-unknown-linux-gnu, I'll
apply this early next week.
Thanks,
Richard.
2009-11-28 Richard Guenther <rguenther@suse.de>
* tree-into-ssa.c (insert_phi_nodes): Add PHI nodes in
variable UID order.
Index: gcc/tree-into-ssa.c
===================================================================
*** gcc/tree-into-ssa.c (revision 154727)
--- gcc/tree-into-ssa.c (working copy)
*************** static void
*** 1151,1177 ****
insert_phi_nodes (bitmap *dfs)
{
referenced_var_iterator rvi;
tree var;
timevar_push (TV_TREE_INSERT_PHI_NODES);
FOR_EACH_REFERENCED_VAR (var, rvi)
{
struct def_blocks_d *def_map;
- bitmap idf;
def_map = find_def_blocks_for (var);
if (def_map == NULL)
continue;
if (get_phi_state (var) != NEED_PHI_STATE_NO)
! {
! idf = compute_idf (def_map->def_blocks, dfs);
! insert_phi_nodes_for (var, idf, false);
! BITMAP_FREE (idf);
! }
}
timevar_pop (TV_TREE_INSERT_PHI_NODES);
}
--- 1151,1193 ----
insert_phi_nodes (bitmap *dfs)
{
referenced_var_iterator rvi;
+ bitmap_iterator bi;
tree var;
+ bitmap vars;
+ unsigned uid;
timevar_push (TV_TREE_INSERT_PHI_NODES);
+ /* Do two stages to avoid code generation differences for UID
+ differences but no UID ordering differences. */
+
+ vars = BITMAP_ALLOC (NULL);
FOR_EACH_REFERENCED_VAR (var, rvi)
{
struct def_blocks_d *def_map;
def_map = find_def_blocks_for (var);
if (def_map == NULL)
continue;
if (get_phi_state (var) != NEED_PHI_STATE_NO)
! bitmap_set_bit (vars, DECL_UID (var));
}
+ EXECUTE_IF_SET_IN_BITMAP (vars, 0, uid, bi)
+ {
+ tree var = referenced_var (uid);
+ struct def_blocks_d *def_map;
+ bitmap idf;
+
+ def_map = find_def_blocks_for (var);
+ idf = compute_idf (def_map->def_blocks, dfs);
+ insert_phi_nodes_for (var, idf, false);
+ BITMAP_FREE (idf);
+ }
+
+ BITMAP_FREE (vars);
+
timevar_pop (TV_TREE_INSERT_PHI_NODES);
}