[PATCH] vec-narrow-1.C/vec-narrow-minmax-2.C: Compile with -msse4 and require int128

"H.J. Lu" <[email protected]>
Newsgroups gmane.comp.gcc.patches
Message-ID <CAMe9rOrDau9c09GdZ5Ga7XxuNTt2dvzCFTsGpdxvNTLHJz55Cg@mail.gmail.com>
On Tue, Aug 18, 2026 at 4:18 PM Richard Biener <[email protected]> wrote:
>
> On Tue, 18 Aug 2026, Jakub Jelinek wrote:
>
> > Hi!
> >
> > I'm seeing various recent FAILs on ia32.
> > +FAIL: gcc.dg/tree-ssa/divmul-mod-1.c (test for excess errors)
> > +FAIL: gcc.dg/tree-ssa/round-up-ior-1.c (test for excess errors)
> > +FAIL: gcc.dg/tree-ssa/vec-mask-zero-1.c (test for excess errors)
> > +FAIL: gcc.dg/tree-ssa/vec-mask-zero-1.c scan-tree-dump-times optimized " != " 2
> > +FAIL: gcc.dg/tree-ssa/vec-mask-zero-1.c scan-tree-dump-times optimized " & " 2
> > +FAIL: gcc.dg/tree-ssa/vec-mask-zero-1.c scan-tree-dump-times optimized " == " 2
> > +FAIL: gcc.dg/tree-ssa/vec-mask-zero-1.c scan-tree-dump-times optimized " \\\\| " 2
> > +FAIL: gcc.dg/tree-ssa/vector-alignup-1.c (test for excess errors)
> > +FAIL: gcc.dg/tree-ssa/vector-alignup-1.c scan-tree-dump-times optimized " & " 2
> > +FAIL: gcc.dg/tree-ssa/vector-alignup-1.c scan-tree-dump-times optimized " \\\\+ " 2
> > +FAIL: g++.dg/tree-ssa/vec-narrow-1.C  -std=gnu++11  scan-tree-dump-not optimized "vector\\\\(2\\\\) long"
> > +FAIL: g++.dg/tree-ssa/vec-narrow-1.C  -std=gnu++14  scan-tree-dump-not optimized "vector\\\\(2\\\\) long"
> > +FAIL: g++.dg/tree-ssa/vec-narrow-1.C  -std=gnu++17  scan-tree-dump-not optimized "vector\\\\(2\\\\) long"
> > +FAIL: g++.dg/tree-ssa/vec-narrow-1.C  -std=gnu++20  scan-tree-dump-not optimized "vector\\\\(2\\\\) long"
> > +FAIL: g++.dg/tree-ssa/vec-narrow-1.C  -std=gnu++23  scan-tree-dump-not optimized "vector\\\\(2\\\\) long"
> > +FAIL: g++.dg/tree-ssa/vec-narrow-1.C  -std=gnu++26  scan-tree-dump-not optimized "vector\\\\(2\\\\) long"
> > +FAIL: g++.dg/tree-ssa/vec-narrow-1.C  -std=gnu++29  scan-tree-dump-not optimized "vector\\\\(2\\\\) long"
> > +FAIL: g++.dg/tree-ssa/vec-narrow-1.C  -std=gnu++98  scan-tree-dump-not optimized "vector\\\\(2\\\\) long"
> > +FAIL: g++.dg/tree-ssa/vec-narrow-minmax-2.C  -std=gnu++11  scan-tree-dump-times optimized "MIN_EXPR" 1
> > +FAIL: g++.dg/tree-ssa/vec-narrow-minmax-2.C  -std=gnu++11 (test for excess errors)
> > +FAIL: g++.dg/tree-ssa/vec-narrow-minmax-2.C  -std=gnu++14  scan-tree-dump-times optimized "MIN_EXPR" 1
> > +FAIL: g++.dg/tree-ssa/vec-narrow-minmax-2.C  -std=gnu++14 (test for excess errors)
> > +FAIL: g++.dg/tree-ssa/vec-narrow-minmax-2.C  -std=gnu++17  scan-tree-dump-times optimized "MIN_EXPR" 1
> > +FAIL: g++.dg/tree-ssa/vec-narrow-minmax-2.C  -std=gnu++17 (test for excess errors)
> > +FAIL: g++.dg/tree-ssa/vec-narrow-minmax-2.C  -std=gnu++20  scan-tree-dump-times optimized "MIN_EXPR" 1
> > +FAIL: g++.dg/tree-ssa/vec-narrow-minmax-2.C  -std=gnu++20 (test for excess errors)
> > +FAIL: g++.dg/tree-ssa/vec-narrow-minmax-2.C  -std=gnu++23  scan-tree-dump-times optimized "MIN_EXPR" 1
> > +FAIL: g++.dg/tree-ssa/vec-narrow-minmax-2.C  -std=gnu++23 (test for excess errors)
> > +FAIL: g++.dg/tree-ssa/vec-narrow-minmax-2.C  -std=gnu++26  scan-tree-dump-times optimized "MIN_EXPR" 1
> > +FAIL: g++.dg/tree-ssa/vec-narrow-minmax-2.C  -std=gnu++26 (test for excess errors)
> > +FAIL: g++.dg/tree-ssa/vec-narrow-minmax-2.C  -std=gnu++29  scan-tree-dump-times optimized "MIN_EXPR" 1
> > +FAIL: g++.dg/tree-ssa/vec-narrow-minmax-2.C  -std=gnu++29 (test for excess errors)
> > +FAIL: g++.dg/tree-ssa/vec-narrow-minmax-2.C  -std=gnu++98  scan-tree-dump-times optimized "MIN_EXPR" 1
> > +FAIL: g++.dg/tree-ssa/vec-narrow-minmax-2.C  -std=gnu++98 (test for excess errors)
> > The following patch fixes the gcc.dg ones and the excess errors in
> > vec-narrow-minmax-2.C.
> > vec-narrow-1.C still fails on ia32, dunno why (added at least -mmmx but it
> > didn't help, unlike x86_64 ia32 doesn't emulate MMX sized vectors in SSE2),
> > and the MIN_EXPR scans fail before/after on both x86_64 and ia32.
> >
> > Tested on x86_64-linux with
> > GXX_TESTSUITE_STDS=98,11,14,17,20,23,26,29 make check-gcc check-g++ RUNTESTFLAGS="--target_board=unix\{-m64,-m32,-m32/-mno-sse/-mno-mmx\} tree-ssa.exp='divmul-mod-1.c round-up-ior-1.c vec-mask-zero-1.c vector-alignup-1.c' dg.exp='vec-narrow-minmax-2.C vec-narrow-1.C'"
> > Ok for trunk?

