gcc4 generated extremely unoptimal code for shifts of 64-bit ints on SuperH.

Pull over a fix from gcc 4.1 branch.

ok mrg@

Author: sayle
Date: Fri Jul 21 13:22:31 2006
New Revision: 115644

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=115644
Log:

        PR middle-end/28283
        * expmed.c (expand_shift): Additionally check that the shift_cost
        is not MAX_COST and that INTVAL(op1) is less than MAX_BITS_PER_WORD
        before implementing a LSHIFT_EXPR as a sequence of additions.
        * config/sh/sh.c (shift_costs): Return MAX_COST to inform the
        middle-end that DImode shifts need to be synthesized by expand.


Modified:
    branches/gcc-4_1-branch/gcc/ChangeLog
    branches/gcc-4_1-branch/gcc/config/sh/sh.c
    branches/gcc-4_1-branch/gcc/expmed.c
This commit is contained in:
uwe 2006-07-24 23:36:03 +00:00
parent ac9fed958d
commit f482b86d5d
3 changed files with 13 additions and 2 deletions

View File

@ -1,3 +1,12 @@
2006-07-21 Roger Sayle <roger@eyesopen.com>
PR middle-end/28283
* expmed.c (expand_shift): Additionally check that the shift_cost
is not MAX_COST and that INTVAL(op1) is less than MAX_BITS_PER_WORD
before implementing a LSHIFT_EXPR as a sequence of additions.
* config/sh/sh.c (shift_costs): Return MAX_COST to inform the
middle-end that DImode shifts need to be synthesized by expand.
2006-06-25 Eric Botcazou <ebotcazou@adacore.com> 2006-06-25 Eric Botcazou <ebotcazou@adacore.com>
PR middle-end/28151 PR middle-end/28151

View File

@ -1910,7 +1910,7 @@ shiftcosts (rtx x)
return 2; return 2;
/* Everything else is invalid, because there is no pattern for it. */ /* Everything else is invalid, because there is no pattern for it. */
return 10000; return MAX_COST;
} }
/* If shift by a non constant, then this will be expensive. */ /* If shift by a non constant, then this will be expensive. */
if (GET_CODE (XEXP (x, 1)) != CONST_INT) if (GET_CODE (XEXP (x, 1)) != CONST_INT)

View File

@ -2208,7 +2208,9 @@ expand_shift (enum tree_code code, enum machine_mode mode, rtx shifted,
&& GET_CODE (op1) == CONST_INT && GET_CODE (op1) == CONST_INT
&& INTVAL (op1) > 0 && INTVAL (op1) > 0
&& INTVAL (op1) < GET_MODE_BITSIZE (mode) && INTVAL (op1) < GET_MODE_BITSIZE (mode)
&& shift_cost[mode][INTVAL (op1)] > INTVAL (op1) * add_cost[mode]) && INTVAL (op1) < MAX_BITS_PER_WORD
&& shift_cost[mode][INTVAL (op1)] > INTVAL (op1) * add_cost[mode]
&& shift_cost[mode][INTVAL (op1)] != MAX_COST)
{ {
int i; int i;
for (i = 0; i < INTVAL (op1); i++) for (i = 0; i < INTVAL (op1); i++)