re PR rtl-optimization/20365 (simplify_plus_minus results are erratic)
authorJ"orn Rennecke <joern.rennecke@st.com>
Fri, 2 Sep 2005 12:04:22 +0000 (12:04 +0000)
committerJoern Rennecke <amylaar@gcc.gnu.org>
Fri, 2 Sep 2005 12:04:22 +0000 (13:04 +0100)
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
gcc/simplify-rtx.c

index 44b66fbc14b6d5ae3e77cde1688bd50061c36d54..f240c5d0738f8ac48eeeabdbf4d83fad5489c36b 100644 (file)
@@ -1,3 +1,11 @@
+2005-09-02  J"orn Rennecke <joern.rennecke@st.com>
+
+       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  <dvorakz@suse.cz>
 
        PR tree-optimization/23626
index 8a2faae30a6ee6907443b159d12696356cbd624f..13e90e99bfdda27b00b44dde76aa4acd9bb18e29 100644 (file)
@@ -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.  */