On Tue, Feb 02, 2021 at 02:23:55PM +0100, Richard Biener wrote:
> Btw, I just can find V1DI mentioned in mmx.md but I can't find
> rotate or shift patterns that would match?

The backend has several V1?Imode shifts, but optab only for those V1DImode
ones:

grep '[la]sh[lr]v1[qhsdtox]' tmp-mddump.md 
(define_insn ("mmx_ashlv1di3")
(define_insn ("mmx_lshrv1di3")
(define_insn ("avx512bw_ashlv1ti3")
(define_insn ("avx512bw_lshrv1ti3")
(define_insn ("sse2_ashlv1ti3")
(define_insn ("sse2_lshrv1ti3")
(define_expand ("ashlv1di3")
(define_expand ("lshrv1di3")
  emit_insn (gen_sse2_lshrv1ti3 (tmp, gen_lowpart (V1TImode, operands[1]),

I think it has been introduced with
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89021#c13

Before we didn't have any V1DImode expanders (except mov/movmisalign, but
those are needed and are supplied for other V1??mode modes too).

So I'll test:

2021-02-02  Jakub Jelinek  <ja...@redhat.com>

        PR tree-optimization/98287
        * config/i386/mmx.md (<insn><mode>3): For shifts don't enable expander
        for V1DImode.

        * gcc.dg/pr98287.c: New test.

--- gcc/config/i386/mmx.md.jj   2021-01-07 15:29:52.601974578 +0100
+++ gcc/config/i386/mmx.md      2021-02-02 14:48:52.310935516 +0100
@@ -1528,9 +1528,9 @@ (define_insn "mmx_<insn><mode>3"
    (set_attr "mode" "DI,TI,TI")])
 
 (define_expand "<insn><mode>3"
-  [(set (match_operand:MMXMODE248 0 "register_operand")
-        (any_lshift:MMXMODE248
-         (match_operand:MMXMODE248 1 "register_operand")
+  [(set (match_operand:MMXMODE24 0 "register_operand")
+        (any_lshift:MMXMODE24
+         (match_operand:MMXMODE24 1 "register_operand")
          (match_operand:DI 2 "nonmemory_operand")))]
   "TARGET_MMX_WITH_SSE")
 
--- gcc/testsuite/gcc.dg/pr98287.c.jj   2021-02-02 14:50:05.583107569 +0100
+++ gcc/testsuite/gcc.dg/pr98287.c      2021-02-02 14:50:05.583107569 +0100
@@ -0,0 +1,19 @@
+/* PR tree-optimization/98287 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fno-tree-ccp -fno-tree-forwprop -Wno-psabi -w" } */
+
+typedef unsigned long __attribute__((__vector_size__ (8))) V;
+V v;
+
+static __attribute__((noinline, noclone)) V
+bar (unsigned short s)
+{
+  return v >> s << s | v >> s >> 63;
+}
+
+unsigned long
+foo (void)
+{
+  V x = bar (1);
+  return x[0];
+}


        Jakub

Reply via email to