re PR tree-optimization/33645 (undefined static variable in vortex for -fno-unit-at-a-time)
PR tree-optimization/33645 * tree-ssa-live.c (mark_all_vars_used): Add data argument, pass it to walk_tree. (mark_all_vars_used_1): Pass data through to mark_all_vars_used. When calling set_is_used on a VAR_DECL, if data is not NULL and its DECL_UID is in the bitmap, call mark_all_vars_used on its DECL_INITIAL after clearing the bit in bitmap. (remove_unused_locals): Adjust mark_all_vars_used callers. Instead of removing unused global vars from unexpanded_var_list immediately record them in bitmap, call mark_all_vars_used on all used global vars from unexpanded_var_list and only purge global vars that weren't found used even during that step. * gcc.dg/pr33645-1.c: New test. * gcc.dg/pr33645-2.c: New test. * gcc.dg/pr33645-3.c: New test. From-SVN: r129254
This commit is contained in:
parent
3d3585eb17
commit
900461f31f
@ -1,3 +1,18 @@
|
||||
2007-10-12 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR tree-optimization/33645
|
||||
* tree-ssa-live.c (mark_all_vars_used): Add data argument,
|
||||
pass it to walk_tree.
|
||||
(mark_all_vars_used_1): Pass data through to mark_all_vars_used.
|
||||
When calling set_is_used on a VAR_DECL, if data is not NULL and
|
||||
its DECL_UID is in the bitmap, call mark_all_vars_used on its
|
||||
DECL_INITIAL after clearing the bit in bitmap.
|
||||
(remove_unused_locals): Adjust mark_all_vars_used callers.
|
||||
Instead of removing unused global vars from unexpanded_var_list
|
||||
immediately record them in bitmap, call mark_all_vars_used on
|
||||
all used global vars from unexpanded_var_list and only purge
|
||||
global vars that weren't found used even during that step.
|
||||
|
||||
2007-10-11 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
|
||||
|
||||
* gthr-posix.h (__gthread_active_init): Create detached instead of
|
||||
|
@ -1,5 +1,10 @@
|
||||
2007-10-12 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR tree-optimization/33645
|
||||
* gcc.dg/pr33645-1.c: New test.
|
||||
* gcc.dg/pr33645-2.c: New test.
|
||||
* gcc.dg/pr33645-3.c: New test.
|
||||
|
||||
PR c++/32121
|
||||
* g++.dg/ext/label4.C: Adjust error regexp.
|
||||
* g++.dg/ext/label6.C: Adjust error regexp.
|
||||
|
18
gcc/testsuite/gcc.dg/pr33645-1.c
Normal file
18
gcc/testsuite/gcc.dg/pr33645-1.c
Normal file
@ -0,0 +1,18 @@
|
||||
/* PR tree-optimization/33645 */
|
||||
/* { dg-do link } */
|
||||
/* { dg-options "-O2 -fno-unit-at-a-time" } */
|
||||
|
||||
__attribute__((noinline)) int
|
||||
bar (int *x)
|
||||
{
|
||||
return *x++;
|
||||
}
|
||||
|
||||
int
|
||||
main ()
|
||||
{
|
||||
static int var1_s;
|
||||
static int *var1_t = &var1_s;
|
||||
|
||||
return bar (var1_t) != 0;
|
||||
}
|
20
gcc/testsuite/gcc.dg/pr33645-2.c
Normal file
20
gcc/testsuite/gcc.dg/pr33645-2.c
Normal file
@ -0,0 +1,20 @@
|
||||
/* PR tree-optimization/33645 */
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-O2 -funit-at-a-time" } */
|
||||
|
||||
__attribute__((noinline)) int
|
||||
bar (int *x)
|
||||
{
|
||||
return *x++;
|
||||
}
|
||||
|
||||
int
|
||||
main ()
|
||||
{
|
||||
static int var1_s;
|
||||
static int *var1_t = &var1_s;
|
||||
|
||||
return bar (var1_t) != 0;
|
||||
}
|
||||
|
||||
/* { dg-final { scan-assembler-not "var1_t" } } */
|
20
gcc/testsuite/gcc.dg/pr33645-3.c
Normal file
20
gcc/testsuite/gcc.dg/pr33645-3.c
Normal file
@ -0,0 +1,20 @@
|
||||
/* PR tree-optimization/33645 */
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-O2 -fno-unit-at-a-time" } */
|
||||
|
||||
__attribute__((noinline)) int
|
||||
bar (int *x)
|
||||
{
|
||||
return *x++;
|
||||
}
|
||||
|
||||
int
|
||||
main ()
|
||||
{
|
||||
static int var1_s;
|
||||
static int *const var1_t = &var1_s;
|
||||
|
||||
return bar (var1_t) != 0;
|
||||
}
|
||||
|
||||
/* { dg-final { scan-assembler-not "var1_t" } } */
|
@ -397,13 +397,13 @@ change_partition_var (var_map map, tree var, int part)
|
||||
}
|
||||
|
||||
|
||||
static inline void mark_all_vars_used (tree *);
|
||||
static inline void mark_all_vars_used (tree *, void *data);
|
||||
|
||||
/* Helper function for mark_all_vars_used, called via walk_tree. */
|
||||
|
||||
static tree
|
||||
mark_all_vars_used_1 (tree *tp, int *walk_subtrees,
|
||||
void *data ATTRIBUTE_UNUSED)
|
||||
void *data)
|
||||
{
|
||||
tree t = *tp;
|
||||
enum tree_code_class c = TREE_CODE_CLASS (TREE_CODE (t));
|
||||
@ -420,9 +420,9 @@ mark_all_vars_used_1 (tree *tp, int *walk_subtrees,
|
||||
fields that do not contain vars. */
|
||||
if (TREE_CODE (t) == TARGET_MEM_REF)
|
||||
{
|
||||
mark_all_vars_used (&TMR_SYMBOL (t));
|
||||
mark_all_vars_used (&TMR_BASE (t));
|
||||
mark_all_vars_used (&TMR_INDEX (t));
|
||||
mark_all_vars_used (&TMR_SYMBOL (t), data);
|
||||
mark_all_vars_used (&TMR_BASE (t), data);
|
||||
mark_all_vars_used (&TMR_INDEX (t), data);
|
||||
*walk_subtrees = 0;
|
||||
return NULL;
|
||||
}
|
||||
@ -430,7 +430,14 @@ mark_all_vars_used_1 (tree *tp, int *walk_subtrees,
|
||||
/* Only need to mark VAR_DECLS; parameters and return results are not
|
||||
eliminated as unused. */
|
||||
if (TREE_CODE (t) == VAR_DECL)
|
||||
set_is_used (t);
|
||||
{
|
||||
if (data != NULL && bitmap_bit_p ((bitmap) data, DECL_UID (t)))
|
||||
{
|
||||
bitmap_clear_bit ((bitmap) data, DECL_UID (t));
|
||||
mark_all_vars_used (&DECL_INITIAL (t), data);
|
||||
}
|
||||
set_is_used (t);
|
||||
}
|
||||
|
||||
if (IS_TYPE_OR_DECL_P (t))
|
||||
*walk_subtrees = 0;
|
||||
@ -547,9 +554,9 @@ remove_unused_scope_block_p (tree scope)
|
||||
eliminated during the tree->rtl conversion process. */
|
||||
|
||||
static inline void
|
||||
mark_all_vars_used (tree *expr_p)
|
||||
mark_all_vars_used (tree *expr_p, void *data)
|
||||
{
|
||||
walk_tree (expr_p, mark_all_vars_used_1, NULL, NULL);
|
||||
walk_tree (expr_p, mark_all_vars_used_1, data, NULL);
|
||||
}
|
||||
|
||||
|
||||
@ -562,6 +569,7 @@ remove_unused_locals (void)
|
||||
tree t, *cell;
|
||||
referenced_var_iterator rvi;
|
||||
var_ann_t ann;
|
||||
bitmap global_unused_vars = NULL;
|
||||
|
||||
mark_scope_block_unused (DECL_INITIAL (current_function_decl));
|
||||
/* Assume all locals are unused. */
|
||||
@ -576,7 +584,7 @@ remove_unused_locals (void)
|
||||
|
||||
/* Walk the statements. */
|
||||
for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
|
||||
mark_all_vars_used (bsi_stmt_ptr (bsi));
|
||||
mark_all_vars_used (bsi_stmt_ptr (bsi), NULL);
|
||||
|
||||
for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
|
||||
{
|
||||
@ -588,17 +596,17 @@ remove_unused_locals (void)
|
||||
continue;
|
||||
|
||||
def = PHI_RESULT (phi);
|
||||
mark_all_vars_used (&def);
|
||||
mark_all_vars_used (&def, NULL);
|
||||
|
||||
FOR_EACH_PHI_ARG (arg_p, phi, i, SSA_OP_ALL_USES)
|
||||
{
|
||||
tree arg = USE_FROM_PTR (arg_p);
|
||||
mark_all_vars_used (&arg);
|
||||
mark_all_vars_used (&arg, NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Remove unmarked vars and clear used flag. */
|
||||
/* Remove unmarked local vars from unexpanded_var_list. */
|
||||
for (cell = &cfun->unexpanded_var_list; *cell; )
|
||||
{
|
||||
tree var = TREE_VALUE (*cell);
|
||||
@ -607,12 +615,49 @@ remove_unused_locals (void)
|
||||
&& (!(ann = var_ann (var))
|
||||
|| !ann->used))
|
||||
{
|
||||
*cell = TREE_CHAIN (*cell);
|
||||
continue;
|
||||
if (is_global_var (var))
|
||||
{
|
||||
if (global_unused_vars == NULL)
|
||||
global_unused_vars = BITMAP_ALLOC (NULL);
|
||||
bitmap_set_bit (global_unused_vars, DECL_UID (var));
|
||||
}
|
||||
else
|
||||
{
|
||||
*cell = TREE_CHAIN (*cell);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
cell = &TREE_CHAIN (*cell);
|
||||
}
|
||||
|
||||
/* Remove unmarked global vars from unexpanded_var_list. */
|
||||
if (global_unused_vars != NULL)
|
||||
{
|
||||
for (t = cfun->unexpanded_var_list; t; t = TREE_CHAIN (t))
|
||||
{
|
||||
tree var = TREE_VALUE (t);
|
||||
|
||||
if (TREE_CODE (var) == VAR_DECL
|
||||
&& is_global_var (var)
|
||||
&& (ann = var_ann (var)) != NULL
|
||||
&& ann->used)
|
||||
mark_all_vars_used (&DECL_INITIAL (var), global_unused_vars);
|
||||
}
|
||||
|
||||
for (cell = &cfun->unexpanded_var_list; *cell; )
|
||||
{
|
||||
tree var = TREE_VALUE (*cell);
|
||||
|
||||
if (TREE_CODE (var) == VAR_DECL
|
||||
&& is_global_var (var)
|
||||
&& bitmap_bit_p (global_unused_vars, DECL_UID (var)))
|
||||
*cell = TREE_CHAIN (*cell);
|
||||
else
|
||||
cell = &TREE_CHAIN (*cell);
|
||||
}
|
||||
BITMAP_FREE (global_unused_vars);
|
||||
}
|
||||
|
||||
/* Remove unused variables from REFERENCED_VARs. As a special
|
||||
exception keep the variables that are believed to be aliased.
|
||||
Those can't be easily removed from the alias sets and operand
|
||||
|
Loading…
x
Reference in New Issue
Block a user