This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH][ARM] Get mode for rtx costs calculations for SET RTX from destination reg
- From: Kyrill Tkachov <kyrylo dot tkachov at arm dot com>
- To: GCC Patches <gcc-patches at gcc dot gnu dot org>
- Cc: Richard Earnshaw <Richard dot Earnshaw at arm dot com>
- Date: Thu, 09 Jan 2014 17:42:05 +0000
- Subject: [PATCH][ARM] Get mode for rtx costs calculations for SET RTX from destination reg
- Authentication-results: sourceware.org; auth=none
Hi all,
SET RTXs don't have a mode, so the code to calculate a reg-to-reg set in the arm
rtx costs function needs to get the mode from one of the registers involved. We
already did that when the source is a CONST_INT.
This patch fixes that oversight and also prevents us from falling through or
recursing, since the cost calculated for (set (reg) (reg)) should be final at
that point.
Tested arm-none-eabi on qemu.
Ok for trunk?
Thanks,
Kyrill
2014-01-09 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
* config/arm/arm.c (arm_new_rtx_costs): Use destination mode
when handling a SET rtx.
diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
index c8bf7c1..4c991c2 100644
--- a/gcc/config/arm/arm.c
+++ b/gcc/config/arm/arm.c
@@ -9092,6 +9092,9 @@ arm_new_rtx_costs (rtx x, enum rtx_code code, enum rtx_code outer_code,
{
case SET:
*cost = 0;
+ /* SET RTXs don't have a mode so we get it from the destination. */
+ mode = GET_MODE (SET_DEST (x));
+
if (REG_P (SET_SRC (x))
&& REG_P (SET_DEST (x)))
{
@@ -9106,6 +9109,8 @@ arm_new_rtx_costs (rtx x, enum rtx_code code, enum rtx_code outer_code,
in 16 bits in Thumb mode. */
if (!speed_p && TARGET_THUMB && outer_code == COND_EXEC)
*cost >>= 1;
+
+ return true;
}
if (CONST_INT_P (SET_SRC (x)))
@@ -9113,7 +9118,6 @@ arm_new_rtx_costs (rtx x, enum rtx_code code, enum rtx_code outer_code,
/* Handle CONST_INT here, since the value doesn't have a mode
and we would otherwise be unable to work out the true cost. */
*cost = rtx_cost (SET_DEST (x), SET, 0, speed_p);
- mode = GET_MODE (SET_DEST (x));
outer_code = SET;
/* Slightly lower the cost of setting a core reg to a constant.
This helps break up chains and allows for better scheduling. */