re PR rtl-optimization/53176 (gcc.dg/lower-subreg-1.c FAILs)

PR rtl-optimization/53176
	* rtlanal.c (rtx_cost): Adjust default cost for X with a
	UNITS_PER_WORD factor for all X according to the size of
	its mode, not just for SUBREGs with untieable modes.
	Handle SET.  Use factor * factor for MULT, DIV, UDIV,
	MOD, UMOD.

From-SVN: r189441
This commit is contained in:
Hans-Peter Nilsson 2012-07-12 21:14:14 +00:00 committed by Hans-Peter Nilsson
parent 8c15b4b04f
commit e098c16962
2 changed files with 31 additions and 5 deletions

View File

@ -1,3 +1,12 @@
2012-07-12 Hans-Peter Nilsson <hp@axis.com>
PR rtl-optimization/53176
* rtlanal.c (rtx_cost): Adjust default cost for X with a
UNITS_PER_WORD factor for all X according to the size of
its mode, not just for SUBREGs with untieable modes.
Handle SET. Use factor * factor for MULT, DIV, UDIV,
MOD, UMOD.
2012-07-12 Uros Bizjak <ubizjak@gmail.com>
* config/i386/i386.md (QImode and HImode cmove splitters): Merge

View File

@ -3755,10 +3755,17 @@ rtx_cost (rtx x, enum rtx_code outer_code, int opno, bool speed)
enum rtx_code code;
const char *fmt;
int total;
int factor;
if (x == 0)
return 0;
/* A size N times larger than UNITS_PER_WORD likely needs N times as
many insns, taking N times as long. */
factor = GET_MODE_SIZE (GET_MODE (x)) / UNITS_PER_WORD;
if (factor == 0)
factor = 1;
/* Compute the default costs of certain things.
Note that targetm.rtx_costs can override the defaults. */
@ -3766,20 +3773,31 @@ rtx_cost (rtx x, enum rtx_code outer_code, int opno, bool speed)
switch (code)
{
case MULT:
total = COSTS_N_INSNS (5);
/* Multiplication has time-complexity O(N*N), where N is the
number of units (translated from digits) when using
schoolbook long multiplication. */
total = factor * factor * COSTS_N_INSNS (5);
break;
case DIV:
case UDIV:
case MOD:
case UMOD:
total = COSTS_N_INSNS (7);
/* Similarly, complexity for schoolbook long division. */
total = factor * factor * COSTS_N_INSNS (7);
break;
case USE:
/* Used in combine.c as a marker. */
total = 0;
break;
case SET:
/* A SET doesn't have a mode, so let's look at the SET_DEST to get
the mode for the factor. */
factor = GET_MODE_SIZE (GET_MODE (SET_DEST (x))) / UNITS_PER_WORD;
if (factor == 0)
factor = 1;
/* Pass through. */
default:
total = COSTS_N_INSNS (1);
total = factor * COSTS_N_INSNS (1);
}
switch (code)
@ -3792,8 +3810,7 @@ rtx_cost (rtx x, enum rtx_code outer_code, int opno, bool speed)
/* If we can't tie these modes, make this expensive. The larger
the mode, the more expensive it is. */
if (! MODES_TIEABLE_P (GET_MODE (x), GET_MODE (SUBREG_REG (x))))
return COSTS_N_INSNS (2
+ GET_MODE_SIZE (GET_MODE (x)) / UNITS_PER_WORD);
return COSTS_N_INSNS (2 + factor);
break;
default: