Commit 1158c5b4 by Richard Biener Committed by Richard Biener

gimple-parser.c (c_parser_gimple_statement): Remove questionable auto-promotion…

gimple-parser.c (c_parser_gimple_statement): Remove questionable auto-promotion to VIEW_CONVERT_EXPR.

2019-05-14  Richard Biener  <rguenther@suse.de>

	* gimple-parser.c (c_parser_gimple_statement): Remove
	questionable auto-promotion to VIEW_CONVERT_EXPR.
	(c_parser_gimple_typespec): Split out from __MEM parsing.
	(c_parser_gimple_postfix_expression): Handle __VIEW_CONVERT.
	* tree-pretty-print.c (dump_generic_node): Dump VIEW_CONVERT_EXPR
	as __VIEW_CONVERT with -gimple.

	* gcc.dg/gimplefe-40.c: New testcase.

From-SVN: r271170
parent 22b6a9c1
2019-05-14 Richard Biener <rguenther@suse.de>
* gimple-parser.c (c_parser_gimple_statement): Remove
questionable auto-promotion to VIEW_CONVERT_EXPR.
(c_parser_gimple_typespec): Split out from __MEM parsing.
(c_parser_gimple_postfix_expression): Handle __VIEW_CONVERT.
* tree-pretty-print.c (dump_generic_node): Dump VIEW_CONVERT_EXPR
as __VIEW_CONVERT with -gimple.
2019-05-09 Martin Liska <mliska@suse.cz>
* gimple-parser.c (c_parser_gimple_statement): Support __MIN and
......
......@@ -724,14 +724,8 @@ c_parser_gimple_statement (gimple_parser &parser, gimple_seq *seq)
&& rhs.value != error_mark_node)
{
enum tree_code code = NOP_EXPR;
if (VECTOR_TYPE_P (TREE_TYPE (lhs.value)))
{
code = VIEW_CONVERT_EXPR;
rhs.value = build1 (VIEW_CONVERT_EXPR,
TREE_TYPE (lhs.value), rhs.value);
}
else if (FLOAT_TYPE_P (TREE_TYPE (lhs.value))
&& ! FLOAT_TYPE_P (TREE_TYPE (rhs.value)))
if (FLOAT_TYPE_P (TREE_TYPE (lhs.value))
&& ! FLOAT_TYPE_P (TREE_TYPE (rhs.value)))
code = FLOAT_EXPR;
else if (! FLOAT_TYPE_P (TREE_TYPE (lhs.value))
&& FLOAT_TYPE_P (TREE_TYPE (rhs.value)))
......@@ -1247,6 +1241,36 @@ c_parser_gimple_call_internal (gimple_parser &parser)
return expr;
}
/* Parse '<' type [',' alignment] '>' and return a type on success
and NULL_TREE on error. */
static tree
c_parser_gimple_typespec (gimple_parser &parser)
{
struct c_type_name *type_name = NULL;
tree alignment = NULL_TREE;
if (c_parser_require (parser, CPP_LESS, "expected %<<%>"))
{
type_name = c_parser_type_name (parser);
/* Optional alignment. */
if (c_parser_next_token_is (parser, CPP_COMMA))
{
c_parser_consume_token (parser);
alignment
= c_parser_gimple_postfix_expression (parser).value;
}
c_parser_skip_until_found (parser,
CPP_GREATER, "expected %<>%>");
}
if (!type_name)
return NULL_TREE;
tree tem;
tree type = groktypename (type_name, &tem, NULL);
if (alignment)
type = build_aligned_type (type, tree_to_uhwi (alignment));
return type;
}
/* Parse gimple postfix expression.
gimple-postfix-expression:
......@@ -1316,21 +1340,7 @@ c_parser_gimple_postfix_expression (gimple_parser &parser)
[ '+' number ] ')' */
location_t loc = c_parser_peek_token (parser)->location;
c_parser_consume_token (parser);
struct c_type_name *type_name = NULL;
tree alignment = NULL_TREE;
if (c_parser_require (parser, CPP_LESS, "expected %<<%>"))
{
type_name = c_parser_type_name (parser);
/* Optional alignment. */
if (c_parser_next_token_is (parser, CPP_COMMA))
{
c_parser_consume_token (parser);
alignment
= c_parser_gimple_postfix_expression (parser).value;
}
c_parser_skip_until_found (parser,
CPP_GREATER, "expected %<>%>");
}
tree type = c_parser_gimple_typespec (parser);
struct c_expr ptr;
ptr.value = error_mark_node;
tree alias_off = NULL_TREE;
......@@ -1378,19 +1388,33 @@ c_parser_gimple_postfix_expression (gimple_parser &parser)
c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
"expected %<)%>");
}
if (! type_name || c_parser_error (parser))
if (! type || c_parser_error (parser))
{
c_parser_set_error (parser, false);
return expr;
}
tree tem = NULL_TREE;
tree type = groktypename (type_name, &tem, NULL);
if (alignment)
type = build_aligned_type (type, tree_to_uhwi (alignment));
expr.value = build2_loc (loc, MEM_REF,
type, ptr.value, alias_off);
break;
}
else if (strcmp (IDENTIFIER_POINTER (id), "__VIEW_CONVERT") == 0)
{
/* __VIEW_CONVERT '<' type-name [ ',' number ] '>'
'(' postfix-expression ')' */
location_t loc = c_parser_peek_token (parser)->location;
c_parser_consume_token (parser);
tree type = c_parser_gimple_typespec (parser);
if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
{
c_expr op = c_parser_gimple_postfix_expression (parser);
c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
"expected %<)%>");
if (type && op.value != error_mark_node)
expr.value = build1_loc (loc, VIEW_CONVERT_EXPR,
type, op.value);
}
break;
}
else if (strcmp (IDENTIFIER_POINTER (id), "_Literal") == 0)
{
/* _Literal '(' type-name ')' ( [ '-' ] constant | constructor ) */
......
2019-05-14 Richard Biener <rguenther@suse.de>
* gcc.dg/gimplefe-40.c: New testcase.
2019-05-14 Paolo Carlini <paolo.carlini@oracle.com>
PR preprocessor/90382
......
/* { dg-do compile { target int128 } } */
/* { dg-options "-fgimple -Wno-psabi -w" } */
typedef float v4sf __attribute__((vector_size(16)));
v4sf __GIMPLE (ssa)
load (const void * p)
{
__int128 unsigned _3;
v4sf _4;
__BB(2):
_3 = __MEM <__int128 unsigned, 8> ((char *)p_2(D));
_4 = __VIEW_CONVERT <v4sf>(_3);
return _4;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment