Commit 900461f3 by Jakub Jelinek Committed by Jakub Jelinek

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
parent 3d3585eb
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> 2007-10-11 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
* gthr-posix.h (__gthread_active_init): Create detached instead of * gthr-posix.h (__gthread_active_init): Create detached instead of
2007-10-12 Jakub Jelinek <jakub@redhat.com> 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 PR c++/32121
* g++.dg/ext/label4.C: Adjust error regexp. * g++.dg/ext/label4.C: Adjust error regexp.
* g++.dg/ext/label6.C: Adjust error regexp. * g++.dg/ext/label6.C: Adjust error regexp.
/* 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;
}
/* 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" } } */
/* 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) ...@@ -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. */ /* Helper function for mark_all_vars_used, called via walk_tree. */
static tree static tree
mark_all_vars_used_1 (tree *tp, int *walk_subtrees, mark_all_vars_used_1 (tree *tp, int *walk_subtrees,
void *data ATTRIBUTE_UNUSED) void *data)
{ {
tree t = *tp; tree t = *tp;
enum tree_code_class c = TREE_CODE_CLASS (TREE_CODE (t)); 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, ...@@ -420,9 +420,9 @@ mark_all_vars_used_1 (tree *tp, int *walk_subtrees,
fields that do not contain vars. */ fields that do not contain vars. */
if (TREE_CODE (t) == TARGET_MEM_REF) if (TREE_CODE (t) == TARGET_MEM_REF)
{ {
mark_all_vars_used (&TMR_SYMBOL (t)); mark_all_vars_used (&TMR_SYMBOL (t), data);
mark_all_vars_used (&TMR_BASE (t)); mark_all_vars_used (&TMR_BASE (t), data);
mark_all_vars_used (&TMR_INDEX (t)); mark_all_vars_used (&TMR_INDEX (t), data);
*walk_subtrees = 0; *walk_subtrees = 0;
return NULL; return NULL;
} }
...@@ -430,7 +430,14 @@ mark_all_vars_used_1 (tree *tp, int *walk_subtrees, ...@@ -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 /* Only need to mark VAR_DECLS; parameters and return results are not
eliminated as unused. */ eliminated as unused. */
if (TREE_CODE (t) == VAR_DECL) 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)) if (IS_TYPE_OR_DECL_P (t))
*walk_subtrees = 0; *walk_subtrees = 0;
...@@ -547,9 +554,9 @@ remove_unused_scope_block_p (tree scope) ...@@ -547,9 +554,9 @@ remove_unused_scope_block_p (tree scope)
eliminated during the tree->rtl conversion process. */ eliminated during the tree->rtl conversion process. */
static inline void 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) ...@@ -562,6 +569,7 @@ remove_unused_locals (void)
tree t, *cell; tree t, *cell;
referenced_var_iterator rvi; referenced_var_iterator rvi;
var_ann_t ann; var_ann_t ann;
bitmap global_unused_vars = NULL;
mark_scope_block_unused (DECL_INITIAL (current_function_decl)); mark_scope_block_unused (DECL_INITIAL (current_function_decl));
/* Assume all locals are unused. */ /* Assume all locals are unused. */
...@@ -576,7 +584,7 @@ remove_unused_locals (void) ...@@ -576,7 +584,7 @@ remove_unused_locals (void)
/* Walk the statements. */ /* Walk the statements. */
for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi)) 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)) for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
{ {
...@@ -588,17 +596,17 @@ remove_unused_locals (void) ...@@ -588,17 +596,17 @@ remove_unused_locals (void)
continue; continue;
def = PHI_RESULT (phi); 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) FOR_EACH_PHI_ARG (arg_p, phi, i, SSA_OP_ALL_USES)
{ {
tree arg = USE_FROM_PTR (arg_p); 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; ) for (cell = &cfun->unexpanded_var_list; *cell; )
{ {
tree var = TREE_VALUE (*cell); tree var = TREE_VALUE (*cell);
...@@ -607,12 +615,49 @@ remove_unused_locals (void) ...@@ -607,12 +615,49 @@ remove_unused_locals (void)
&& (!(ann = var_ann (var)) && (!(ann = var_ann (var))
|| !ann->used)) || !ann->used))
{ {
*cell = TREE_CHAIN (*cell); if (is_global_var (var))
continue; {
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); 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 /* Remove unused variables from REFERENCED_VARs. As a special
exception keep the variables that are believed to be aliased. exception keep the variables that are believed to be aliased.
Those can't be easily removed from the alias sets and operand Those can't be easily removed from the alias sets and operand
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment