[AArch64] Properly handle simple arith+extend ops in rtx costs
authorKyrylo Tkachov <kyrylo.tkachov@arm.com>
Tue, 28 Jul 2015 11:00:07 +0000 (11:00 +0000)
committerKyrylo Tkachov <ktkachov@gcc.gnu.org>
Tue, 28 Jul 2015 11:00:07 +0000 (11:00 +0000)
* config/aarch64/aarch64.c (aarch64_rtx_arith_op_extract_p):
Handle simple SIGN_EXTEND or ZERO_EXTEND.
(aarch64_rtx_costs): Properly strip extend or extract before
passing down to rtx costs again.

From-SVN: r226309

gcc/ChangeLog
gcc/config/aarch64/aarch64.c

index bbee98a0001343d55168593e91812ddf265cdd14..54a0da3237f8a8ae1e6168362af307dee125d9ad 100644 (file)
@@ -1,3 +1,10 @@
+2015-07-28  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
+
+       * config/aarch64/aarch64.c (aarch64_rtx_arith_op_extract_p):
+       Handle simple SIGN_EXTEND or ZERO_EXTEND.
+       (aarch64_rtx_costs): Properly strip extend or extract before
+       passing down to rtx costs again.
+
 2015-07-28  Nick Clifton  <nickc@redhat.com>
 
        * config/rl78/rl78.c (rl78_addsi3_internal): New function.
index 020f63c0dc1a7b47117a489384d8a38f3d766976..9ba16297c3aaf29c478db9d8533ee5e1494f7c71 100644 (file)
@@ -5617,6 +5617,11 @@ aarch64_rtx_arith_op_extract_p (rtx x, machine_mode mode)
          return true;
        }
     }
+  /* The simple case <ARITH>, XD, XN, XM, [us]xt.
+     No shift.  */
+  else if (GET_CODE (x) == SIGN_EXTEND
+          || GET_CODE (x) == ZERO_EXTEND)
+    return REG_P (XEXP (x, 0));
 
   return false;
 }
@@ -6128,7 +6133,8 @@ cost_minus:
            if (speed)
              *cost += extra_cost->alu.extend_arith;
 
-           *cost += rtx_cost (XEXP (XEXP (op1, 0), 0), VOIDmode,
+           op1 = aarch64_strip_extend (op1);
+           *cost += rtx_cost (op1, VOIDmode,
                               (enum rtx_code) GET_CODE (op1), 0, speed);
            return true;
          }
@@ -6206,7 +6212,8 @@ cost_plus:
            if (speed)
              *cost += extra_cost->alu.extend_arith;
 
-           *cost += rtx_cost (XEXP (XEXP (op0, 0), 0), VOIDmode,
+           op0 = aarch64_strip_extend (op0);
+           *cost += rtx_cost (op0, VOIDmode,
                               (enum rtx_code) GET_CODE (op0), 0, speed);
            return true;
          }