re PR rtl-optimization/78132 (GCC produces invalid instruction (kmovd and kmovq)...
authorJakub Jelinek <jakub@redhat.com>
Fri, 28 Oct 2016 07:12:52 +0000 (09:12 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 28 Oct 2016 07:12:52 +0000 (09:12 +0200)
PR rtl-optimization/78132
* ree.c (combine_reaching_defs): Give up if copy_needed and
!HARD_REGNO_MODE_OK (REGNO (src_reg), dst_mode).

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

From-SVN: r241641

gcc/ChangeLog
gcc/ree.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr78132.c [new file with mode: 0644]

index 254d26243614b5b2a58e95af3b2be1cbcb35ceb2..88805bd25c91e74a968d75f8704b2cde86909a19 100644 (file)
@@ -1,3 +1,9 @@
+2016-10-28  Jakub Jelinek  <jakub@redhat.com>
+
+       PR rtl-optimization/78132
+       * ree.c (combine_reaching_defs): Give up if copy_needed and
+       !HARD_REGNO_MODE_OK (REGNO (src_reg), dst_mode).
+
 2016-10-27  Eric Botcazou  <ebotcazou@adacore.com>
 
        * config/sparc/sparc.md (<*vlop:code><VL:mode>3): Remove leading '*'.
index 374988e792e27fc342518e8e98af618bc595dbce..6bac17ef7fd0b18ff0f342671c603fb85ad8cdb1 100644 (file)
--- a/gcc/ree.c
+++ b/gcc/ree.c
@@ -788,6 +788,11 @@ combine_reaching_defs (ext_cand *cand, const_rtx set_pat, ext_state *state)
       machine_mode dst_mode = GET_MODE (SET_DEST (PATTERN (cand->insn)));
       rtx src_reg = get_extended_src_reg (SET_SRC (PATTERN (cand->insn)));
 
+      /* Ensure we can use the src_reg in dst_mode (needed for
+        the (set (reg1) (reg2)) insn mentioned above).  */
+      if (!HARD_REGNO_MODE_OK (REGNO (src_reg), dst_mode))
+       return false;
+
       /* Ensure the number of hard registers of the copy match.  */
       if (HARD_REGNO_NREGS (REGNO (src_reg), dst_mode)
          != HARD_REGNO_NREGS (REGNO (src_reg), GET_MODE (src_reg)))
index e3c8b63ea0ac467f4c810ed8e0fc02c36fe8d3d4..08cc8bda7cb549cf72efae0b646e47fec62eb4db 100644 (file)
@@ -1,3 +1,8 @@
+2016-10-28  Jakub Jelinek  <jakub@redhat.com>
+
+       PR rtl-optimization/78132
+       * gcc.target/i386/pr78132.c: New test.
+
 2016-10-27  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gcc.dg/vect/pr71264.c: XFAIL on SPARC.
diff --git a/gcc/testsuite/gcc.target/i386/pr78132.c b/gcc/testsuite/gcc.target/i386/pr78132.c
new file mode 100644 (file)
index 0000000..e5a0e23
--- /dev/null
@@ -0,0 +1,20 @@
+/* PR rtl-optimization/78132 */
+/* { dg-do compile } */
+/* { dg-options "-O3 -mavx512f -mno-avx512bw -mno-avx512dq -masm=att" } */
+/* { dg-final { scan-assembler-not "kmov\[dq]\t" } } */
+
+unsigned short c;
+char a, d, f, b;
+short e;
+long g;
+
+int
+main ()
+{
+  g = c;
+  f = c & e;
+  d = c & a | e;
+  if (a)
+    b = c;
+  return 0;
+}