From f805670fc351f0dde9def27103567ad51125b4c8 Mon Sep 17 00:00:00 2001 From: "J\"orn Rennecke" Date: Fri, 2 Sep 2005 12:04:22 +0000 Subject: [PATCH] re PR rtl-optimization/20365 (simplify_plus_minus results are erratic) PR rtl-optimization/20365 * simplify-rtx.c (simplify_plus_minus_op_data): Change type of neg to short. New member ix. (simplify_plus_minus_op_data_cmp): Break ties using ix member. (simplify_plus_minus): Initialize ix members before calling qsort. From-SVN: r103771 --- gcc/ChangeLog | 8 ++++++++ gcc/simplify-rtx.c | 18 ++++++++++++++---- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 44b66fbc14b6..f240c5d0738f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2005-09-02 J"orn Rennecke + + PR rtl-optimization/20365 + * simplify-rtx.c (simplify_plus_minus_op_data): Change type of neg + to short. New member ix. + (simplify_plus_minus_op_data_cmp): Break ties using ix member. + (simplify_plus_minus): Initialize ix members before calling qsort. + 2005-09-02 Zdenek Dvorak PR tree-optimization/23626 diff --git a/gcc/simplify-rtx.c b/gcc/simplify-rtx.c index 8a2faae30a6e..13e90e99bfdd 100644 --- a/gcc/simplify-rtx.c +++ b/gcc/simplify-rtx.c @@ -2574,7 +2574,8 @@ simplify_const_binary_operation (enum rtx_code code, enum machine_mode mode, struct simplify_plus_minus_op_data { rtx op; - int neg; + short neg; + short ix; }; static int @@ -2582,9 +2583,13 @@ simplify_plus_minus_op_data_cmp (const void *p1, const void *p2) { const struct simplify_plus_minus_op_data *d1 = p1; const struct simplify_plus_minus_op_data *d2 = p2; + int result; - return (commutative_operand_precedence (d2->op) - - commutative_operand_precedence (d1->op)); + result = (commutative_operand_precedence (d2->op) + - commutative_operand_precedence (d1->op)); + if (result) + return result; + return d1->ix - d2->ix; } static rtx @@ -2759,7 +2764,12 @@ simplify_plus_minus (enum rtx_code code, enum machine_mode mode, rtx op0, /* Pack all the operands to the lower-numbered entries. */ for (i = 0, j = 0; j < n_ops; j++) if (ops[j].op) - ops[i++] = ops[j]; + { + ops[i] = ops[j]; + /* Stabilize sort. */ + ops[i].ix = i; + i++; + } n_ops = i; /* Sort the operations based on swap_commutative_operands_p. */