From ff6a32068ddad8488feec37db873ce8ae4486f77 Mon Sep 17 00:00:00 2001 From: Eric Christopher Date: Tue, 27 Jul 2004 00:20:03 +0000 Subject: [PATCH] tree-dfa.c (add_referenced_var): Register initializers of global variables. 2004-07-26 Eric Christopher * tree-dfa.c (add_referenced_var): Register initializers of global variables. 2004-07-26 Eric Christopher * gcc.c-torture/compile/20040726-2.c: New test. From-SVN: r85214 --- gcc/ChangeLog | 15 +++-- gcc/testsuite/ChangeLog | 4 ++ .../gcc.c-torture/compile/20040726-2.c | 22 ++++++++ gcc/tree-dfa.c | 56 +++++++++++-------- 4 files changed, 68 insertions(+), 29 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/compile/20040726-2.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c7e9705e3bf..97043d71db5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,10 @@ -2004-07-22 Paolo Bonzini - +2004-07-26 Eric Christopher + + * tree-dfa.c (add_referenced_var): Register initializers of global + variables. + +2004-07-26 Paolo Bonzini + * 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. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8f362f4e43d..3091bb17bb1 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2004-07-26 Eric Christopher + + * gcc.c-torture/compile/20040726-2.c: New test. + 2004-07-26 Andrew Pinski * g++.dg/rtti/tinfo1.C: Xfail. diff --git a/gcc/testsuite/gcc.c-torture/compile/20040726-2.c b/gcc/testsuite/gcc.c-torture/compile/20040726-2.c new file mode 100644 index 00000000000..ce60095fd8b --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/20040726-2.c @@ -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; diff --git a/gcc/tree-dfa.c b/gcc/tree-dfa.c index c8986e80372..9e9ee324826 100644 --- a/gcc/tree-dfa.c +++ b/gcc/tree-dfa.c @@ -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 -- 2.30.2