I still got

FAIL: g++.dg/tree-ssa/vec-narrow-1.C  -std=gnu++20  scan-tree-dump-not
optimized "vector\\(2\\) long"
FAIL: g++.dg/tree-ssa/vec-narrow-1.C  -std=gnu++98  scan-tree-dump-not
optimized "vector\\(2\\) long"
FAIL: g++.dg/tree-ssa/vec-narrow-1.C  -std=gnu++29  scan-tree-dump-not
optimized "vector\\(2\\) long"
FAIL: g++.dg/tree-ssa/vec-narrow-minmax-2.C  -std=gnu++20
scan-tree-dump-times optimized "MIN_EXPR" 1
FAIL: g++.dg/tree-ssa/vec-narrow-minmax-2.C  -std=gnu++98
scan-tree-dump-times optimized "MIN_EXPR" 1
FAIL: g++.dg/tree-ssa/vec-narrow-minmax-2.C  -std=gnu++29
scan-tree-dump-times optimized "MIN_EXPR" 1

for -m32.

Here is the patch to fix them.

-- 
H.J.
---
128bit vector smaxmin and umaxmin are added to SSE4.  They don't require
AVX512VL nor AVX512DQ.  Also mmx.md has

(define_insn "<code><mode>3"
  [(set (match_operand:MMXMODE14 0 "register_operand" "=Yr,*x,Yv")
    (smaxmin:MMXMODE14
      (match_operand:MMXMODE14 1 "register_operand" "%0,0,Yv")
      (match_operand:MMXMODE14 2 "register_operand" "Yr,*x,Yv")))]
  "TARGET_SSE4_1 && TARGET_MMX_WITH_SSE"
  "@
   p<maxmin_int><mmxvecsize>\t{%2, %0|%0, %2}
   p<maxmin_int><mmxvecsize>\t{%2, %0|%0, %2}
   vp<maxmin_int><mmxvecsize>\t{%2, %1, %0|%0, %1, %2}"
  [(set_attr "isa" "noavx,noavx,avx")
   (set_attr "type" "sseiadd")
   (set_attr "prefix_extra" "1")
   (set_attr "prefix" "orig,orig,vex")
   (set_attr "mode" "TI")])

(define_insn "<code><mode>3"
  [(set (match_operand:MMXMODE24 0 "register_operand" "=Yr,*x,Yv")
    (umaxmin:MMXMODE24
      (match_operand:MMXMODE24 1 "register_operand" "%0,0,Yv")
      (match_operand:MMXMODE24 2 "register_operand" "Yr,*x,Yv")))]
  "TARGET_SSE4_1 && TARGET_MMX_WITH_SSE"
  "@
   p<maxmin_int><mmxvecsize>\t{%2, %0|%0, %2}
   p<maxmin_int><mmxvecsize>\t{%2, %0|%0, %2}
   vp<maxmin_int><mmxvecsize>\t{%2, %1, %0|%0, %1, %2}"
  [(set_attr "isa" "noavx,noavx,avx")
   (set_attr "type" "sseiadd")
   (set_attr "prefix_extra" "1")
   (set_attr "prefix" "orig,orig,vex")
   (set_attr "mode" "TI")])

These patterns require TARGET_MMX_WITH_SSE

 #define TARGET_MMX_WITH_SSE     (TARGET_64BIT && TARGET_SSE2)

64-bit vector smaxmin and umaxmin aren't available for ia32 even with
-mmmx.  Compile vec-narrow-1.C and vec-narrow-minmax-2.C with -msse4 and
require int128 for x86.

PR middle-end/126784
* g++.dg/tree-ssa/vec-narrow-1.C: Remove -Wno-psabi.  Add -msse4
and require int128 for x86.
* g++.dg/tree-ssa/vec-narrow-minmax-2.C: Likewise.
0001-vec-narrow-1.C-vec-narrow-minmax-2.C-Compile-with-ms.patch (text/x-patch, 3.7 KB)
From bc20a4a6064d7ddb00926888b47ed7a05663fc06 Mon Sep 17 00:00:00 2001
From: "H.J. Lu" <[email protected]>
Date: Tue, 11 Aug 2026 12:39:54 +0800
Subject: [PATCH] vec-narrow-1.C/vec-narrow-minmax-2.C: Compile with -msse4 and
 require int128

128bit vector smaxmin and umaxmin are added to SSE4.  They don't require
AVX512VL nor AVX512DQ.  Also mmx.md has

(define_insn "<code><mode>3"
  [(set (match_operand:MMXMODE14 0 "register_operand" "=Yr,*x,Yv")
    (smaxmin:MMXMODE14
      (match_operand:MMXMODE14 1 "register_operand" "%0,0,Yv")
      (match_operand:MMXMODE14 2 "register_operand" "Yr,*x,Yv")))]
  "TARGET_SSE4_1 && TARGET_MMX_WITH_SSE"
  "@
   p<maxmin_int><mmxvecsize>\t{%2, %0|%0, %2}
   p<maxmin_int><mmxvecsize>\t{%2, %0|%0, %2}
   vp<maxmin_int><mmxvecsize>\t{%2, %1, %0|%0, %1, %2}"
  [(set_attr "isa" "noavx,noavx,avx")
   (set_attr "type" "sseiadd")
   (set_attr "prefix_extra" "1")
   (set_attr "prefix" "orig,orig,vex")
   (set_attr "mode" "TI")])

