[PATCH][combine][1/2] Try to simplify before substituting
authorKyrylo Tkachov <kyrylo.tkachov@arm.com>
Mon, 20 Jul 2015 12:49:36 +0000 (12:49 +0000)
committerKyrylo Tkachov <ktkachov@gcc.gnu.org>
Mon, 20 Jul 2015 12:49:36 +0000 (12:49 +0000)
* combine.c (combine_simplify_rtx): Move simplification step
before various transformations/substitutions.

From-SVN: r225996

gcc/ChangeLog
gcc/combine.c

index c9498114c57f155bd37f61358c02b0278e0ad264..5972a00357120d4c9090ad3be1e94550680c2bcb 100644 (file)
@@ -1,3 +1,8 @@
+2015-07-20  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
+
+       * combine.c (combine_simplify_rtx): Move simplification step
+       before various transformations/substitutions.
+
 2015-07-20  Mikhail Maltsev  <maltsevm@gmail.com>
 
        * wide-int.h (struct binary_traits): Fix partial specialization syntax.
index 574f874d2b19c9201d55778253d275d156e24163..2f806abc8cf29de80d6f9a764ac8f62307fc8557 100644 (file)
@@ -5489,6 +5489,51 @@ combine_simplify_rtx (rtx x, machine_mode op0_mode, int in_dest,
       SUBST (XEXP (x, 1), temp);
     }
 
+  /* Try to fold this expression in case we have constants that weren't
+     present before.  */
+  temp = 0;
+  switch (GET_RTX_CLASS (code))
+    {
+    case RTX_UNARY:
+      if (op0_mode == VOIDmode)
+       op0_mode = GET_MODE (XEXP (x, 0));
+      temp = simplify_unary_operation (code, mode, XEXP (x, 0), op0_mode);
+      break;
+    case RTX_COMPARE:
+    case RTX_COMM_COMPARE:
+      {
+       machine_mode cmp_mode = GET_MODE (XEXP (x, 0));
+       if (cmp_mode == VOIDmode)
+         {
+           cmp_mode = GET_MODE (XEXP (x, 1));
+           if (cmp_mode == VOIDmode)
+             cmp_mode = op0_mode;
+         }
+       temp = simplify_relational_operation (code, mode, cmp_mode,
+                                             XEXP (x, 0), XEXP (x, 1));
+      }
+      break;
+    case RTX_COMM_ARITH:
+    case RTX_BIN_ARITH:
+      temp = simplify_binary_operation (code, mode, XEXP (x, 0), XEXP (x, 1));
+      break;
+    case RTX_BITFIELD_OPS:
+    case RTX_TERNARY:
+      temp = simplify_ternary_operation (code, mode, op0_mode, XEXP (x, 0),
+                                        XEXP (x, 1), XEXP (x, 2));
+      break;
+    default:
+      break;
+    }
+
+  if (temp)
+    {
+      x = temp;
+      code = GET_CODE (temp);
+      op0_mode = VOIDmode;
+      mode = GET_MODE (temp);
+    }
+
   /* If this is a simple operation applied to an IF_THEN_ELSE, try
      applying it to the arms of the IF_THEN_ELSE.  This often simplifies
      things.  Check for cases where both arms are testing the same
@@ -5588,51 +5633,6 @@ combine_simplify_rtx (rtx x, machine_mode op0_mode, int in_dest,
        }
     }
 
-  /* Try to fold this expression in case we have constants that weren't
-     present before.  */
-  temp = 0;
-  switch (GET_RTX_CLASS (code))
-    {
-    case RTX_UNARY:
-      if (op0_mode == VOIDmode)
-       op0_mode = GET_MODE (XEXP (x, 0));
-      temp = simplify_unary_operation (code, mode, XEXP (x, 0), op0_mode);
-      break;
-    case RTX_COMPARE:
-    case RTX_COMM_COMPARE:
-      {
-       machine_mode cmp_mode = GET_MODE (XEXP (x, 0));
-       if (cmp_mode == VOIDmode)
-         {
-           cmp_mode = GET_MODE (XEXP (x, 1));
-           if (cmp_mode == VOIDmode)
-             cmp_mode = op0_mode;
-         }
-       temp = simplify_relational_operation (code, mode, cmp_mode,
-                                             XEXP (x, 0), XEXP (x, 1));
-      }
-      break;
-    case RTX_COMM_ARITH:
-    case RTX_BIN_ARITH:
-      temp = simplify_binary_operation (code, mode, XEXP (x, 0), XEXP (x, 1));
-      break;
-    case RTX_BITFIELD_OPS:
-    case RTX_TERNARY:
-      temp = simplify_ternary_operation (code, mode, op0_mode, XEXP (x, 0),
-                                        XEXP (x, 1), XEXP (x, 2));
-      break;
-    default:
-      break;
-    }
-
-  if (temp)
-    {
-      x = temp;
-      code = GET_CODE (temp);
-      op0_mode = VOIDmode;
-      mode = GET_MODE (temp);
-    }
-
   /* First see if we can apply the inverse distributive law.  */
   if (code == PLUS || code == MINUS
       || code == AND || code == IOR || code == XOR)