diff options
author | Jakub Jelinek <jakub@redhat.com> | 2016-03-23 10:52:00 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2016-03-23 10:52:00 +0100 |
commit | 0179520a83329a8daefcbb87c2609035694b928a (patch) | |
tree | 81cdf9580ade688ff98c3006438d128e3cc6f686 /gcc/tree-vect-patterns.c | |
parent | 7da7269a693f7bb2c3728002dd88b51e3ffa2f8b (diff) | |
download | gcc-0179520a83329a8daefcbb87c2609035694b928a.zip gcc-0179520a83329a8daefcbb87c2609035694b928a.tar.gz gcc-0179520a83329a8daefcbb87c2609035694b928a.tar.bz2 |
re PR tree-optimization/70354 (Wrong code with -O3 -march=broadwell and -march=skylake-avx512.)
PR tree-optimization/70354
* tree-vect-patterns.c (vect_recog_vector_vector_shift_pattern): If
oprnd0 is wider than oprnd1 and there is a cast from the wider
type to oprnd1, mask it with the mask of the narrower type.
* gcc.dg/vect/pr70354-1.c: New test.
* gcc.dg/vect/pr70354-2.c: New test.
* gcc.target/i386/avx2-pr70354-1.c: New test.
* gcc.target/i386/avx2-pr70354-2.c: New test.
From-SVN: r234417
Diffstat (limited to 'gcc/tree-vect-patterns.c')
-rw-r--r-- | gcc/tree-vect-patterns.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/gcc/tree-vect-patterns.c b/gcc/tree-vect-patterns.c index 0ee5bbe..27080d2 100644 --- a/gcc/tree-vect-patterns.c +++ b/gcc/tree-vect-patterns.c @@ -2097,7 +2097,20 @@ vect_recog_vector_vector_shift_pattern (vec<gimple *> *stmts, if (TYPE_MODE (TREE_TYPE (rhs1)) == TYPE_MODE (TREE_TYPE (oprnd0)) && TYPE_PRECISION (TREE_TYPE (rhs1)) == TYPE_PRECISION (TREE_TYPE (oprnd0))) - def = rhs1; + { + if (TYPE_PRECISION (TREE_TYPE (oprnd1)) + >= TYPE_PRECISION (TREE_TYPE (rhs1))) + def = rhs1; + else + { + tree mask + = build_low_bits_mask (TREE_TYPE (rhs1), + TYPE_PRECISION (TREE_TYPE (oprnd1))); + def = vect_recog_temp_ssa_var (TREE_TYPE (rhs1), NULL); + def_stmt = gimple_build_assign (def, BIT_AND_EXPR, rhs1, mask); + new_pattern_def_seq (stmt_vinfo, def_stmt); + } + } } if (def == NULL_TREE) |