------- Comment #4 from nemet at gcc dot gnu dot org  2009-01-14 21:48 -------
It only happens on SHIFT_COUNT_TRUNCATED targets (i.e. mips but not x86).

I will do some more digging on the history of the SHIFT_COUNT_TRUNCATED code
here but this patch fixes the ICE:

Index: expmed.c 
=================================================================== 
--- expmed.c    (revision 143286) 
+++ expmed.c    (working copy) 
@@ -2119,21 +2119,22 @@ expand_shift (enum tree_code code, enum  
      on all machines.  */ 

   if (SHIFT_COUNT_TRUNCATED) 
     { 
       if (GET_CODE (op1) == CONST_INT 
          && ((unsigned HOST_WIDE_INT) INTVAL (op1) >= 
              (unsigned HOST_WIDE_INT) GET_MODE_BITSIZE (mode))) 
        op1 = GEN_INT ((unsigned HOST_WIDE_INT) INTVAL (op1) 
                       % GET_MODE_BITSIZE (mode)); 
       else if (GET_CODE (op1) == SUBREG 
-              && subreg_lowpart_p (op1)) 
+              && subreg_lowpart_p (op1) 
+              && INTEGRAL_MODE_P (GET_MODE (SUBREG_REG (op1)))) 
        op1 = SUBREG_REG (op1); 
     } 

   if (op1 == const0_rtx) 
     return shifted; 

   /* Check whether its cheaper to implement a left shift by a constant 
      bit count by a sequence of additions.  */ 
   if (code == LSHIFT_EXPR 
       && GET_CODE (op1) == CONST_INT 



-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=38554

Reply via email to