]> gcc.gnu.org Git - gcc.git/commitdiff
tree-optimization/112623 - forwprop VEC_PACK_TRUNC generation
authorRichard Biener <rguenther@suse.de>
Tue, 21 Nov 2023 13:46:31 +0000 (14:46 +0100)
committerRichard Biener <rguenther@suse.de>
Tue, 21 Nov 2023 14:44:11 +0000 (15:44 +0100)
For vec_pack_trunc patterns there can be an ambiguity for the
source mode for BFmode vs HFmode.  The vectorizer checks
the insns operand mode for this, the following makes forwprop
do the same.  That of course doesn't help if the target supports
both conversions.

PR tree-optimization/112623
* tree-ssa-forwprop.cc (simplify_vector_constructor):
Check the source mode of the insn for vector pack/unpacks.

* gcc.target/i386/pr112623.c: New testcase.

gcc/testsuite/gcc.target/i386/pr112623.c [new file with mode: 0644]
gcc/tree-ssa-forwprop.cc

diff --git a/gcc/testsuite/gcc.target/i386/pr112623.c b/gcc/testsuite/gcc.target/i386/pr112623.c
new file mode 100644 (file)
index 0000000..c4ebace
--- /dev/null
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options "-O -mavx512vl -mavx512fp16" } */
+
+typedef __bf16 __attribute__((__vector_size__ (16))) BF;
+typedef float __attribute__((__vector_size__ (32))) F;
+
+BF
+foo (F f)
+{
+  return __builtin_convertvector (f, BF);
+}
index d39dfc1065f28a5e0ba45172d67f84830b91779b..0fb21e58138295829f64781ae2e36567857309e3 100644 (file)
@@ -47,6 +47,8 @@ along with GCC; see the file COPYING3.  If not see
 #include "tree-cfgcleanup.h"
 #include "cfganal.h"
 #include "optabs-tree.h"
+#include "insn-config.h"
+#include "recog.h"
 #include "tree-vector-builder.h"
 #include "vec-perm-indices.h"
 #include "internal-fn.h"
@@ -2978,6 +2980,7 @@ simplify_vector_constructor (gimple_stmt_iterator *gsi)
          /* Only few targets implement direct conversion patterns so try
             some simple special cases via VEC_[UN]PACK[_FLOAT]_LO_EXPR.  */
          optab optab;
+         insn_code icode;
          tree halfvectype, dblvectype;
          enum tree_code unpack_op;
 
@@ -3015,8 +3018,9 @@ simplify_vector_constructor (gimple_stmt_iterator *gsi)
              && (optab = optab_for_tree_code (unpack_op,
                                               dblvectype,
                                               optab_default))
-             && (optab_handler (optab, TYPE_MODE (dblvectype))
-                 != CODE_FOR_nothing))
+             && ((icode = optab_handler (optab, TYPE_MODE (dblvectype)))
+                 != CODE_FOR_nothing)
+             && (insn_data[icode].operand[0].mode == TYPE_MODE (type)))
            {
              gimple_seq stmts = NULL;
              tree dbl;
@@ -3054,8 +3058,9 @@ simplify_vector_constructor (gimple_stmt_iterator *gsi)
                   && (optab = optab_for_tree_code (VEC_PACK_TRUNC_EXPR,
                                                    halfvectype,
                                                    optab_default))
-                  && (optab_handler (optab, TYPE_MODE (halfvectype))
-                      != CODE_FOR_nothing))
+                  && ((icode = optab_handler (optab, TYPE_MODE (halfvectype)))
+                      != CODE_FOR_nothing)
+                  && (insn_data[icode].operand[0].mode == TYPE_MODE (type)))
            {
              gimple_seq stmts = NULL;
              tree low = gimple_build (&stmts, BIT_FIELD_REF, halfvectype,
This page took 0.095497 seconds and 5 git commands to generate.