This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[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);
  }
  


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]