https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63666
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |glisse at gcc dot gnu.org --- Comment #10 from Richard Biener <rguenth at gcc dot gnu.org> --- (In reply to Andreas Schwab from comment #2) > Also breaks gcc.dg/vect/vect-strided-a-u8-i2-gap.c > > $ gcc/xgcc -Bgcc/ ../gcc/testsuite/gcc.dg/vect/vect-strided-a-u8-i2-gap.c > -ftree-vectorize -fno-vect-cost-model -fno-common -O2 > -fdump-tree-vect-details -lm -o ./vect-strided-a-u8-i2-gap.exe > ../gcc/testsuite/gcc.dg/vect/vect-strided-a-u8-i2-gap.c: In function ‘main1’: > ../gcc/testsuite/gcc.dg/vect/vect-strided-a-u8-i2-gap.c:34:16: internal > compiler error: in expand_expr_real_2, at expr.c:9156 > res[i].b = ptr->a; > ^ > 0x400000000059052f expand_expr_real_2(separate_ops*, rtx_def*, machine_mode, > expand_modifier) > ../../gcc/expr.c:9156 > 0x4000000000579c1f expand_expr_real_1(tree_node*, rtx_def*, machine_mode, > expand_modifier, rtx_def**, bool) > ../../gcc/expr.c:9463 > 0x400000000058b71f store_expr(tree_node*, rtx_def*, int, bool) > ../../gcc/expr.c:5344 > 0x400000000059701f expand_assignment(tree_node*, tree_node*, bool) > ../../gcc/expr.c:5130 > 0x4000000000381b7f expand_gimple_stmt_1 > ../../gcc/cfgexpand.c:3285 > 0x4000000000381b7f expand_gimple_stmt > ../../gcc/cfgexpand.c:3381 > 0x400000000038d89f expand_gimple_basic_block > ../../gcc/cfgexpand.c:5216 > 0x40000000003916ef execute > ../../gcc/cfgexpand.c:5822 This also still happens. The vectorizer generates (and verified) vect_perm_even_77 = VEC_PERM_EXPR <vect__22.9_74, vect__22.10_76, { 0, 2, 4, 6, 8, 10, 12, 14 }>; vect_perm_odd_78 = VEC_PERM_EXPR <vect__22.9_74, vect__22.10_76, { 1, 3, 5, 7, 9, 11, 13, 15 }>; vect_inter_high_82 = VEC_PERM_EXPR <vect_perm_even_77, vect_perm_even_77, { 0, 8, 1, 9, 2, 10, 3, 11 }>; vect_inter_low_83 = VEC_PERM_EXPR <vect_perm_even_77, vect_perm_even_77, { 4, 12, 5, 13, 6, 14, 7, 15 }>; then we unroll the loop and forwprop4 comes along changing vect_perm_even_145 = VEC_PERM_EXPR <vect__22.9_142, vect__22.10_144, { 0, 2, 4, 6, 8, 10, 12, 14 }>; vect_inter_high_146 = VEC_PERM_EXPR <vect_perm_even_145, vect_perm_even_145, { 0, 8, 1, 9, 2, 10, 3, 11 }>; to vect_perm_even_145 = VEC_PERM_EXPR <vect__22.9_142, vect__22.10_144, { 0, 2, 4, 6, 8, 10, 12, 14 }>; vect_inter_high_146 = VEC_PERM_EXPR <vect_perm_even_145, vect_perm_even_145, { 0, 0, 1, 1, 2, 2, 3, 3 }>; which isn't a supported permutation. It looks like fold-const.c:fold_ternary_loc doesn't care about only generating supported permutations and the fallback code in expand_vec_perm doesn't cover all cases.