[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