Hi,
There is parameter max-pending-list-length in gcc scheduler, but the
parameter is checked using greater than condition.  As a result, the real
max pending list length is actually "max-pending-list-length + 1".  This
patch fixes this by using ">=" rather than ">" comparison operator.  Though
it is kind of nit-picking, I want to change this: a) it breaks sched-fusion
because the 33rd couldn't be paired; b) when sched-fusion tries to sort many
consecutive stores, it breaks dcache line alignment at large probability.  I
mean without cache sensitive optimizer, GCC breaks dcache line alignment
randomly, but 33 is definitely worse than 32.  Of course, this only happens
in very restricted case.

Bootstrap and test on x86_64.  Is it OK?

2014-11-10  Bin Cheng  <bin.ch...@arm.com>

        * sched-deps.c (sched_analyze_1): Check pending list if it is not
        less than MAX_PENDING_LIST_LENGTH.
        (sched_analyze_2, sched_analyze_insn, deps_analyze_insn): Ditto.
Index: gcc/sched-deps.c
===================================================================
--- gcc/sched-deps.c    (revision 217273)
+++ gcc/sched-deps.c    (working copy)
@@ -2504,7 +2504,7 @@ sched_analyze_1 (struct deps_desc *deps, rtx x, rt
       /* Pending lists can't get larger with a readonly context.  */
       if (!deps->readonly
           && ((deps->pending_read_list_length + 
deps->pending_write_list_length)
-              > MAX_PENDING_LIST_LENGTH))
+              >= MAX_PENDING_LIST_LENGTH))
        {
          /* Flush all pending reads and writes to prevent the pending lists
             from getting any larger.  Insn scheduling runs too slowly when
@@ -2722,7 +2722,7 @@ sched_analyze_2 (struct deps_desc *deps, rtx x, rt
          {
            if ((deps->pending_read_list_length
                 + deps->pending_write_list_length)
-               > MAX_PENDING_LIST_LENGTH
+               >= MAX_PENDING_LIST_LENGTH
                && !DEBUG_INSN_P (insn))
              flush_pending_lists (deps, insn, true, true);
            add_insn_mem_dependence (deps, true, insn, x);
@@ -3227,8 +3227,8 @@ sched_analyze_insn (struct deps_desc *deps, rtx x,
          EXECUTE_IF_SET_IN_REG_SET (reg_pending_clobbers, 0, i, rsi)
            {
              struct deps_reg *reg_last = &deps->reg_last[i];
-             if (reg_last->uses_length > MAX_PENDING_LIST_LENGTH
-                 || reg_last->clobbers_length > MAX_PENDING_LIST_LENGTH)
+             if (reg_last->uses_length >= MAX_PENDING_LIST_LENGTH
+                 || reg_last->clobbers_length >= MAX_PENDING_LIST_LENGTH)
                {
                  add_dependence_list_and_free (deps, insn, &reg_last->sets, 0,
                                                REG_DEP_OUTPUT, false);
@@ -3661,7 +3661,7 @@ deps_analyze_insn (struct deps_desc *deps, rtx_ins
                && sel_insn_is_speculation_check (insn)))
         {
           /* Keep the list a reasonable size.  */
-          if (deps->pending_flush_length++ > MAX_PENDING_LIST_LENGTH)
+          if (deps->pending_flush_length++ >= MAX_PENDING_LIST_LENGTH)
             flush_pending_lists (deps, insn, true, true);
           else
            deps->pending_jump_insns

Reply via email to