mirror of
https://gcc.gnu.org/git/gcc.git
synced 2024-11-27 22:03:57 +08:00
tree-optimization/112623 - forwprop VEC_PACK_TRUNC generation
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.
This commit is contained in:
parent
ae156936cf
commit
aef1aaff41
11
gcc/testsuite/gcc.target/i386/pr112623.c
Normal file
11
gcc/testsuite/gcc.target/i386/pr112623.c
Normal file
@ -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);
|
||||
}
|
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user