https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82381

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|ice-on-valid-code           |ice-checking
   Last reconfirmed|2017-10-02 00:00:00         |
                 CC|                            |amonakov at gcc dot gnu.org,
                   |                            |jakub at gcc dot gnu.org,
                   |                            |kugan at gcc dot gnu.org
           Assignee|marxin at gcc dot gnu.org          |unassigned at gcc dot 
gnu.org
   Target Milestone|---                         |8.0
            Summary|internal compiler error:    |[8 Regression] internal
                   |qsort checking failed       |compiler error: qsort
                   |                            |checking failed

--- Comment #3 from Richard Biener <rguenth at gcc dot gnu.org> ---
Probably simply

2017-09-29  Alexander Monakov  <amona...@ispras.ru>

        * genmodes.c (calc_wider_mode): Suppress qsort macro.
        * system.h [CHECKING_P] (qsort): Redirect to qsort_chk.
        (qsort_chk): Declare.
        * vec.c [CHECKING_P] (qsort_chk_error): New static function.
        (qsort_chk): New function.

we now check validity of qsort compare functions.

#2  0x0000000001dc91d2 in qsort_chk (base=0x2c2e438, n=4, size=8, cmp=
    0x14074c6 <sort_by_operand_rank(void const*, void const*)>)
    at /tmp/trunk2/gcc/vec.c:274
274                 return ERR3 (i, i1, j);
(gdb) l
269           /* Verify that elements within this span compare less than
270              elements beyond the span.  */
271           for (i = i1; i < i2; i++)
272             for (j = i2; j < i2 + lim2; j++)
273               if (CMP (i, j) >= 0)
274                 return ERR3 (i, i1, j);
275               else if (CMP (j, i) <= 0)
276                 return ERR2 (i, j);

I'm quite sure that

      /* As SSA_NAME_VERSION is assigned pretty randomly, because we reuse
         versions of removed SSA_NAMEs, so if possible, prefer to sort
         based on basic block and gimple_uid of the SSA_NAME_DEF_STMT.
         See PR60418.  */
      if (!SSA_NAME_IS_DEFAULT_DEF (oea->op)
          && !SSA_NAME_IS_DEFAULT_DEF (oeb->op)
          && !oea->stmt_to_insert
          && !oeb->stmt_to_insert
          && SSA_NAME_VERSION (oeb->op) != SSA_NAME_VERSION (oea->op))
        {
          gimple *stmta = SSA_NAME_DEF_STMT (oea->op);
          gimple *stmtb = SSA_NAME_DEF_STMT (oeb->op);
          basic_block bba = gimple_bb (stmta);
          basic_block bbb = gimple_bb (stmtb);
          if (bbb != bba)
            {
              if (bb_rank[bbb->index] != bb_rank[bba->index])
                return bb_rank[bbb->index] - bb_rank[bba->index];
            }
          else
            {
              bool da = reassoc_stmt_dominates_stmt_p (stmta, stmtb);
              bool db = reassoc_stmt_dominates_stmt_p (stmtb, stmta);
              if (da != db)
                return da ? 1 : -1;
            }
        }

breaks transitivity because of the ->stmt_to_insert check.  Here we have
[1] !stmt_to_insert [2] !stmt_to_insert [3] stmt_to_insert

This kind of ordering isn't going to work :/

First introduced by Jakub but then broke with the stmt_to_insert addition
by Kugan...

I guess we need some approximate insert location here.

Reply via email to