On Fri, 17 May 2019 at 11:24, Richard Biener <rguent...@suse.de> wrote:
>
>
> Bootstrap / testing in progress on x86_64-unknown-linux-gnu.
>
> Richard.
>
> 2019-05-17  Richard Biener  <rguent...@suse.de>
>
>         c/
>         * gimple-parser.c (c_parser_gimple_statement): Handle __VEC_PERM.
>         (c_parser_gimple_unary_expression): Likewise.
>         (c_parser_gimple_parentized_ternary_expression): New function.
>
>         * gimple-pretty-print.c (dump_ternary_rhs): Handle dumping
>         VEC_PERM_EXPR as __VEC_PERM with -gimple.
>
>         * gcc.dg/gimplefe-41.c: New testcase.
>

Hi,

This causes an ICE on arm:
/gcc/testsuite/gcc.dg/gimplefe-41.c: In function '_mm_add_sd':
/gcc/testsuite/gcc.dg/gimplefe-41.c:39:1: error: vectors with
different element number found in vector permute expression
__v2df
__v2df
vector(2) double
__v2di
z_6 = VEC_PERM_EXPR <x_4(D), _7, { 2, 1, 0, 0 }>;
during IPA pass: *free_lang_data
/gcc/testsuite/gcc.dg/gimplefe-41.c:39:1: internal compiler error:
verify_gimple failed
0xc47110 verify_gimple_in_cfg(function*, bool)
        /gcc/tree-cfg.c:5396
0xb0b673 execute_function_todo
        /gcc/passes.c:1963
0xb0bf3d do_per_function
        /gcc/passes.c:1645
0xb0c009 execute_todo
        /gcc/passes.c:2017

Christophe

