From b48b3fc483125f0f6311cdedc874079574264359 Mon Sep 17 00:00:00 2001 From: Martin Jambor Date: Thu, 28 Feb 2013 13:43:33 +0100 Subject: [PATCH] re PR tree-optimization/56294 (BOOT_CFLAGS='-O2 -g -fno-ipa-sra' leads to bootstrap comparison failure) 2013-02-28 Martin Jambor PR tree-optimization/56294 * tree-sra.c (analyze_access_subtree): Create replacement declarations. Adjust dumping. (get_access_replacement): Do not call create_access_replacement. Assert a replacement exists. (get_repl_default_def_ssa_name): Create the replacement declaration itself. testsuite/ * g++.dg/debug/pr56294.C: New test. From-SVN: r196340 --- gcc/ChangeLog | 10 +++++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/debug/pr56294.C | 30 ++++++++++++++++++++++++++ gcc/tree-sra.c | 41 ++++++++++++++---------------------- 4 files changed, 61 insertions(+), 25 deletions(-) create mode 100644 gcc/testsuite/g++.dg/debug/pr56294.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3fa3943..55ab6ed 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2013-02-28 Martin Jambor + + PR tree-optimization/56294 + * tree-sra.c (analyze_access_subtree): Create replacement declarations. + Adjust dumping. + (get_access_replacement): Do not call create_access_replacement. + Assert a replacement exists. + (get_repl_default_def_ssa_name): Create the replacement declaration + itself. + 2013-02-28 Ramana Radhakrishnan * config/arm/arm.c (arm_output_mi_thunk): Call final_start_function and diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9db519d..08399b9 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-02-28 Martin Jambor + + PR tree-optimization/56294 + * g++.dg/debug/pr56294.C: New test. + 2013-02-28 Marcus Shawcroft * g++.old-deja/g++.pt/ptrmem6.C(main): Add xfail aarch64*-*-*. diff --git a/gcc/testsuite/g++.dg/debug/pr56294.C b/gcc/testsuite/g++.dg/debug/pr56294.C new file mode 100644 index 0000000..204c78e --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/pr56294.C @@ -0,0 +1,30 @@ +// { dg-do compile } +// { dg-options "-fno-ipa-sra -fcompare-debug" } + +struct comp_cost { int cost; unsigned complexity; }; +struct cost_pair { struct iv_cand *cand; }; +struct iv_use { unsigned n_map_members; cost_pair *cost_map; }; +struct iv_cand { unsigned id; }; + +unsigned gu; + +void +bar (comp_cost, comp_cost) +{ +} + +void +foo (iv_use *use, iv_cand *cand) +{ + unsigned i, s = cand->id & (use->n_map_members - 1); + for (i = 0; i < s; i++) + if (use->cost_map[i].cand) + goto found; +found: + use->cost_map[i].cand = cand; + comp_cost elim_cost, express_cost, bound_cost; + bar (elim_cost, express_cost); + gu = express_cost.complexity; +} + + diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c index 234dde2..5d55d73 100644 --- a/gcc/tree-sra.c +++ b/gcc/tree-sra.c @@ -2000,8 +2000,7 @@ create_access_replacement (struct access *access) static inline tree get_access_replacement (struct access *access) { - if (!access->replacement_decl) - access->replacement_decl = create_access_replacement (access); + gcc_checking_assert (access->replacement_decl); return access->replacement_decl; } @@ -2157,7 +2156,6 @@ analyze_access_subtree (struct access *root, struct access *parent, || ((root->grp_scalar_read || root->grp_assignment_read) && (root->grp_scalar_write || root->grp_assignment_write)))) { - bool new_integer_type; /* Always create access replacements that cover the whole access. For integral types this means the precision has to match. Avoid assumptions based on the integral type kind, too. */ @@ -2176,22 +2174,19 @@ analyze_access_subtree (struct access *root, struct access *parent, root->expr = build_ref_for_offset (UNKNOWN_LOCATION, root->base, root->offset, root->type, NULL, false); - new_integer_type = true; - } - else - new_integer_type = false; - if (dump_file && (dump_flags & TDF_DETAILS)) - { - fprintf (dump_file, "Marking "); - print_generic_expr (dump_file, root->base, 0); - fprintf (dump_file, " offset: %u, size: %u ", - (unsigned) root->offset, (unsigned) root->size); - fprintf (dump_file, " to be replaced%s.\n", - new_integer_type ? " with an integer": ""); + if (dump_file && (dump_flags & TDF_DETAILS)) + { + fprintf (dump_file, "Changing the type of a replacement for "); + print_generic_expr (dump_file, root->base, 0); + fprintf (dump_file, " offset: %u, size: %u ", + (unsigned) root->offset, (unsigned) root->size); + fprintf (dump_file, " to an integer.\n"); + } } root->grp_to_be_replaced = 1; + root->replacement_decl = create_access_replacement (root); sth_created = true; hole = false; } @@ -2209,15 +2204,7 @@ analyze_access_subtree (struct access *root, struct access *parent, if (MAY_HAVE_DEBUG_STMTS) { root->grp_to_be_debug_replaced = 1; - if (dump_file && (dump_flags & TDF_DETAILS)) - { - fprintf (dump_file, "Marking "); - print_generic_expr (dump_file, root->base, 0); - fprintf (dump_file, " offset: %u, size: %u ", - (unsigned) root->offset, (unsigned) root->size); - fprintf (dump_file, " to be replaced with debug " - "statements.\n"); - } + root->replacement_decl = create_access_replacement (root); } } @@ -2973,7 +2960,11 @@ sra_modify_constructor_assign (gimple *stmt, gimple_stmt_iterator *gsi) static tree get_repl_default_def_ssa_name (struct access *racc) { - return get_or_create_ssa_default_def (cfun, get_access_replacement (racc)); + gcc_checking_assert (!racc->grp_to_be_replaced && + !racc->grp_to_be_debug_replaced); + if (!racc->replacement_decl) + racc->replacement_decl = create_access_replacement (racc); + return get_or_create_ssa_default_def (cfun, racc->replacement_decl); } /* Return true if REF has a COMPONENT_REF with a bit-field field declaration -- 2.7.4