Hi! The following testcase ICEs, because execute_update_addresses_taken attempts to create a VECTOR_TYPE with non-power of 2 number of elts. Fixed by guarding it with the corresponding predicate.
Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? 2020-02-17 Jakub Jelinek <ja...@redhat.com> PR tree-optimization/93780 * tree-ssa.c (non_rewritable_lvalue_p): Check valid_vector_subparts_p before calling build_vector_type. (execute_update_addresses_taken): Likewise. * gcc.dg/pr93780.c: New test. --- gcc/tree-ssa.c.jj 2020-01-12 11:54:38.515381696 +0100 +++ gcc/tree-ssa.c 2020-02-17 10:54:32.481615050 +0100 @@ -1550,7 +1550,8 @@ non_rewritable_lvalue_p (tree lhs) && multiple_p (lhs_bits, tree_to_uhwi (TYPE_SIZE (TREE_TYPE (TREE_TYPE (decl)))), - &nelts)) + &nelts) + && valid_vector_subparts_p (nelts)) { if (known_eq (nelts, 1u)) return false; @@ -1925,7 +1926,8 @@ execute_update_addresses_taken (void) (TYPE_SIZE (TREE_TYPE (TREE_TYPE (sym)))), &nelts) - && maybe_ne (nelts, 1u)) + && maybe_ne (nelts, 1u) + && valid_vector_subparts_p (nelts)) temtype = build_vector_type (temtype, nelts); tree tem = make_ssa_name (temtype); gimple *pun --- gcc/testsuite/gcc.dg/pr93780.c.jj 2020-02-17 10:44:31.839583128 +0100 +++ gcc/testsuite/gcc.dg/pr93780.c 2020-02-17 10:44:16.453812697 +0100 @@ -0,0 +1,15 @@ +/* PR tree-optimization/93780 */ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ +/* { dg-additional-options "-mavx" { target avx } } */ + +typedef float V __attribute__((vector_size (32))); + +float +foo (void) +{ + const float init[6] = {}; + V v = {}; + __builtin_memcpy (&v, init, sizeof (init)); + return v[0]; +} Jakub