> Index: gcc/c/gimple-parser.c
> ===================================================================
> --- gcc/c/gimple-parser.c       (revision 271315)
> +++ gcc/c/gimple-parser.c       (working copy)
> @@ -746,8 +746,9 @@ c_parser_gimple_statement (gimple_parser
>         if (strcmp (IDENTIFIER_POINTER (id), "__ABS") == 0
>             || strcmp (IDENTIFIER_POINTER (id), "__ABSU") == 0
>             || strcmp (IDENTIFIER_POINTER (id), "__MIN") == 0
> +           || strcmp (IDENTIFIER_POINTER (id), "__MAX") == 0
>             || strcmp (IDENTIFIER_POINTER (id), "__BIT_INSERT") == 0
> -           || strcmp (IDENTIFIER_POINTER (id), "__MAX") == 0)
> +           || strcmp (IDENTIFIER_POINTER (id), "__VEC_PERM") == 0)
>           goto build_unary_expr;
>         break;
>        }
> @@ -1012,6 +1013,38 @@ c_parser_gimple_parentized_binary_expres
>    return ret;
>  }
>
> +/* Parse a gimple parentized binary expression.  */
> +
> +static c_expr
> +c_parser_gimple_parentized_ternary_expression (gimple_parser &parser,
> +                                              location_t op_loc,
> +                                              tree_code code)
> +{
> +  struct c_expr ret;
> +  ret.set_error ();
> +
> +  c_parser_consume_token (parser);
> +  if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
> +    return ret;
> +  c_expr op1 = c_parser_gimple_postfix_expression (parser);
> +  if (!c_parser_require (parser, CPP_COMMA, "expected %<,%>"))
> +    return ret;
> +  c_expr op2 = c_parser_gimple_postfix_expression (parser);
> +  if (!c_parser_require (parser, CPP_COMMA, "expected %<)%>"))
> +    return ret;
> +  c_expr op3 = c_parser_gimple_postfix_expression (parser);
> +  if (!c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"))
> +    return ret;
> +
> +  if (op1.value != error_mark_node
> +      && op2.value != error_mark_node
> +      && op3.value != error_mark_node)
> +    ret.value = build3_loc (op_loc,
> +                           code, TREE_TYPE (op1.value),
> +                           op1.value, op2.value, op3.value);
> +  return ret;
> +}
> +
>  /* Parse gimple unary expression.
>
>     gimple-unary-expression:
> @@ -1109,6 +1142,9 @@ c_parser_gimple_unary_expression (gimple
>             return c_parser_gimple_parentized_binary_expression (parser,
>                                                                  op_loc,
>                                                                  MAX_EXPR);
> +         else if (strcmp (IDENTIFIER_POINTER (id), "__VEC_PERM") == 0)
> +           return c_parser_gimple_parentized_ternary_expression
> +                       (parser, op_loc, VEC_PERM_EXPR);
>           else if (strcmp (IDENTIFIER_POINTER (id), "__BIT_INSERT") == 0)
>             {
>               /* __BIT_INSERT '(' postfix-expression, postfix-expression,
> Index: gcc/gimple-pretty-print.c
> ===================================================================
> --- gcc/gimple-pretty-print.c   (revision 271315)
> +++ gcc/gimple-pretty-print.c   (working copy)
> @@ -529,13 +529,19 @@ dump_ternary_rhs (pretty_printer *buffer
>        break;
>
>      case VEC_PERM_EXPR:
> -      pp_string (buffer, "VEC_PERM_EXPR <");
> +      if (flags & TDF_GIMPLE)
> +       pp_string (buffer, "__VEC_PERM (");
> +      else
> +       pp_string (buffer, "VEC_PERM_EXPR <");
>        dump_generic_node (buffer, gimple_assign_rhs1 (gs), spc, flags, false);
>        pp_string (buffer, ", ");
>        dump_generic_node (buffer, gimple_assign_rhs2 (gs), spc, flags, false);
>        pp_string (buffer, ", ");
>        dump_generic_node (buffer, gimple_assign_rhs3 (gs), spc, flags, false);
> -      pp_greater (buffer);
> +      if (flags & TDF_GIMPLE)
> +       pp_right_paren (buffer);
> +      else
> +       pp_greater (buffer);
>        break;
>
>      case REALIGN_LOAD_EXPR:
> Index: gcc/testsuite/gcc.dg/gimplefe-41.c
> ===================================================================
> --- gcc/testsuite/gcc.dg/gimplefe-41.c  (nonexistent)
> +++ gcc/testsuite/gcc.dg/gimplefe-41.c  (working copy)
> @@ -0,0 +1,39 @@
> +/* { dg-do compile } */
> +/* { dg-options "-fgimple -Wno-psabi -w" } */
> +
> +typedef double __v2df __attribute__ ((__vector_size__ (16)));
> +typedef unsigned long __v2di __attribute__ ((__vector_size__ (16)));
> +
> +__v2df __GIMPLE (ssa)
> +_mm_add_sd (__v2df x, __v2df y)
> +{
> +  __v2df z;
> +  double _1;
> +  double _2;
> +  double _3;
> +  __v2df _7;
> +
> +  __BB(2):
> +  _1 = __BIT_FIELD_REF <double> (x_4(D), 64u, 0u);
> +  _2 = __BIT_FIELD_REF <double> (y_5(D), 64u, 0u);
> +  _3 = _1 + _2;
> +  _7 = _Literal (__v2df) {_3, _3};
> +  z_6 = __VEC_PERM (x_4(D), _7, _Literal (__v2di) { 2ul, 1ul });
> +  return z_6;
> +}
> +
> +__v2df __GIMPLE (ssa)
> +_mm_add_sd2 (__v2df x, __v2df y)
> +{
> +  __v2df z;
> +  double _1;
> +  double _2;
> +  double _3;
> +
> +  __BB(2):
> +  _1 = __BIT_FIELD_REF <double> (x_4(D), 64u, 0u);
> +  _2 = __BIT_FIELD_REF <double> (y_5(D), 64u, 0u);
> +  _3 = _1 + _2;
> +  z_6 = __BIT_INSERT (x_4(D), _3, 0);
> +  return z_6;
> +}

Reply via email to