OSDN Git Service

PR middle-end/28283
authorsayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 19 Jul 2006 05:13:56 +0000 (05:13 +0000)
committersayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 19 Jul 2006 05:13:56 +0000 (05:13 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@115578 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/sh/sh.c
gcc/expmed.c

index 435f325..24bf834 100644 (file)
@@ -1,3 +1,12 @@
+2006-07-18  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-07-18  Diego Novillo  <dnovillo@redhat.com>
 
        PR 28410
index 97d8741..15eae4c 100644 (file)
@@ -1944,7 +1944,7 @@ shiftcosts (rtx x)
        return 2;
 
       /* 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 (GET_CODE (XEXP (x, 1)) != CONST_INT)
index 6f4e331..0f3a14d 100644 (file)
@@ -2217,7 +2217,9 @@ expand_shift (enum tree_code code, enum machine_mode mode, rtx shifted,
       && GET_CODE (op1) == CONST_INT
       && INTVAL (op1) > 0
       && 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;
       for (i = 0; i < INTVAL (op1); i++)