tree-dfa.c (add_referenced_var): Register initializers of global variables.

2004-07-26  Eric Christopher  <echristo@redhat.com>

	* tree-dfa.c (add_referenced_var): Register initializers of global
	variables.

2004-07-26  Eric Christopher  <echristo@redhat.com>

	* gcc.c-torture/compile/20040726-2.c: New test.

From-SVN: r85214
This commit is contained in:
Eric Christopher 2004-07-27 00:20:03 +00:00
parent 764c35da02
commit ff6a32068d
4 changed files with 68 additions and 29 deletions

View File

@ -1,5 +1,10 @@
2004-07-22 Paolo Bonzini <bonzini@gnu.org>
2004-07-26 Eric Christopher <echristo@redhat.com>
* tree-dfa.c (add_referenced_var): Register initializers of global
variables.
2004-07-26 Paolo Bonzini <bonzini@gnu.org>
* config/i386/i386.c (function_arg): Always treat 8-
and 16-byte wide vectors the same, even if MMX/SSE
are disabled.
@ -23,11 +28,11 @@
unadjusted_alignment unsigned.
(expand_call): Make preferred_stack_boundary and
preferred_unit_stack_boundary variables unsigned.
* function.c (assign_stack_local_1): Make alignment unsigned.
* function.h (struct function): Make stack_alignment_needed,
* function.c (assign_stack_local_1): Make alignment unsigned.
* function.h (struct function): Make stack_alignment_needed,
preferred_stack_boundary unsigned.
* config/i386/i386.c (ix86_preferred_stack_boundary): Make unsigned.
(ix86_compute_frame_layout): Make stack_alignment_needed,
(ix86_compute_frame_layout): Make stack_alignment_needed,
preferred_alignment variables unsigned.
* config/i386/i386.h (ix86_preferred_stack_boundary): Make unsigned.

View File

@ -1,3 +1,7 @@
2004-07-26 Eric Christopher <echristo@redhat.com>
* gcc.c-torture/compile/20040726-2.c: New test.
2004-07-26 Andrew Pinski <apinski@apple.com>
* g++.dg/rtti/tinfo1.C: Xfail.

View File

@ -0,0 +1,22 @@
/* { dg-do compile } */
/* From a failure after the global ccp pass. */
typedef struct
{
char n[129];
} A;
const A C = {
0,
0
};
extern const A *const B;
void bar(const char *);
void foo ()
{
bar (B->n);
}
const A *const B = &C;

View File

