Commit 25329913 by Richard Biener Committed by Richard Biener

gimple-parser.c (c_parser_gimple_postfix_expression): Parse _Literal ( type-name ) number.

2017-01-13  Richard Biener  <rguenther@suse.de>

	c/
	* gimple-parser.c (c_parser_gimple_postfix_expression): Parse
	_Literal ( type-name ) number.

	* tree-pretty-print.c (dump_generic_node): Dump INTEGER_CSTs
	as _Literal ( type ) number in case usual suffixes do not
	preserve all information.

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

From-SVN: r244393
parent 10b70b8e
2017-01-13 Richard Biener <rguenther@suse.de>
* tree-pretty-print.c (dump_generic_node): Dump INTEGER_CSTs
as _Literal ( type ) number in case usual suffixes do not
preserve all information.
2017-01-12 Michael Meissner <meissner@linux.vnet.ibm.com> 2017-01-12 Michael Meissner <meissner@linux.vnet.ibm.com>
PR target/79004 PR target/79004
......
2017-01-13 Richard Biener <rguenther@suse.de>
* gimple-parser.c (c_parser_gimple_postfix_expression): Parse
_Literal ( type-name ) number.
2017-01-12 Richard Biener <rguenther@suse.de> 2017-01-12 Richard Biener <rguenther@suse.de>
* gimple-parser.c (c_parser_gimple_postfix_expression): Parse * gimple-parser.c (c_parser_gimple_postfix_expression): Parse
......
...@@ -799,6 +799,32 @@ c_parser_gimple_postfix_expression (c_parser *parser) ...@@ -799,6 +799,32 @@ c_parser_gimple_postfix_expression (c_parser *parser)
type, ptr.value, alias_off); type, ptr.value, alias_off);
break; break;
} }
else if (strcmp (IDENTIFIER_POINTER (id), "_Literal") == 0)
{
/* _Literal '(' type-name ')' number */
c_parser_consume_token (parser);
tree type = NULL_TREE;
if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
{
struct c_type_name *type_name = c_parser_type_name (parser);
tree tem;
if (type_name)
type = groktypename (type_name, &tem, NULL);
c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
"expected %<)%>");
}
tree val = c_parser_gimple_postfix_expression (parser).value;
if (! type
|| ! val
|| val == error_mark_node
|| TREE_CODE (val) != INTEGER_CST)
{
c_parser_error (parser, "invalid _Literal");
return expr;
}
expr.value = fold_convert (type, val);
return expr;
}
/* SSA name. */ /* SSA name. */
unsigned version, ver_offset; unsigned version, ver_offset;
if (! lookup_name (id) if (! lookup_name (id)
......
2017-01-13 Richard Biener <rguenther@suse.de> 2017-01-13 Richard Biener <rguenther@suse.de>
* gcc.dg/gimplefe-22.c: New testcase.
2017-01-13 Richard Biener <rguenther@suse.de>
PR tree-optimization/77283 PR tree-optimization/77283
* gcc.dg/tree-ssa/split-path-7.c: Adjust. * gcc.dg/tree-ssa/split-path-7.c: Adjust.
* gcc.dg/tree-ssa/split-path-8.c: New testcase. * gcc.dg/tree-ssa/split-path-8.c: New testcase.
......
/* { dg-do compile } */
/* { dg-options "-fgimple" } */
void __GIMPLE ()
foo (short * p)
{
*p = _Literal (short int) 1;
return;
}
...@@ -1664,6 +1664,16 @@ dump_generic_node (pretty_printer *pp, tree node, int spc, int flags, ...@@ -1664,6 +1664,16 @@ dump_generic_node (pretty_printer *pp, tree node, int spc, int flags,
break; break;
case INTEGER_CST: case INTEGER_CST:
if (flags & TDF_GIMPLE
&& (POINTER_TYPE_P (TREE_TYPE (node))
|| (TYPE_PRECISION (TREE_TYPE (node))
< TYPE_PRECISION (integer_type_node))
|| exact_log2 (TYPE_PRECISION (TREE_TYPE (node))) == -1))
{
pp_string (pp, "_Literal (");
dump_generic_node (pp, TREE_TYPE (node), spc, flags, false);
pp_string (pp, ") ");
}
if (TREE_CODE (TREE_TYPE (node)) == POINTER_TYPE if (TREE_CODE (TREE_TYPE (node)) == POINTER_TYPE
&& ! (flags & TDF_GIMPLE)) && ! (flags & TDF_GIMPLE))
{ {
...@@ -1693,11 +1703,7 @@ dump_generic_node (pretty_printer *pp, tree node, int spc, int flags, ...@@ -1693,11 +1703,7 @@ dump_generic_node (pretty_printer *pp, tree node, int spc, int flags,
else if (tree_fits_shwi_p (node)) else if (tree_fits_shwi_p (node))
pp_wide_integer (pp, tree_to_shwi (node)); pp_wide_integer (pp, tree_to_shwi (node));
else if (tree_fits_uhwi_p (node)) else if (tree_fits_uhwi_p (node))
{ pp_unsigned_wide_integer (pp, tree_to_uhwi (node));
pp_unsigned_wide_integer (pp, tree_to_uhwi (node));
if (flags & TDF_GIMPLE)
pp_character (pp, 'U');
}
else else
{ {
wide_int val = node; wide_int val = node;
...@@ -1710,6 +1716,24 @@ dump_generic_node (pretty_printer *pp, tree node, int spc, int flags, ...@@ -1710,6 +1716,24 @@ dump_generic_node (pretty_printer *pp, tree node, int spc, int flags,
print_hex (val, pp_buffer (pp)->digit_buffer); print_hex (val, pp_buffer (pp)->digit_buffer);
pp_string (pp, pp_buffer (pp)->digit_buffer); pp_string (pp, pp_buffer (pp)->digit_buffer);
} }
if ((flags & TDF_GIMPLE)
&& (POINTER_TYPE_P (TREE_TYPE (node))
|| (TYPE_PRECISION (TREE_TYPE (node))
< TYPE_PRECISION (integer_type_node))
|| exact_log2 (TYPE_PRECISION (TREE_TYPE (node))) == -1))
{
if (TYPE_UNSIGNED (TREE_TYPE (node)))
pp_character (pp, 'u');
if (TYPE_PRECISION (TREE_TYPE (node))
== TYPE_PRECISION (unsigned_type_node))
;
else if (TYPE_PRECISION (TREE_TYPE (node))
== TYPE_PRECISION (long_unsigned_type_node))
pp_character (pp, 'l');
else if (TYPE_PRECISION (TREE_TYPE (node))
== TYPE_PRECISION (long_long_unsigned_type_node))
pp_string (pp, "ll");
}
if (TREE_OVERFLOW (node)) if (TREE_OVERFLOW (node))
pp_string (pp, "(OVF)"); pp_string (pp, "(OVF)");
break; break;
......
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