re PR middle-end/88032 (ICE in operand_subword_force, at emit-rtl.c:1793)
authorJakub Jelinek <jakub@redhat.com>
Fri, 16 Nov 2018 16:40:53 +0000 (17:40 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 16 Nov 2018 16:40:53 +0000 (17:40 +0100)
PR middle-end/88032
* optabs.c (expand_binop): For op0_mode use GET_MODE (op0), unless it
is VOIDmode, in which case use int_mode.  Similarly for op1_mode.

From-SVN: r266216

gcc/ChangeLog
gcc/optabs.c

index a7171079517222e2349f0c7d7e40aa92ac9d5fec..a6881d218be78d8190a00adc31e8eedde8de0393 100644 (file)
@@ -1,3 +1,9 @@
+2018-11-16  Jakub Jelinek  <jakub@redhat.com>
+
+       PR middle-end/88032
+       * optabs.c (expand_binop): For op0_mode use GET_MODE (op0), unless it
+       is VOIDmode, in which case use int_mode.  Similarly for op1_mode.
+
 2018-11-16  Eric Botcazou  <ebotcazou@adacore.com>
 
        * tree-switch-conversion.h (switch_decision_tree::emit_case_nodes): Add
index c7d1f22e7a86757c2ac273002319e2f9dcc2ee9f..130b1182ef002b3878062a2c1622d4affc4e6099 100644 (file)
@@ -1377,8 +1377,12 @@ expand_binop (machine_mode mode, optab binoptab, rtx op0, rtx op1,
       start_sequence ();
 
       /* Do the actual arithmetic.  */
-      enum machine_mode op0_mode = CONSTANT_P (op0) ? int_mode : VOIDmode;
-      enum machine_mode op1_mode = CONSTANT_P (op1) ? int_mode : VOIDmode;
+      enum machine_mode op0_mode = GET_MODE (op0);
+      enum machine_mode op1_mode = GET_MODE (op1);
+      if (op0_mode == VOIDmode)
+       op0_mode = int_mode;
+      if (op1_mode == VOIDmode)
+       op1_mode = int_mode;
       for (i = 0; i < GET_MODE_BITSIZE (int_mode) / BITS_PER_WORD; i++)
        {
          rtx target_piece = operand_subword (target, i, 1, int_mode);