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 <[email protected]>
* 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.