(define_insn "<code><mode>3"
  [(set (match_operand:MMXMODE24 0 "register_operand" "=Yr,*x,Yv")
    (umaxmin:MMXMODE24
      (match_operand:MMXMODE24 1 "register_operand" "%0,0,Yv")
      (match_operand:MMXMODE24 2 "register_operand" "Yr,*x,Yv")))]
  "TARGET_SSE4_1 && TARGET_MMX_WITH_SSE"
  "@
   p<maxmin_int><mmxvecsize>\t{%2, %0|%0, %2}
   p<maxmin_int><mmxvecsize>\t{%2, %0|%0, %2}
   vp<maxmin_int><mmxvecsize>\t{%2, %1, %0|%0, %1, %2}"
  [(set_attr "isa" "noavx,noavx,avx")
   (set_attr "type" "sseiadd")
   (set_attr "prefix_extra" "1")
   (set_attr "prefix" "orig,orig,vex")
   (set_attr "mode" "TI")])

These patterns require TARGET_MMX_WITH_SSE

 #define TARGET_MMX_WITH_SSE     (TARGET_64BIT && TARGET_SSE2)

64-bit vector smaxmin and umaxmin aren't available for ia32 even with
-mmmx.  Compile vec-narrow-1.C and vec-narrow-minmax-2.C with -msse4 and
require int128 for x86.

	PR middle-end/126784
	* g++.dg/tree-ssa/vec-narrow-1.C: Remove -Wno-psabi.  Add -msse4
	and require int128 for x86.
	* g++.dg/tree-ssa/vec-narrow-minmax-2.C: Likewise.

Signed-off-by: H.J. Lu <[email protected]>
---
 gcc/testsuite/g++.dg/tree-ssa/vec-narrow-1.C        | 6 +++---
 gcc/testsuite/g++.dg/tree-ssa/vec-narrow-minmax-2.C | 4 +++-
 2 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/gcc/testsuite/g++.dg/tree-ssa/vec-narrow-1.C b/gcc/testsuite/g++.dg/tree-ssa/vec-narrow-1.C
index 7af11187501..1f863b1d4a2 100644
--- a/gcc/testsuite/g++.dg/tree-ssa/vec-narrow-1.C
+++ b/gcc/testsuite/g++.dg/tree-ssa/vec-narrow-1.C
@@ -1,7 +1,7 @@
 // { dg-do compile }
-// { dg-options "-O2 -fdump-tree-optimized -Wno-psabi" }
-// { dg-additional-options "-mavx512vl -mavx512dq" { target { i?86-*-* x86_64-*-* } } }
-// { dg-additional-options "-mmmx" { target ia32 } }
+// { dg-options "-O2 -fdump-tree-optimized" }
+// { dg-additional-options "-msse4" { target { i?86-*-* x86_64-*-* } } }
+// { dg-require-effective-target int128 { target { i?86-*-* x86_64-*-* } } }
 // Extension is monotone, so it commutes with the comparison and the outer
 // truncation is exact.  The argument is lanewise, so a widened vector
 // MIN/MAX feeding a truncating conversion narrows.
diff --git a/gcc/testsuite/g++.dg/tree-ssa/vec-narrow-minmax-2.C b/gcc/testsuite/g++.dg/tree-ssa/vec-narrow-minmax-2.C
index 74177f7864e..7df25de0942 100644
--- a/gcc/testsuite/g++.dg/tree-ssa/vec-narrow-minmax-2.C
+++ b/gcc/testsuite/g++.dg/tree-ssa/vec-narrow-minmax-2.C
@@ -1,5 +1,7 @@
 // { dg-do compile }
-// { dg-options "-O2 -fdump-tree-optimized -Wno-psabi" }
+// { dg-options "-O2 -fdump-tree-optimized" }
+// { dg-additional-options "-msse4" { target { i?86-*-* x86_64-*-* } } }
+// { dg-require-effective-target int128 { target { i?86-*-* x86_64-*-* } } }
 
 typedef int v2si __attribute__((vector_size (8)));
 typedef long long v2di __attribute__((vector_size (16)));
-- 
2.55.0
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.