aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-vect-patterns.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2016-03-23 10:52:00 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2016-03-23 10:52:00 +0100
commit0179520a83329a8daefcbb87c2609035694b928a (patch)
tree81cdf9580ade688ff98c3006438d128e3cc6f686 /gcc/tree-vect-patterns.c
parent7da7269a693f7bb2c3728002dd88b51e3ffa2f8b (diff)
downloadgcc-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.c15
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)