On Thu, 24 May 2012, Richard Guenther wrote:

> On Wed, 23 May 2012, H.J. Lu wrote:
> 
> > On Wed, May 23, 2012 at 7:25 AM, H.J. Lu <hjl.to...@gmail.com> wrote:
> > > On Wed, May 23, 2012 at 5:00 AM, Richard Guenther <rguent...@suse.de> 
> > > wrote:
> > >>
> > >> This finally switches us to not record global vars in referenced-vars.
> > >> For this to work I had to re-engineer how we handle global var removal
> > >> from local-decls in remove_unused_locals.  Incidentially that code
> > >> already had some sort of a bitmap (for some weird reason even), thus
> > >> I borrowed that and simplified the handling.  You may notice that
> > >> it would be easy to handle all vars that way ...
> > >>
> > >> So eventually 5/n will make referenced-vars go away completely
> > >> (the only serious user seems to be the SSA renamer for its
> > >> SYMS_TO_RENAME bitmap).
> > >>
> > >> Bootstrapped on x86_64-unknown-linux-gnu, testing in progress.
> > >>
> > >> Richard.
> > >>
> > >> 2012-05-23  Richard Guenther  <rguent...@suse.de>
> > >>
> > >>        * tree-dfa.c (add_referenced_var_1): Do not add global vars.
> > >>        * tree-ssa-live.c (mark_all_vars_used_1): Handle global vars
> > >>        via the global_unused_vars bitmap.
> > >>        (remove_unused_locals): Handle global vars in local-decls via
> > >>        a global_unused_vars bitmap instead of the used flag in the
> > >>        var annotation.  Simplify global variable handling and removal.
> > >>
> > >
> > > This breaks bootstrap on Linux/x86-64:
> > >
> > > http://gcc.gnu.org/ml/gcc-regression/2012-05/msg00468.html
> > >
> > > Comparing stages 2 and 3
> > > warning: gcc/cc1plus-checksum.o differs
> > > warning: gcc/cc1obj-checksum.o differs
> > > warning: gcc/cc1-checksum.o differs
> > > Bootstrap comparison failure!
> > > gcc/trans-mem.o differs
> > > gcc/gimple-low.o differs
> > > gcc/sese.o differs
> > > make[5]: *** [compare] Error 1
> > >
> > > Please make sure that your compiler used for bootstrap
> > > doesn't add anything to .comment section, which will
> > > disable debug compare.
> > 
> > I opened:
> > 
> > http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53466
> 
> I am testing the following (or it will reproduce hopefully, with
> --with-build-config=bootstrap-debug).  Why can't compare-debug ignore
> comment sections?

This one passes bootstrap for C/C++.  I have applied it to unbreak
bootstrap.

Thanks,
Richard.

2012-05-24  Richard Guenther  <rguent...@suse.de>

        PR bootstrap/53466
        * tree-ssa-live.c (remove_unused_scope_block_p): Properly
        handle globals.
        (remove_unused_locals): Pass global_unused_vars to
        remove_unused_scope_block_p.  Restore code walking all
        referenced vars and pruning them.

Index: gcc/tree-ssa-live.c
===================================================================
--- gcc/tree-ssa-live.c (revision 187800)
+++ gcc/tree-ssa-live.c (working copy)
@@ -429,7 +429,7 @@ mark_scope_block_unused (tree scope)
    done by the inliner.  */
 
 static bool
-remove_unused_scope_block_p (tree scope)
+remove_unused_scope_block_p (tree scope, bitmap global_unused_vars)
 {
   tree *t, *next;
   bool unused = !TREE_USED (scope);
@@ -472,7 +472,9 @@ remove_unused_scope_block_p (tree scope)
         info about optimized-out variables in the scope blocks.
         Exception are the scope blocks not containing any instructions
         at all so user can't get into the scopes at first place.  */
-      else if (var_ann (*t) != NULL && is_used_p (*t))
+      else if ((is_global_var (*t)
+               && !bitmap_bit_p (global_unused_vars, DECL_UID (*t)))
+              || (var_ann (*t) != NULL && is_used_p (*t)))
        unused = false;
       else if (TREE_CODE (*t) == LABEL_DECL && TREE_USED (*t))
        /* For labels that are still used in the IL, the decision to
@@ -517,7 +519,7 @@ remove_unused_scope_block_p (tree scope)
     }
 
   for (t = &BLOCK_SUBBLOCKS (scope); *t ;)
-    if (remove_unused_scope_block_p (*t))
+    if (remove_unused_scope_block_p (*t, global_unused_vars))
       {
        if (BLOCK_SUBBLOCKS (*t))
          {
@@ -847,9 +849,20 @@ remove_unused_locals (void)
     }
   if (dstidx != num)
     VEC_truncate (tree, cfun->local_decls, dstidx);
+
+  /* ???  We end up with decls in referenced-vars that are not in
+     local-decls.  */
+  FOR_EACH_REFERENCED_VAR (cfun, t, rvi)
+    if (TREE_CODE (t) == VAR_DECL
+       && !VAR_DECL_IS_VIRTUAL_OPERAND (t)
+       && !is_used_p (t))
+      remove_referenced_var (t);
+
+  remove_unused_scope_block_p (DECL_INITIAL (current_function_decl),
+                              global_unused_vars);
+
   BITMAP_FREE (global_unused_vars);
 
-  remove_unused_scope_block_p (DECL_INITIAL (current_function_decl));
   if (dump_file && (dump_flags & TDF_DETAILS))
     {
       fprintf (dump_file, "Scope blocks after cleanups:\n");

Reply via email to