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 <hubi...@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-arm-spec2k6-O3/24/artifact/artifacts/build-d67dfb85ba4f89f5f3045f2483005c290bc18108/
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-arm-spec2k6-O3/24/artifact/artifacts/build-a20f263ba1a76af40eb4e6734529739a2a30ed65/
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-arm-spec2k6-O3/24/

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-arm-spec2k6-O3/24/artifact/artifacts/manifests/build-baseline.sh
 --fail
curl -o artifacts/manifests/build-parameters.sh 
https://ci.linaro.org/job/tcwg_bmk_ci_gnu-bisect-tcwg_bmk_tk1-gnu-release-arm-spec2k6-O3/24/artifact/artifacts/manifests/build-parameters.sh
 --fail
curl -o artifacts/test.sh 
https://ci.linaro.org/job/tcwg_bmk_ci_gnu-bisect-tcwg_bmk_tk1-gnu-release-arm-spec2k6-O3/24/artifact/artifacts/test.sh
 --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/ci/tcwg_bmk_gnu_tk1/gnu-release-arm-spec2k6-O3

Artifacts: 
https://ci.linaro.org/job/tcwg_bmk_ci_gnu-bisect-tcwg_bmk_tk1-gnu-release-arm-spec2k6-O3/24/artifact/artifacts/
Build log: 
https://ci.linaro.org/job/tcwg_bmk_ci_gnu-bisect-tcwg_bmk_tk1-gnu-release-arm-spec2k6-O3/24/consoleText

Full commit (up to 1000 lines):
<cut>
commit a20f263ba1a76af40eb4e6734529739a2a30ed65
Author: Jan Hubicka <hubi...@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  <hubi...@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  <seg...@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>
_______________________________________________
linaro-toolchain mailing list
linaro-toolchain@lists.linaro.org
https://lists.linaro.org/mailman/listinfo/linaro-toolchain

Reply via email to