@ -139,8 +139,8 @@ struct tree_opt_pass pass_referenced_vars =
};
/* Compute immediate uses.
/* Compute immediate uses.
CALC_FOR is an optional function pointer which indicates whether
immediate uses information should be calculated for a given SSA
variable. If NULL, then information is computed for all
@ -253,7 +253,7 @@ compute_immediate_uses_for_phi (tree phi, bool (*calc_for)(tree))
tree arg = PHI_ARG_DEF (phi, i);
if (TREE_CODE (arg) == SSA_NAME && (!calc_for || calc_for (arg)))
{
{
tree imm_rdef_stmt = SSA_NAME_DEF_STMT (PHI_ARG_DEF (phi, i));
if (!IS_EMPTY_STMT (imm_rdef_stmt))
add_immediate_use (imm_rdef_stmt, phi);
@ -351,7 +351,7 @@ add_immediate_use (tree stmt, tree use_stmt)
/* If the immediate use of USE points to OLD, then redirect it to NEW. */
static void
redirect_immediate_use (tree use, tree old, tree new)
{
@ -388,7 +388,7 @@ redirect_immediate_uses (tree old, tree new)
/* Look at USE_OPS or VUSE_OPS according to FLAGS. */
for (i = 0; i < NUM_USES (uses); i++)
redirect_immediate_use (USE_OP (uses, i), old, new);
redirect_immediate_use (USE_OP (uses, i), old, new);
for (i = 0; i < NUM_VUSES (vuses); i++)
redirect_immediate_use (VUSE_OP (vuses, i), old, new);
@ -505,7 +505,7 @@ dump_referenced_vars (FILE *file)
{
size_t i;
fprintf (file, "\nReferenced variables in %s: %u\n\n",
fprintf (file, "\nReferenced variables in %s: %u\n\n",
get_name (current_function_decl), (unsigned) num_referenced_vars);
for (i = 0; i < num_referenced_vars; i++)
@ -533,7 +533,7 @@ void
dump_variable (FILE *file, tree var)
{
var_ann_t ann;
if (TREE_CODE (var) == SSA_NAME)
{
if (POINTER_TYPE_P (TREE_TYPE (var)))
@ -691,7 +691,7 @@ dump_dfa_stats (FILE *file)
size = num_referenced_vars * sizeof (tree);
total += size;
fprintf (file, fmt_str_1, "Referenced variables", num_referenced_vars,
fprintf (file, fmt_str_1, "Referenced variables", num_referenced_vars,
SCALE (size), LABEL (size));
size = dfa_stats.num_stmt_anns * sizeof (struct stmt_ann_d);
@ -723,7 +723,7 @@ dump_dfa_stats (FILE *file)
total += size;
fprintf (file, fmt_str_1, "V_MAY_DEF operands", dfa_stats.num_v_may_defs,
SCALE (size), LABEL (size));
size = dfa_stats.num_v_must_defs * sizeof (tree *);
total += size;
fprintf (file, fmt_str_1, "V_MUST_DEF operands", dfa_stats.num_v_must_defs,
@ -822,10 +822,10 @@ collect_dfa_stats_r (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
dfa_stats_p->num_stmt_anns++;
dfa_stats_p->num_defs += NUM_DEFS (DEF_OPS (ann));
dfa_stats_p->num_uses += NUM_USES (USE_OPS (ann));
dfa_stats_p->num_v_may_defs +=
dfa_stats_p->num_v_may_defs +=
NUM_V_MAY_DEFS (V_MAY_DEF_OPS (ann));
dfa_stats_p->num_vuses += NUM_VUSES (VUSE_OPS (ann));
dfa_stats_p->num_v_must_defs +=
dfa_stats_p->num_v_must_defs +=
NUM_V_MUST_DEFS (V_MUST_DEF_OPS (ann));
break;
}
@ -903,6 +903,14 @@ add_referenced_var (tree var, struct walk_state *walk_state)
/* Global and static variables are call-clobbered, always. */
if (needs_to_live_in_memory (var))
mark_call_clobbered (var);
/* If an initialized global variable then register the initializer
as well. */
if (POINTER_TYPE_P (TREE_TYPE (var))
&& TREE_READONLY (var)
&& DECL_INITIAL (var)
&& TREE_CODE (DECL_INITIAL (var)) == ADDR_EXPR)
walk_tree (&DECL_INITIAL (var), find_vars_r, walk_state, 0);
}
}
@ -920,7 +928,7 @@ get_virtual_var (tree var)
while (TREE_CODE (var) == REALPART_EXPR || TREE_CODE (var) == IMAGPART_EXPR
|| handled_component_p (var))
var = TREE_OPERAND (var, 0);
#ifdef ENABLE_CHECKING
/* Treating GIMPLE registers as virtual variables makes no sense.
Also complain if we couldn't extract a _DECL out of the original
@ -945,42 +953,42 @@ add_referenced_tmp_var (tree var)
add_referenced_var (var, NULL);
}
/* Return true if V_MAY_DEFS_AFTER contains fewer entries than
V_MAY_DEFS_BEFORE. Note that this assumes that both varrays
/* Return true if V_MAY_DEFS_AFTER contains fewer entries than
V_MAY_DEFS_BEFORE. Note that this assumes that both varrays
are V_MAY_DEF operands for the same statement. */
static inline bool
v_may_defs_disappeared_p (v_may_def_optype v_may_defs_before,
v_may_defs_disappeared_p (v_may_def_optype v_may_defs_before,
v_may_def_optype v_may_defs_after)
{
/* If there was nothing before, nothing could've disappeared. */
if (v_may_defs_before == NULL)
return false;
/* All/some of them gone. */
if (v_may_defs_after == NULL
|| NUM_V_MAY_DEFS (v_may_defs_before) >
|| NUM_V_MAY_DEFS (v_may_defs_before) >
NUM_V_MAY_DEFS (v_may_defs_after))
return true;
return false;
}
/* Return true if V_MUST_DEFS_AFTER contains fewer entries than
V_MUST_DEFS_BEFORE. Note that this assumes that both varrays
/* Return true if V_MUST_DEFS_AFTER contains fewer entries than
V_MUST_DEFS_BEFORE. Note that this assumes that both varrays
are V_MUST_DEF operands for the same statement. */
static inline bool
v_must_defs_disappeared_p (v_must_def_optype v_must_defs_before,
v_must_defs_disappeared_p (v_must_def_optype v_must_defs_before,
v_must_def_optype v_must_defs_after)
{
/* If there was nothing before, nothing could've disappeared. */
if (v_must_defs_before == NULL)
return false;
/* All/some of them gone. */
if (v_must_defs_after == NULL
|| NUM_V_MUST_DEFS (v_must_defs_before) >
|| NUM_V_MUST_DEFS (v_must_defs_before) >
NUM_V_MUST_DEFS (v_must_defs_after))
return true;
@ -1093,7 +1101,7 @@ mark_new_vars_to_rename (tree stmt, bitmap vars_to_rename)
bitmap_set_bit (vars_to_rename, var_ann (var)->uid);
}
}
v_must_defs_after = v_must_defs = V_MUST_DEF_OPS (ann);
for (i = 0; i < NUM_V_MUST_DEFS (v_must_defs); i++)
{
@ -1103,7 +1111,7 @@ mark_new_vars_to_rename (tree stmt, bitmap vars_to_rename)
found_exposed_symbol = true;
bitmap_set_bit (vars_to_rename, var_ann (var)->uid);
}
}
}
/* If we found any newly exposed symbols, or if there are fewer VDEF
operands in the statement, add the variables we had set in