This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: Put scope blocks on a diet
- From: Alexandre Oliva <aoliva at redhat dot com>
- To: Jan Hubicka <jh at suse dot cz>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Thu, 02 Aug 2007 20:13:38 -0300
- Subject: Re: Put scope blocks on a diet
- References: <20070724180235.GM24519@kam.mff.cuni.cz> <orlkcucny9.fsf@oliva.athome.lsd.ic.unicamp.br>
On Aug 2, 2007, Alexandre Oliva <aoliva@redhat.com> wrote:
> On Jul 24, 2007, Jan Hubicka <jh@suse.cz> wrote:
>> With debugging disabled gimplifier also knows to not assign statements
>> to block so we can remove more of them. This seems to be safe to do
>> concerning consistency in between -g and no -g (we still keep enough
>> block around to support some of other tests made)
> Is it a hunch that it is safe, or do you have any actual arguments to
> justify this claim? It's actually caused major regressions to
> bootstrap-debug (introduced with the yet-to-be-submitted patch below)
> on a tree in which I have a large patch in progress that adds debug
> annotations without any changes to the generated code.
I reverted my large patch, ran bootstrap-debug, and it failed
spectacularly. Then I installed this patch, started over, and
bootstrap-debug passed (both with and without my patch). On
x86_64-linux-gnu.
I realize this kills some of the memory savings you hoped for, but -g
must not ever modify the generated code.
Index: gcc/tree-ssa-live.c
===================================================================
--- gcc/tree-ssa-live.c.orig 2007-08-02 15:50:35.000000000 -0300
+++ gcc/tree-ssa-live.c 2007-08-02 18:09:46.000000000 -0300
@@ -468,39 +468,10 @@ mark_scope_block_unused (tree scope)
static bool
remove_unused_scope_block_p (tree scope)
{
- tree *t, *next;
+ tree *t;
bool unused = !TREE_USED (scope);
- var_ann_t ann;
int nsubblocks = 0;
- for (t = &BLOCK_VARS (scope); *t; t = next)
- {
- next = &TREE_CHAIN (*t);
-
- /* Debug info of nested function reffers to the block of the
- function. */
- if (TREE_CODE (*t) == FUNCTION_DECL)
- unused = false;
-
- /* When we are outputting debug info, we usually want to output
- 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 ((ann = var_ann (*t)) != NULL
- && ann->used)
- unused = false;
-
- /* When we are not doing full debug info, we however can keep around
- only the used variables for cfgexpand's memory packing saving quite
- a lot of memory. */
- else if (debug_info_level != DINFO_LEVEL_NORMAL
- && debug_info_level != DINFO_LEVEL_VERBOSE)
- {
- *t = TREE_CHAIN (*t);
- next = t;
- }
- }
-
for (t = &BLOCK_SUBBLOCKS (scope); *t ;)
if (remove_unused_scope_block_p (*t))
{
@@ -533,12 +504,10 @@ remove_unused_scope_block_p (tree scope)
/* When there is only one subblock, see if it is just wrapper we can
ignore. Wrappers are not declaring any variables and not changing
abstract origin. */
- else if (nsubblocks == 1
+ else if (nsubblocks <= 1
&& (BLOCK_VARS (scope)
- || ((debug_info_level == DINFO_LEVEL_NORMAL
- || debug_info_level == DINFO_LEVEL_VERBOSE)
- && ((BLOCK_ABSTRACT_ORIGIN (scope)
- != BLOCK_ABSTRACT_ORIGIN (BLOCK_SUPERCONTEXT (scope)))))))
+ || (BLOCK_ABSTRACT_ORIGIN (scope)
+ != BLOCK_ABSTRACT_ORIGIN (BLOCK_SUPERCONTEXT (scope)))))
unused = false;
return unused;
}
--
Alexandre Oliva http://www.lsd.ic.unicamp.br/~oliva/
FSF Latin America Board Member http://www.fsfla.org/
Red Hat Compiler Engineer aoliva@{redhat.com, gcc.gnu.org}
Free Software Evangelist oliva@{lsd.ic.unicamp.br, gnu.org}