Successfully identified regression in *gcc* in CI configuration tcwg_bmk_gnu_tk1/gnu-release-arm-spec2k6-O3. So far, this commit has regressed CI configurations: - tcwg_bmk_gnu_tk1/gnu-release-arm-spec2k6-O3
Culprit: <cut> commit a20f263ba1a76af40eb4e6734529739a2a30ed65 Author: Jan Hubicka hubicka@ucw.cz Date: Sun Jul 14 13:57:10 2019 +0200
ipa-fnsummary.c (ipa_dump_hints): Do not dump array_index.
* ipa-fnsummary.c (ipa_dump_hints): Do not dump array_index. (ipa_fn_summary::~ipa_fn_summary): Do not destroy array_index. (ipa_fn_summary_t::duplicate): Do not duplicate array_index. (array_index_predicate): Remove. (analyze_function_body): Account cost for variable ofsetted array indexing. (estimate_node_size_and_time): Do not compute array index hint. (ipa_merge_fn_summary_after_inlining): Do not merge array index hint. (inline_read_section): Do not read array index hint. (ipa_fn_summary_write): Do not write array index hint. * doc/invoke.texi (ipa-cp-array-index-hint-bonus): Remove. * ipa-cp.c (hint_time_bonus): Remove. * ipa-fnsummary.h (ipa_hints_vals): Remove array_index. (ipa_fnsummary): Remove array_index. * ipa-inline.c (want_inline_small_function_p): Do not use array_index. (edge_badness): Likewise. * params.def (PARAM_IPA_CP_ARRAY_INDEX_HINT_BONUS): Remove.
From-SVN: r273479 </cut>
Results regressed to (for first_bad == a20f263ba1a76af40eb4e6734529739a2a30ed65) # reset_artifacts: -10 # build_abe binutils: -9 # build_abe stage1 -- --set gcc_override_configure=--with-mode=arm --set gcc_override_configure=--disable-libsanitizer: -8 # build_abe linux: -7 # build_abe glibc: -6 # build_abe stage2 -- --set gcc_override_configure=--with-mode=arm --set gcc_override_configure=--disable-libsanitizer: -5 # true: 0 # benchmark -O3_marm -- artifacts/build-a20f263ba1a76af40eb4e6734529739a2a30ed65/results_id: 1 # 410.bwaves,[.] mat_times_vec_ regressed by 195
from (for last_good == d67dfb85ba4f89f5f3045f2483005c290bc18108) # reset_artifacts: -10 # build_abe binutils: -9 # build_abe stage1 -- --set gcc_override_configure=--with-mode=arm --set gcc_override_configure=--disable-libsanitizer: -8 # build_abe linux: -7 # build_abe glibc: -6 # build_abe stage2 -- --set gcc_override_configure=--with-mode=arm --set gcc_override_configure=--disable-libsanitizer: -5 # true: 0 # benchmark -O3_marm -- artifacts/build-d67dfb85ba4f89f5f3045f2483005c290bc18108/results_id: 1
Artifacts of last_good build: https://ci.linaro.org/job/tcwg_bmk_ci_gnu-bisect-tcwg_bmk_tk1-gnu-release-ar... Results ID of last_good: tk1_32/tcwg_bmk_gnu_tk1/bisect-gnu-release-arm-spec2k6-O3/753 Artifacts of first_bad build: https://ci.linaro.org/job/tcwg_bmk_ci_gnu-bisect-tcwg_bmk_tk1-gnu-release-ar... Results ID of first_bad: tk1_32/tcwg_bmk_gnu_tk1/bisect-gnu-release-arm-spec2k6-O3/758 Build top page/logs: https://ci.linaro.org/job/tcwg_bmk_ci_gnu-bisect-tcwg_bmk_tk1-gnu-release-ar...
Configuration details:
Reproduce builds: <cut> mkdir investigate-gcc-a20f263ba1a76af40eb4e6734529739a2a30ed65 cd investigate-gcc-a20f263ba1a76af40eb4e6734529739a2a30ed65
git clone https://git.linaro.org/toolchain/jenkins-scripts
mkdir -p artifacts/manifests curl -o artifacts/manifests/build-baseline.sh https://ci.linaro.org/job/tcwg_bmk_ci_gnu-bisect-tcwg_bmk_tk1-gnu-release-ar... --fail curl -o artifacts/manifests/build-parameters.sh https://ci.linaro.org/job/tcwg_bmk_ci_gnu-bisect-tcwg_bmk_tk1-gnu-release-ar... --fail curl -o artifacts/test.sh https://ci.linaro.org/job/tcwg_bmk_ci_gnu-bisect-tcwg_bmk_tk1-gnu-release-ar... --fail chmod +x artifacts/test.sh
# Reproduce the baseline build (build all pre-requisites) ./jenkins-scripts/tcwg_bmk-build.sh @@ artifacts/manifests/build-baseline.sh
cd gcc
# Reproduce first_bad build git checkout --detach a20f263ba1a76af40eb4e6734529739a2a30ed65 ../artifacts/test.sh
# Reproduce last_good build git checkout --detach d67dfb85ba4f89f5f3045f2483005c290bc18108 ../artifacts/test.sh
cd .. </cut>
History of pending regressions and results: https://git.linaro.org/toolchain/ci/base-artifacts.git/log/?h=linaro-local/c...
Artifacts: https://ci.linaro.org/job/tcwg_bmk_ci_gnu-bisect-tcwg_bmk_tk1-gnu-release-ar... Build log: https://ci.linaro.org/job/tcwg_bmk_ci_gnu-bisect-tcwg_bmk_tk1-gnu-release-ar...
Full commit (up to 1000 lines): <cut> commit a20f263ba1a76af40eb4e6734529739a2a30ed65 Author: Jan Hubicka hubicka@ucw.cz Date: Sun Jul 14 13:57:10 2019 +0200
ipa-fnsummary.c (ipa_dump_hints): Do not dump array_index.
* ipa-fnsummary.c (ipa_dump_hints): Do not dump array_index. (ipa_fn_summary::~ipa_fn_summary): Do not destroy array_index. (ipa_fn_summary_t::duplicate): Do not duplicate array_index. (array_index_predicate): Remove. (analyze_function_body): Account cost for variable ofsetted array indexing. (estimate_node_size_and_time): Do not compute array index hint. (ipa_merge_fn_summary_after_inlining): Do not merge array index hint. (inline_read_section): Do not read array index hint. (ipa_fn_summary_write): Do not write array index hint. * doc/invoke.texi (ipa-cp-array-index-hint-bonus): Remove. * ipa-cp.c (hint_time_bonus): Remove. * ipa-fnsummary.h (ipa_hints_vals): Remove array_index. (ipa_fnsummary): Remove array_index. * ipa-inline.c (want_inline_small_function_p): Do not use array_index. (edge_badness): Likewise. * params.def (PARAM_IPA_CP_ARRAY_INDEX_HINT_BONUS): Remove.
From-SVN: r273479 --- gcc/ChangeLog | 21 ++++++++++ gcc/doc/invoke.texi | 6 --- gcc/ipa-cp.c | 2 - gcc/ipa-fnsummary.c | 109 +++++++++++++++------------------------------------- gcc/ipa-fnsummary.h | 11 ++---- gcc/ipa-inline.c | 3 -- gcc/params.def | 6 --- 7 files changed, 54 insertions(+), 104 deletions(-)
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9376ab41542..9b5cc7a5b5b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,24 @@ +2019-07-14 Jan Hubicka hubicka@ucw.cz + + * ipa-fnsummary.c (ipa_dump_hints): Do not dump array_index. + (ipa_fn_summary::~ipa_fn_summary): Do not destroy array_index. + (ipa_fn_summary_t::duplicate): Do not duplicate array_index. + (array_index_predicate): Remove. + (analyze_function_body): Account cost for variable ofsetted array + indexing. + (estimate_node_size_and_time): Do not compute array index hint. + (ipa_merge_fn_summary_after_inlining): Do not merge array index hint. + (inline_read_section): Do not read array index hint. + (ipa_fn_summary_write): Do not write array index hint. + * doc/invoke.texi (ipa-cp-array-index-hint-bonus): Remove. + * ipa-cp.c (hint_time_bonus): Remove. + * ipa-fnsummary.h (ipa_hints_vals): Remove array_index. + (ipa_fnsummary): Remove array_index. + * ipa-inline.c (want_inline_small_function_p): Do not use + array_index. + (edge_badness): Likewise. + * params.def (PARAM_IPA_CP_ARRAY_INDEX_HINT_BONUS): Remove. + 2019-07-14 Segher Boessenkool segher@kernel.crashing.org
PR target/91148 diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index b4e71f2c8fd..758aef36bd8 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -11895,12 +11895,6 @@ of iterations of a loop known, it adds a bonus of @option{ipa-cp-loop-hint-bonus} to the profitability score of the candidate.
-@item ipa-cp-array-index-hint-bonus -When IPA-CP determines that a cloning candidate would make the index of -an array access known, it adds a bonus of -@option{ipa-cp-array-index-hint-bonus} to the profitability -score of the candidate. - @item ipa-max-aa-steps During its analysis of function bodies, IPA-CP employs alias analysis in order to track values pointed to by function parameters. In order diff --git a/gcc/ipa-cp.c b/gcc/ipa-cp.c index 0fd36506c00..b20a6d08794 100644 --- a/gcc/ipa-cp.c +++ b/gcc/ipa-cp.c @@ -2607,8 +2607,6 @@ hint_time_bonus (ipa_hints hints) int result = 0; if (hints & (INLINE_HINT_loop_iterations | INLINE_HINT_loop_stride)) result += PARAM_VALUE (PARAM_IPA_CP_LOOP_HINT_BONUS); - if (hints & INLINE_HINT_array_index) - result += PARAM_VALUE (PARAM_IPA_CP_ARRAY_INDEX_HINT_BONUS); return result; }
diff --git a/gcc/ipa-fnsummary.c b/gcc/ipa-fnsummary.c index 09986211a1d..78eb8cb6f50 100644 --- a/gcc/ipa-fnsummary.c +++ b/gcc/ipa-fnsummary.c @@ -134,11 +134,6 @@ ipa_dump_hints (FILE *f, ipa_hints hints) hints &= ~INLINE_HINT_declared_inline; fprintf (f, " declared_inline"); } - if (hints & INLINE_HINT_array_index) - { - hints &= ~INLINE_HINT_array_index; - fprintf (f, " array_index"); - } if (hints & INLINE_HINT_known_hot) { hints &= ~INLINE_HINT_known_hot; @@ -549,8 +544,6 @@ ipa_fn_summary::~ipa_fn_summary () edge_predicate_pool.remove (loop_iterations); if (loop_stride) edge_predicate_pool.remove (loop_stride); - if (array_index) - edge_predicate_pool.remove (array_index); vec_free (conds); vec_free (size_time_table); } @@ -703,8 +696,6 @@ ipa_fn_summary_t::duplicate (cgraph_node *src, possible_truths); remap_hint_predicate_after_duplication (&info->loop_stride, possible_truths); - remap_hint_predicate_after_duplication (&info->array_index, - possible_truths);
/* If inliner or someone after inliner will ever start producing non-trivial clones, we will get trouble with lack of information @@ -727,12 +718,6 @@ ipa_fn_summary_t::duplicate (cgraph_node *src, info->loop_stride = NULL; set_hint_predicate (&info->loop_stride, p); } - if (info->array_index) - { - predicate p = *info->array_index; - info->array_index = NULL; - set_hint_predicate (&info->array_index, p); - } } if (!dst->global.inlined_to) ipa_update_overall_fn_summary (dst); @@ -894,11 +879,6 @@ ipa_dump_fn_summary (FILE *f, struct cgraph_node *node) fprintf (f, " loop stride:"); s->loop_stride->dump (f, s->conds); } - if (s->array_index) - { - fprintf (f, " array index:"); - s->array_index->dump (f, s->conds); - } fprintf (f, " calls:\n"); dump_ipa_call_summary (f, 4, node, s); fprintf (f, "\n"); @@ -1824,27 +1804,6 @@ predicate_for_phi_result (class ipa_fn_summary *summary, gphi *phi, nonconstant_names[SSA_NAME_VERSION (gimple_phi_result (phi))] = *p; }
-/* Return predicate specifying when array index in access OP becomes non-constant. */ - -static predicate -array_index_predicate (ipa_fn_summary *info, - vec< predicate> nonconstant_names, tree op) -{ - predicate p = false; - while (handled_component_p (op)) - { - if (TREE_CODE (op) == ARRAY_REF || TREE_CODE (op) == ARRAY_RANGE_REF) - { - if (TREE_CODE (TREE_OPERAND (op, 1)) == SSA_NAME) - p = p.or_with (info->conds, - nonconstant_names[SSA_NAME_VERSION - (TREE_OPERAND (op, 1))]); - } - op = TREE_OPERAND (op, 0); - } - return p; -} - /* For a typical usage of __builtin_expect (a<b, 1), we may introduce an extra relation stmt: With the builtin, we have @@ -2001,7 +1960,6 @@ analyze_function_body (struct cgraph_node *node, bool early) vec<predicate> nonconstant_names = vNULL; int nblocks, n; int *order; - predicate array_index = true; gimple *fix_builtin_expect_stmt;
gcc_assert (my_function && my_function->cfg); @@ -2146,26 +2104,6 @@ analyze_function_body (struct cgraph_node *node, bool early) this_time); }
- if (gimple_assign_load_p (stmt) && nonconstant_names.exists ()) - { - predicate this_array_index; - this_array_index = - array_index_predicate (info, nonconstant_names, - gimple_assign_rhs1 (stmt)); - if (this_array_index != false) - array_index &= this_array_index; - } - if (gimple_store_p (stmt) && nonconstant_names.exists ()) - { - predicate this_array_index; - this_array_index = - array_index_predicate (info, nonconstant_names, - gimple_get_lhs (stmt)); - if (this_array_index != false) - array_index &= this_array_index; - } - - if (is_gimple_call (stmt) && !gimple_call_internal_p (stmt)) { @@ -2273,14 +2211,40 @@ analyze_function_body (struct cgraph_node *node, bool early) if (dump_file) fprintf (dump_file, " fp_expression set\n"); } + }
- gcc_assert (time >= 0); - gcc_assert (size >= 0); + /* Account cost of address calculations in the statements. */ + for (unsigned int i = 0; i < gimple_num_ops (stmt); i++) + { + for (tree op = gimple_op (stmt, i); + op && handled_component_p (op); + op = TREE_OPERAND (op, 0)) + if ((TREE_CODE (op) == ARRAY_REF + || TREE_CODE (op) == ARRAY_RANGE_REF) + && TREE_CODE (TREE_OPERAND (op, 1)) == SSA_NAME) + { + predicate p = bb_predicate; + if (fbi.info) + p = p & will_be_nonconstant_expr_predicate + (&fbi, info, TREE_OPERAND (op, 1), + nonconstant_names); + if (p != false) + { + time += freq; + size += 1; + if (dump_file) + fprintf (dump_file, + "\t\tAccounting address calculation.\n"); + info->account_size_time (ipa_fn_summary::size_scale, + freq, + bb_predicate, + p); + } + } } + } } - set_hint_predicate (&ipa_fn_summaries->get_create (node)->array_index, - array_index); free (order);
if (nonconstant_names.exists () && !early) @@ -2783,9 +2747,6 @@ estimate_node_size_and_time (struct cgraph_node *node, if (info->loop_stride && !info->loop_stride->evaluate (possible_truths)) hints |= INLINE_HINT_loop_stride; - if (info->array_index - && !info->array_index->evaluate (possible_truths)) - hints |= INLINE_HINT_array_index; if (info->scc_no) hints |= INLINE_HINT_in_scc; if (DECL_DECLARED_INLINE_P (node->decl)) @@ -3106,9 +3067,6 @@ ipa_merge_fn_summary_after_inlining (struct cgraph_edge *edge) remap_hint_predicate (info, callee_info, &callee_info->loop_stride, operand_map, offset_map, clause, &toplev_predicate); - remap_hint_predicate (info, callee_info, - &callee_info->array_index, - operand_map, offset_map, clause, &toplev_predicate);
ipa_call_summary *s = ipa_call_summaries->get (edge); inline_update_callee_summaries (edge->callee, s->loop_depth); @@ -3366,9 +3324,6 @@ inline_read_section (struct lto_file_decl_data *file_data, const char *data, p.stream_in (&ib); if (info) set_hint_predicate (&info->loop_stride, p); - p.stream_in (&ib); - if (info) - set_hint_predicate (&info->array_index, p); for (e = node->callees; e; e = e->next_callee) read_ipa_call_summary (&ib, e, info != NULL); for (e = node->indirect_calls; e; e = e->next_callee) @@ -3517,10 +3472,6 @@ ipa_fn_summary_write (void) info->loop_stride->stream_out (ob); else streamer_write_uhwi (ob, 0); - if (info->array_index) - info->array_index->stream_out (ob); - else - streamer_write_uhwi (ob, 0); for (edge = cnode->callees; edge; edge = edge->next_callee) write_ipa_call_summary (ob, edge); for (edge = cnode->indirect_calls; edge; edge = edge->next_callee) diff --git a/gcc/ipa-fnsummary.h b/gcc/ipa-fnsummary.h index 55bc34146aa..173d3f2a652 100644 --- a/gcc/ipa-fnsummary.h +++ b/gcc/ipa-fnsummary.h @@ -48,11 +48,8 @@ enum ipa_hints_vals { if functions are in different modules, inlining may not be so important. Set by simple_edge_hints in ipa-inline-analysis.c. */ INLINE_HINT_cross_module = 64, - /* If array indexes of loads/stores become known there may be room for - further optimization. */ - INLINE_HINT_array_index = 128, /* We know that the callee is hot by profile. */ - INLINE_HINT_known_hot = 256 + INLINE_HINT_known_hot = 128 };
typedef int ipa_hints; @@ -97,7 +94,7 @@ public: fp_expressions (false), estimated_stack_size (false), stack_frame_offset (false), time (0), size (0), conds (NULL), size_time_table (NULL), loop_iterations (NULL), loop_stride (NULL), - array_index (NULL), growth (0), scc_no (0) + growth (0), scc_no (0) { }
@@ -111,7 +108,7 @@ public: stack_frame_offset (s.stack_frame_offset), time (s.time), size (s.size), conds (s.conds), size_time_table (s.size_time_table), loop_iterations (s.loop_iterations), loop_stride (s.loop_stride), - array_index (s.array_index), growth (s.growth), scc_no (s.scc_no) + growth (s.growth), scc_no (s.scc_no) {}
/* Default constructor. */ @@ -157,8 +154,6 @@ public: /* Predicate on when some loop in the function becomes to have known stride. */ predicate * GTY((skip)) loop_stride; - /* Predicate on when some array indexes become constants. */ - predicate * GTY((skip)) array_index; /* Estimated growth for inlining all copies of the function before start of small functions inlining. This value will get out of date as the callers are duplicated, but diff --git a/gcc/ipa-inline.c b/gcc/ipa-inline.c index 939d86ef94a..e73006662ad 100644 --- a/gcc/ipa-inline.c +++ b/gcc/ipa-inline.c @@ -807,7 +807,6 @@ want_inline_small_function_p (struct cgraph_edge *e, bool report) || (!(hints & (INLINE_HINT_indirect_call | INLINE_HINT_known_hot | INLINE_HINT_loop_iterations - | INLINE_HINT_array_index | INLINE_HINT_loop_stride)) && !(big_speedup = big_speedup_p (e))))) { @@ -833,7 +832,6 @@ want_inline_small_function_p (struct cgraph_edge *e, bool report) && !(hints & INLINE_HINT_known_hot) && growth >= ((hints & (INLINE_HINT_indirect_call | INLINE_HINT_loop_iterations - | INLINE_HINT_array_index | INLINE_HINT_loop_stride)) ? MAX (MAX_INLINE_INSNS_AUTO, MAX_INLINE_INSNS_SINGLE) @@ -1227,7 +1225,6 @@ edge_badness (struct cgraph_edge *edge, bool dump) badness = badness.shift (badness > 0 ? 4 : -4); if ((hints & (INLINE_HINT_indirect_call | INLINE_HINT_loop_iterations - | INLINE_HINT_array_index | INLINE_HINT_loop_stride)) || callee_info->growth <= 0) badness = badness.shift (badness > 0 ? -2 : 2); diff --git a/gcc/params.def b/gcc/params.def index c56055da9d9..7d0dcae0aee 100644 --- a/gcc/params.def +++ b/gcc/params.def @@ -1109,12 +1109,6 @@ DEFPARAM (PARAM_IPA_CP_LOOP_HINT_BONUS, "bounds or strides known.", 64, 0, 0)
-DEFPARAM (PARAM_IPA_CP_ARRAY_INDEX_HINT_BONUS, - "ipa-cp-array-index-hint-bonus", - "Compile-time bonus IPA-CP assigns to candidates which make an array " - "index known.", - 48, 0, 0) - DEFPARAM (PARAM_IPA_MAX_AA_STEPS, "ipa-max-aa-steps", "Maximum number of statements that will be visited by IPA formal " </cut>