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.

Reply via email to