From: Jakub Jelinek Date: Wed, 22 Mar 2017 21:52:13 +0000 (+0100) Subject: re PR tree-optimization/80072 (ICE in gimple_build_assign_1 with -O3 -march=broadwell... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=b51ee78c5d021aacc3acb13cd3eba2c301ec26e5;p=gcc.git re PR tree-optimization/80072 (ICE in gimple_build_assign_1 with -O3 -march=broadwell/skylake-avx512) PR tree-optimization/80072 * tree-ssa-reassoc.c (struct operand_entry): Change id field type to unsigned int. (next_operand_entry_id): Change type to unsigned int. (sort_by_operand_rank): Make sure to return the right return value even if unsigned fields are bigger than INT_MAX. (struct oecount): Change cnt and id type to unsigned int. (oecount_hasher::equal): Formatting fix. (oecount_cmp): Make sure to return the right return value even if unsigned fields are bigger than INT_MAX. (undistribute_ops_list): Change next_oecount_id type to unsigned int. From-SVN: r246408 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5259dce80a5..205de5cb24b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,17 @@ 2017-03-22 Jakub Jelinek + PR tree-optimization/80072 + * tree-ssa-reassoc.c (struct operand_entry): Change id field type + to unsigned int. + (next_operand_entry_id): Change type to unsigned int. + (sort_by_operand_rank): Make sure to return the right return value + even if unsigned fields are bigger than INT_MAX. + (struct oecount): Change cnt and id type to unsigned int. + (oecount_hasher::equal): Formatting fix. + (oecount_cmp): Make sure to return the right return value + even if unsigned fields are bigger than INT_MAX. + (undistribute_ops_list): Change next_oecount_id type to unsigned int. + PR c++/80129 * gimplify.c (gimplify_modify_expr_rhs) : Clear TREE_READONLY on result if writing it more than once. diff --git a/gcc/tree-ssa-reassoc.c b/gcc/tree-ssa-reassoc.c index 36ef86cf44b..9c39bb81aa6 100644 --- a/gcc/tree-ssa-reassoc.c +++ b/gcc/tree-ssa-reassoc.c @@ -193,7 +193,7 @@ static struct struct operand_entry { unsigned int rank; - int id; + unsigned int id; tree op; unsigned int count; gimple *stmt_to_insert; @@ -204,7 +204,7 @@ static object_allocator operand_entry_pool /* This is used to assign a unique ID to each struct operand_entry so that qsort results are identical on different hosts. */ -static int next_operand_entry_id; +static unsigned int next_operand_entry_id; /* Starting rank number for a given basic block, so that we can rank operations using unmovable instructions in that BB based on the bb @@ -505,12 +505,12 @@ sort_by_operand_rank (const void *pa, const void *pb) else /* To make sorting result stable, we use unique IDs to determine order. */ - return oeb->id - oea->id; + return oeb->id > oea->id ? 1 : -1; } /* Lastly, make sure the versions that are the same go next to each other. */ - if ((oeb->rank - oea->rank == 0) + if (oeb->rank == oea->rank && TREE_CODE (oea->op) == SSA_NAME && TREE_CODE (oeb->op) == SSA_NAME) { @@ -543,15 +543,15 @@ sort_by_operand_rank (const void *pa, const void *pb) } if (SSA_NAME_VERSION (oeb->op) != SSA_NAME_VERSION (oea->op)) - return SSA_NAME_VERSION (oeb->op) - SSA_NAME_VERSION (oea->op); + return SSA_NAME_VERSION (oeb->op) > SSA_NAME_VERSION (oea->op) ? 1 : -1; else - return oeb->id - oea->id; + return oeb->id > oea->id ? 1 : -1; } if (oeb->rank != oea->rank) - return oeb->rank - oea->rank; + return oeb->rank > oea->rank ? 1 : -1; else - return oeb->id - oea->id; + return oeb->id > oea->id ? 1 : -1; } /* Add an operand entry to *OPS for the tree operand OP. */ @@ -1055,8 +1055,8 @@ static void linearize_expr_tree (vec *, gimple *, /* Structure for tracking and counting operands. */ struct oecount { - int cnt; - int id; + unsigned int cnt; + unsigned int id; enum tree_code oecode; tree op; }; @@ -1090,8 +1090,7 @@ oecount_hasher::equal (int p1, int p2) { const oecount *c1 = &cvec[p1 - 42]; const oecount *c2 = &cvec[p2 - 42]; - return (c1->oecode == c2->oecode - && c1->op == c2->op); + return c1->oecode == c2->oecode && c1->op == c2->op; } /* Comparison function for qsort sorting oecount elements by count. */ @@ -1102,10 +1101,10 @@ oecount_cmp (const void *p1, const void *p2) const oecount *c1 = (const oecount *)p1; const oecount *c2 = (const oecount *)p2; if (c1->cnt != c2->cnt) - return c1->cnt - c2->cnt; + return c1->cnt > c2->cnt ? 1 : -1; else /* If counts are identical, use unique IDs to stabilize qsort. */ - return c1->id - c2->id; + return c1->id > c2->id ? 1 : -1; } /* Return TRUE iff STMT represents a builtin call that raises OP @@ -1559,7 +1558,7 @@ undistribute_ops_list (enum tree_code opcode, sbitmap_iterator sbi0; vec *subops; bool changed = false; - int next_oecount_id = 0; + unsigned int next_oecount_id = 0; if (length <= 1 || opcode != PLUS_EXPR)