Blob Blame History Raw
2007-07-10  Jakub Jelinek  <jakub@redhat.com>

	* simplify-rtx.c (simplify_plus_minus_op_data_cmp): If both operands
	are REGs and TARGET_INDEX_OPERAND_FIRST, sort lower REGNOs first.

	* gcc.dg/20070710-1.c: New test.

--- gcc/simplify-rtx.c.jj	2006-08-11 17:32:05.000000000 +0200
+++ gcc/simplify-rtx.c	2007-07-09 22:53:26.000000000 +0200
@@ -2608,6 +2608,12 @@ simplify_plus_minus_op_data_cmp (const v
 	    - commutative_operand_precedence (d1->op));
   if (result)
     return result;
+
+  /* Group together equal REGs to do more simplification.  */
+  if (TARGET_INDEX_OPERAND_FIRST && REG_P (d1->op) && REG_P (d2->op)
+      && REGNO (d1->op) != REGNO (d2->op))
+    return REGNO (d1->op) - REGNO (d2->op);
+
   return d1->ix - d2->ix;
 }
 
--- gcc/testsuite/gcc.dg/20070710-1.c.jj	2007-07-10 09:32:43.000000000 +0200
+++ gcc/testsuite/gcc.dg/20070710-1.c	2007-07-10 09:31:39.000000000 +0200
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -ffast-math" } */
+
+extern float sqrtf (float);
+
+float
+foo (const float *m)
+{
+  float x = m[0] + m[1] + m[2] + 1.0f;
+  float s;
+
+  if (x > 0.001)
+    s = 0.5f / sqrtf (x);
+  else
+    s = 2.0f * sqrtf (1.0f + m[0] - m[1] - m[2]);
+  return s;
+}