diff options
Diffstat (limited to 'gcc/tree-vect-generic.c')
-rw-r--r-- | gcc/tree-vect-generic.c | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/gcc/tree-vect-generic.c b/gcc/tree-vect-generic.c index e9f5505..4a53fc4 100644 --- a/gcc/tree-vect-generic.c +++ b/gcc/tree-vect-generic.c @@ -1367,6 +1367,32 @@ lower_vec_perm (gimple_stmt_iterator *gsi) return; } } + /* And similarly vec_shl pattern. */ + if (optab_handler (vec_shl_optab, TYPE_MODE (vect_type)) + != CODE_FOR_nothing + && TREE_CODE (vec0) == VECTOR_CST + && initializer_zerop (vec0)) + { + unsigned int first = 0; + for (i = 0; i < elements; ++i) + if (known_eq (poly_uint64 (indices[i]), elements)) + { + if (i == 0 || first) + break; + first = i; + } + else if (first + ? maybe_ne (poly_uint64 (indices[i]), + elements + i - first) + : maybe_ge (poly_uint64 (indices[i]), elements)) + break; + if (i == elements) + { + gimple_assign_set_rhs3 (stmt, mask); + update_stmt (stmt); + return; + } + } } else if (can_vec_perm_var_p (TYPE_MODE (vect_type))) return; |