Hello!

This ICE was caused by a peephole2 pattern that allowed non-general
regs arguments.

2015-07-08  Uros Bizjak  <ubiz...@gmail.com>

    PR target/66814
    * config/i386/predicates.md (nonimmediate_gr_operand): New predicate.
    * config/i386/i386.md (not peephole2): Use nonimmediate_gr_operand.
    (varous peephole2s): Use {GENERAL,SSE,MMX}_REGNO_P instead of
    {GENERAL_SSE_MMX}_REG_P where appropriate.

testsuite/ChangeLog:

2015-07-09  Uros Bizjak  <ubiz...@gmail.com>

    PR target/66814
    * gcc.target/i386/pr66814.c: New test.

Bootstrapped and regression tested on x86_64-linux-gnu {,-m32}.

Committed to mainline SVN, will be backported to gcc-5, when the branch opens.

Uros.
Index: testsuite/gcc.target/i386/pr66814.c
===================================================================
--- testsuite/gcc.target/i386/pr66814.c (revision 0)
+++ testsuite/gcc.target/i386/pr66814.c (revision 0)
@@ -0,0 +1,4 @@
+/* { dg-do compile { target { ia32 } } } */
+/* { dg-options "-march=i586 -mavx512f -O2" } */
+
+#include "avx512f-klogic-2.c"
Index: config/i386/i386.md
===================================================================
--- config/i386/i386.md (revision 225599)
+++ config/i386/i386.md (working copy)
@@ -17379,8 +17379,8 @@
 ;; lifetime information then.
 
 (define_peephole2
-  [(set (match_operand:SWI124 0 "nonimmediate_operand")
-       (not:SWI124 (match_operand:SWI124 1 "nonimmediate_operand")))]
+  [(set (match_operand:SWI124 0 "nonimmediate_gr_operand")
+       (not:SWI124 (match_operand:SWI124 1 "nonimmediate_gr_operand")))]
   "optimize_insn_for_speed_p ()
    && ((TARGET_NOT_UNPAIRABLE
        && (!MEM_P (operands[0])
@@ -17524,8 +17524,10 @@
                      [(match_dup 0)
                       (match_operand 2 "memory_operand")]))]
   "REGNO (operands[0]) != REGNO (operands[1])
-   && ((MMX_REG_P (operands[0]) && MMX_REG_P (operands[1])) 
-       || (SSE_REG_P (operands[0]) && SSE_REG_P (operands[1])))"
+   && ((MMX_REGNO_P (REGNO (operands[0]))
+        && MMX_REGNO_P (REGNO (operands[1]))) 
+       || (SSE_REGNO_P (REGNO (operands[0]))
+           && SSE_REGNO_P (REGNO (operands[1]))))"
   [(set (match_dup 0) (match_dup 2))
    (set (match_dup 0)
         (match_op_dup 3 [(match_dup 0) (match_dup 1)]))])
@@ -17673,7 +17675,7 @@
        (match_operand 1 "const0_operand"))]
   "GET_MODE_SIZE (GET_MODE (operands[0])) <= UNITS_PER_WORD
    && (! TARGET_USE_MOV0 || optimize_insn_for_size_p ())
-   && GENERAL_REG_P (operands[0])
+   && GENERAL_REGNO_P (REGNO (operands[0]))
    && peep2_regno_dead_p (0, FLAGS_REG)"
   [(parallel [(set (match_dup 0) (const_int 0))
              (clobber (reg:CC FLAGS_REG))])]
@@ -17694,6 +17696,7 @@
   [(set (match_operand:SWI248 0 "register_operand")
        (const_int -1))]
   "(optimize_insn_for_size_p () || TARGET_MOVE_M1_VIA_OR)
+   && GENERAL_REGNO_P (REGNO (operands[0]))
    && peep2_regno_dead_p (0, FLAGS_REG)"
   [(parallel [(set (match_dup 0) (const_int -1))
              (clobber (reg:CC FLAGS_REG))])]
Index: config/i386/predicates.md
===================================================================
--- config/i386/predicates.md   (revision 225599)
+++ config/i386/predicates.md   (working copy)
@@ -37,6 +37,12 @@
   (and (match_code "reg")
        (match_test "GENERAL_REGNO_P (REGNO (op))")))
 
+;; True if the operand is a nonimmediate operand with GENERAL class register.
+(define_predicate "nonimmediate_gr_operand"
+  (if_then_else (match_code "reg")
+    (match_test "GENERAL_REGNO_P (REGNO (op))")
+    (match_operand 0 "nonimmediate_operand")))
+
 ;; Return true if OP is a register operand other than an i387 fp register.
 (define_predicate "register_and_not_fp_reg_operand"
   (and (match_code "reg")

Reply via email to