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.tkac...@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. */