re PR rtl-optimization/69764 (ICE on x86_64-linux-gnu at -O0 (in decompose, at rtl...
authorJakub Jelinek <jakub@redhat.com>
Tue, 16 Feb 2016 15:15:40 +0000 (16:15 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 16 Feb 2016 15:15:40 +0000 (16:15 +0100)
PR rtl-optimization/69764
PR rtl-optimization/69771
* optabs.c (expand_binop): Ensure for shift optabs invalid CONST_INT
op1 is valid for GET_MODE_INNER (mode) and force it into a reg.

From-SVN: r233456

gcc/ChangeLog
gcc/optabs.c

index 7fd48ec3ab0e0015932ddec99c34554941f661d3..5eb87544b6809aefb7e8682436d03fe60c1a27a5 100644 (file)
@@ -1,3 +1,10 @@
+2016-02-16  Jakub Jelinek  <jakub@redhat.com>
+
+       PR rtl-optimization/69764
+       PR rtl-optimization/69771
+       * optabs.c (expand_binop): Ensure for shift optabs invalid CONST_INT
+       op1 is valid for GET_MODE_INNER (mode) and force it into a reg.
+
 2016-02-16  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/69776
index b651878b72503672781d9fa1a148adefa2379366..a6d8822b87edc4f6cfe404e9a9e1bba707926e7d 100644 (file)
@@ -1125,6 +1125,16 @@ expand_binop (machine_mode mode, optab binoptab, rtx op0, rtx op1,
       op1 = negate_rtx (mode, op1);
       binoptab = add_optab;
     }
+  /* For shifts, constant invalid op1 might be expanded from different
+     mode than MODE.  As those are invalid, force them to a register
+     to avoid further problems during expansion.  */
+  else if (CONST_INT_P (op1)
+          && shift_optab_p (binoptab)
+          && UINTVAL (op1) >= GET_MODE_BITSIZE (GET_MODE_INNER (mode)))
+    {
+      op1 = gen_int_mode (INTVAL (op1), GET_MODE_INNER (mode));
+      op1 = force_reg (GET_MODE_INNER (mode), op1);
+    }
 
   /* Record where to delete back to if we backtrack.  */
   last = get_last_insn ();