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

--- Comment #4 from Richard Guenther <rguenth at gcc dot gnu.org> 2011-05-06 
09:19:38 UTC ---
Ok, so

              other_amount
                = simplify_gen_binary (MINUS, GET_MODE (op1),
                                       GEN_INT (GET_MODE_BITSIZE (mode)),
                                       op1);

does not constant fold!?  Oh.

The following fixes the ICE for me:

Index: expmed.c
===================================================================
--- expmed.c    (revision 173473)
+++ expmed.c    (working copy)
@@ -2141,9 +2141,12 @@ expand_shift_1 (enum tree_code code, enu
              rtx new_amount, other_amount;
              rtx temp1;

+             op1_mode = GET_MODE (op1);
+             if (op1_mode == VOIDmode)
+               op1_mode = word_mode;
              new_amount = op1;
              other_amount
-               = simplify_gen_binary (MINUS, GET_MODE (op1),
+               = simplify_gen_binary (MINUS, op1_mode,
                                       GEN_INT (GET_MODE_BITSIZE (mode)),
                                       op1);

or, other variant, side-stepping the issue:

Index: expmed.c
===================================================================
--- expmed.c    (revision 173473)
+++ expmed.c    (working copy)
@@ -2141,11 +2141,16 @@ expand_shift_1 (enum tree_code code, enu
              rtx new_amount, other_amount;
              rtx temp1;

+             op1_mode = GET_MODE (op1);
              new_amount = op1;
-             other_amount
-               = simplify_gen_binary (MINUS, GET_MODE (op1),
-                                      GEN_INT (GET_MODE_BITSIZE (mode)),
-                                      op1);
+             if (op1_mode == VOIDmode)
+               other_amount = GEN_INT (GET_MODE_BITSIZE (mode)
+                                       - INTVAL (op1));
+             else
+               other_amount
+                 = simplify_gen_binary (MINUS, op1_mode,
+                                        GEN_INT (GET_MODE_BITSIZE (mode)),
+                                        op1);

              shifted = force_reg (mode, shifted);

Reply via email to