]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Explicitly view_convert_expr mask to signed type when folding pblendvb builtins.
authorliuhongt <hongtao.liu@intel.com>
Mon, 5 Jun 2023 04:38:41 +0000 (12:38 +0800)
committerliuhongt <hongtao.liu@intel.com>
Fri, 9 Jun 2023 01:41:47 +0000 (09:41 +0800)
Since mask < 0 will be always false for vector char when
-funsigned-char, but vpblendvb needs to check the most significant
bit. The patch explicitly VCE to vector signed char.

gcc/ChangeLog:

PR target/110108
* config/i386/i386.cc (ix86_gimple_fold_builtin): Explicitly
view_convert_expr mask to signed type when folding pblendvb
builtins.

gcc/testsuite/ChangeLog:

* gcc.target/i386/pr110108-2.c: New test.

gcc/config/i386/i386.cc
gcc/testsuite/gcc.target/i386/pr110108-2.c [new file with mode: 0644]

index 660fe15cce1952977641a6a3c1aa276aa486abed..3a1444db882c1d9e48488db3f7b4f621da06eea3 100644 (file)
@@ -18572,8 +18572,10 @@ ix86_gimple_fold_builtin (gimple_stmt_iterator *gsi)
              tree itype = GET_MODE_INNER (TYPE_MODE (type)) == E_SFmode
                ? intSI_type_node : intDI_type_node;
              type = get_same_sized_vectype (itype, type);
-             arg2 = gimple_build (&stmts, VIEW_CONVERT_EXPR, type, arg2);
            }
+         else
+           type = signed_type_for (type);
+         arg2 = gimple_build (&stmts, VIEW_CONVERT_EXPR, type, arg2);
          tree zero_vec = build_zero_cst (type);
          tree cmp_type = truth_type_for (type);
          tree cmp = gimple_build (&stmts, LT_EXPR, cmp_type, arg2, zero_vec);
diff --git a/gcc/testsuite/gcc.target/i386/pr110108-2.c b/gcc/testsuite/gcc.target/i386/pr110108-2.c
new file mode 100644 (file)
index 0000000..2d1d2fd
--- /dev/null
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx2 -O2 -funsigned-char" } */
+/* { dg-final { scan-assembler-times "vpblendvb" 2 } } */
+
+#include <immintrin.h>
+__m128i do_stuff_128(__m128i X0, __m128i X1, __m128i X2) {
+  __m128i Result = _mm_blendv_epi8(X0, X1, X2);
+  return Result;
+}
+
+__m256i do_stuff_256(__m256i X0, __m256i X1, __m256i X2) {
+  __m256i Result = _mm256_blendv_epi8(X0, X1, X2);
+  return Result;
+}