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.