re PR target/81225 (ICE with -mavx512ifma -O3 -ffloat-store)
authorJakub Jelinek <jakub@redhat.com>
Fri, 30 Jun 2017 14:52:24 +0000 (16:52 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 30 Jun 2017 14:52:24 +0000 (16:52 +0200)
PR target/81225
* config/i386/sse.md (vec_extract_lo_<mode><mask_name>): For
V8FI, V16FI and VI8F_256 iterators, use <store_mask_predicate> instead
of nonimmediate_operand and <store_mask_constraint> instead of m for
the input operand.  For V8FI iterator, always split if input is a MEM.
For V16FI and V8SF_256 iterators, don't test if both operands are MEM
if <mask_applied>.  For VI4F_256 iterator, use <store_mask_predicate>
instead of register_operand and <store_mask_constraint> instead of v for
        the input operand.  Make sure both operands aren't MEMs for if not
<mask_applied>.

* gcc.target/i386/pr81225.c: New test.

From-SVN: r249844

gcc/ChangeLog
gcc/config/i386/sse.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr81225.c [new file with mode: 0644]

index 84a939922925b841c5f1107dff21876f3bba165e..be0b4bc98de5bbb7ca47ee14ae20fc10f314c87f 100644 (file)
@@ -1,3 +1,16 @@
+2017-06-30  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/81225
+       * config/i386/sse.md (vec_extract_lo_<mode><mask_name>): For
+       V8FI, V16FI and VI8F_256 iterators, use <store_mask_predicate> instead
+       of nonimmediate_operand and <store_mask_constraint> instead of m for
+       the input operand.  For V8FI iterator, always split if input is a MEM.
+       For V16FI and V8SF_256 iterators, don't test if both operands are MEM
+       if <mask_applied>.  For VI4F_256 iterator, use <store_mask_predicate>
+       instead of register_operand and <store_mask_constraint> instead of v for
+        the input operand.  Make sure both operands aren't MEMs for if not
+       <mask_applied>.
+
 2017-06-30  Sylvestre Ledru  <sylvestre@debian.org>
 
        * lto-wrapper.c (copy_file) Close both file descriptors before
index f61ae2bb927699e2da7831e187d7d56a5752c858..5cf6c928bfb89593b5b5988aeb29c2ebdc49ea0f 100644 (file)
 (define_insn "vec_extract_lo_<mode><mask_name>"
   [(set (match_operand:<ssehalfvecmode> 0 "<store_mask_predicate>" "=<store_mask_constraint>,v")
        (vec_select:<ssehalfvecmode>
-         (match_operand:V8FI 1 "nonimmediate_operand" "v,m")
+         (match_operand:V8FI 1 "<store_mask_predicate>" "v,<store_mask_constraint>")
          (parallel [(const_int 0) (const_int 1)
             (const_int 2) (const_int 3)])))]
   "TARGET_AVX512F
    && (<mask_applied> || !(MEM_P (operands[0]) && MEM_P (operands[1])))"
 {
-  if (<mask_applied> || !TARGET_AVX512VL)
+  if (<mask_applied> || (!TARGET_AVX512VL && !MEM_P (operands[1])))
     return "vextract<shuffletype>64x4\t{$0x0, %1, %0<mask_operand2>|%0<mask_operand2>, %1, 0x0}";
   else
     return "#";
 (define_insn "vec_extract_lo_<mode><mask_name>"
   [(set (match_operand:<ssehalfvecmode> 0 "nonimmediate_operand" "=v,m")
        (vec_select:<ssehalfvecmode>
-         (match_operand:V16FI 1 "nonimmediate_operand" "vm,v")
+         (match_operand:V16FI 1 "<store_mask_predicate>"
+                                "<store_mask_constraint>,v")
          (parallel [(const_int 0) (const_int 1)
                      (const_int 2) (const_int 3)
                      (const_int 4) (const_int 5)
                      (const_int 6) (const_int 7)])))]
   "TARGET_AVX512F
    && <mask_mode512bit_condition>
-   && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
+   && (<mask_applied> || !(MEM_P (operands[0]) && MEM_P (operands[1])))"
 {
   if (<mask_applied>)
     return "vextract<shuffletype>32x8\t{$0x0, %1, %0<mask_operand2>|%0<mask_operand2>, %1, 0x0}";
 (define_insn "vec_extract_lo_<mode><mask_name>"
   [(set (match_operand:<ssehalfvecmode> 0 "<store_mask_predicate>" "=v,m")
        (vec_select:<ssehalfvecmode>
-         (match_operand:VI8F_256 1 "nonimmediate_operand" "vm,v")
+         (match_operand:VI8F_256 1 "<store_mask_predicate>"
+                                   "<store_mask_constraint>,v")
          (parallel [(const_int 0) (const_int 1)])))]
   "TARGET_AVX
    && <mask_avx512vl_condition> && <mask_avx512dq_condition>
-   && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
+   && (<mask_applied> || !(MEM_P (operands[0]) && MEM_P (operands[1])))"
 {
   if (<mask_applied>)
     return "vextract<shuffletype>64x2\t{$0x0, %1, %0%{%3%}|%0%{%3%}, %1, 0x0}";
   "operands[1] = gen_lowpart (<ssehalfvecmode>mode, operands[1]);")
 
 (define_insn "vec_extract_lo_<mode><mask_name>"
-  [(set (match_operand:<ssehalfvecmode> 0 "<store_mask_predicate>" "=<store_mask_constraint>")
+  [(set (match_operand:<ssehalfvecmode> 0 "<store_mask_predicate>"
+                                         "=<store_mask_constraint>,v")
        (vec_select:<ssehalfvecmode>
-         (match_operand:VI4F_256 1 "register_operand" "v")
+         (match_operand:VI4F_256 1 "<store_mask_predicate>"
+                                   "v,<store_mask_constraint>")
          (parallel [(const_int 0) (const_int 1)
                     (const_int 2) (const_int 3)])))]
-  "TARGET_AVX && <mask_avx512vl_condition> && <mask_avx512dq_condition>"
+  "TARGET_AVX
+   && <mask_avx512vl_condition> && <mask_avx512dq_condition>
+   && (<mask_applied> || !(MEM_P (operands[0]) && MEM_P (operands[1])))"
 {
   if (<mask_applied>)
     return "vextract<shuffletype>32x4\t{$0x0, %1, %0<mask_operand2>|%0<mask_operand2>, %1, 0x0}";
index 2637ecc6262eba162f97cf9d00a4beee12cd2828..f42ea73f704449461725249b239d47a25ab8bb17 100644 (file)
@@ -1,3 +1,8 @@
+2017-06-30  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/81225
+       * gcc.target/i386/pr81225.c: New test.
+
 2017-06-30  Nathan Sidwell  <nathan@acm.org>
 
        * g++.dg/concepts/memfun-err.C: Adjust diagnostics.
diff --git a/gcc/testsuite/gcc.target/i386/pr81225.c b/gcc/testsuite/gcc.target/i386/pr81225.c
new file mode 100644 (file)
index 0000000..db95e94
--- /dev/null
@@ -0,0 +1,14 @@
+/* PR target/81225 */
+/* { dg-do compile } */
+/* { dg-options "-mavx512ifma -O3 -ffloat-store" } */
+
+long a[24];
+float b[4], c[24];
+int d;
+
+void
+foo ()
+{
+  for (d = 0; d < 24; d++)
+    c[d] = (float) d ? : b[a[d]];
+}