Commit 33ff5dda by Jakub Jelinek Committed by Jakub Jelinek

re PR tree-optimization/82381 (internal compiler error: qsort checking failed)

	PR tree-optimization/82381
	* tree-ssa-reassoc.c (sort_by_operand_rank): Don't check
	stmt_to_insert nor wheather SSA_NAMEs are default defs.
	Return 1 or -1 if one of bba and bbb is NULL. If bb_rank is equal,
	fallthrough into reassoc_stmt_dominates_stmt_p.

	* gcc.c-torture/compile/pr82381.c: New test.

From-SVN: r253379
parent bb81a576
2017-10-03 Jakub Jelinek <jakub@redhat.com> 2017-10-03 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/82381
* tree-ssa-reassoc.c (sort_by_operand_rank): Don't check
stmt_to_insert nor wheather SSA_NAMEs are default defs.
Return 1 or -1 if one of bba and bbb is NULL. If bb_rank is equal,
fallthrough into reassoc_stmt_dominates_stmt_p.
PR target/82386 PR target/82386
* combine.c (combine_instructions): Don't combine in unreachable * combine.c (combine_instructions): Don't combine in unreachable
basic blocks. basic blocks.
2017-10-03 Jakub Jelinek <jakub@redhat.com> 2017-10-03 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/82381
* gcc.c-torture/compile/pr82381.c: New test.
PR target/82386 PR target/82386
* gcc.dg/pr82386.c: New test. * gcc.dg/pr82386.c: New test.
......
/* PR tree-optimization/82381 */
/* { dg-do compile } */
signed char b, h;
unsigned short c, e;
short int d, f, g;
void
foo ()
{
if (h)
{
short a = -(d + c - b);
f = e - a - -d;
}
if (c)
g = 0;
}
...@@ -514,36 +514,37 @@ sort_by_operand_rank (const void *pa, const void *pb) ...@@ -514,36 +514,37 @@ sort_by_operand_rank (const void *pa, const void *pb)
&& TREE_CODE (oea->op) == SSA_NAME && TREE_CODE (oea->op) == SSA_NAME
&& TREE_CODE (oeb->op) == SSA_NAME) && TREE_CODE (oeb->op) == SSA_NAME)
{ {
/* As SSA_NAME_VERSION is assigned pretty randomly, because we reuse if (SSA_NAME_VERSION (oeb->op) != SSA_NAME_VERSION (oea->op))
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))
{ {
/* 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. */
gimple *stmta = SSA_NAME_DEF_STMT (oea->op); gimple *stmta = SSA_NAME_DEF_STMT (oea->op);
gimple *stmtb = SSA_NAME_DEF_STMT (oeb->op); gimple *stmtb = SSA_NAME_DEF_STMT (oeb->op);
basic_block bba = gimple_bb (stmta); basic_block bba = gimple_bb (stmta);
basic_block bbb = gimple_bb (stmtb); basic_block bbb = gimple_bb (stmtb);
if (bbb != bba) if (bbb != bba)
{ {
/* One of the SSA_NAMEs can be defined in oeN->stmt_to_insert
but the other might not. */
if (!bba)
return 1;
if (!bbb)
return -1;
/* If neither is, compare bb_rank. */
if (bb_rank[bbb->index] != bb_rank[bba->index]) if (bb_rank[bbb->index] != bb_rank[bba->index])
return 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;
}
}
if (SSA_NAME_VERSION (oeb->op) != SSA_NAME_VERSION (oea->op)) bool da = reassoc_stmt_dominates_stmt_p (stmta, stmtb);
return SSA_NAME_VERSION (oeb->op) > SSA_NAME_VERSION (oea->op) ? 1 : -1; bool db = reassoc_stmt_dominates_stmt_p (stmtb, stmta);
if (da != db)
return da ? 1 : -1;
return (SSA_NAME_VERSION (oeb->op) > SSA_NAME_VERSION (oea->op)
? 1 : -1);
}
else else
return oeb->id > oea->id ? 1 : -1; return oeb->id > oea->id ? 1 : -1;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment