aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2017-01-13 08:16:59 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2017-01-13 08:16:59 +0000
commit2532991330bb47ab45c099ad54681e3e1a0981a3 (patch)
treeff747237c5c0afc4668ec0dcff4a7b37a6310112
parent10b70b8e5eb8d4b5ab175785366cfc6cbe837390 (diff)
downloadgcc-2532991330bb47ab45c099ad54681e3e1a0981a3.zip
gcc-2532991330bb47ab45c099ad54681e3e1a0981a3.tar.gz
gcc-2532991330bb47ab45c099ad54681e3e1a0981a3.tar.bz2
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
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/c/ChangeLog5
-rw-r--r--gcc/c/gimple-parser.c26
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.dg/gimplefe-22.c9
-rw-r--r--gcc/tree-pretty-print.c34
6 files changed, 79 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index a635cc7..d79749e 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+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>
PR target/79004
diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog
index 65531aa..fd6f74b 100644
--- a/gcc/c/ChangeLog
+++ b/gcc/c/ChangeLog
@@ -1,3 +1,8 @@
+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>
* gimple-parser.c (c_parser_gimple_postfix_expression): Parse
diff --git a/gcc/c/gimple-parser.c b/gcc/c/gimple-parser.c
index ee8a01a..927c685 100644
--- a/gcc/c/gimple-parser.c
+++ b/gcc/c/gimple-parser.c
@@ -799,6 +799,32 @@ c_parser_gimple_postfix_expression (c_parser *parser)
type, ptr.value, alias_off);
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. */
unsigned version, ver_offset;
if (! lookup_name (id)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 4dc4fc1..91b769c 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,9 @@
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
* gcc.dg/tree-ssa/split-path-7.c: Adjust.
* gcc.dg/tree-ssa/split-path-8.c: New testcase.
diff --git a/gcc/testsuite/gcc.dg/gimplefe-22.c b/gcc/testsuite/gcc.dg/gimplefe-22.c
new file mode 100644
index 0000000..8e213b9
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gimplefe-22.c
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+/* { dg-options "-fgimple" } */
+
+void __GIMPLE ()
+foo (short * p)
+{
+ *p = _Literal (short int) 1;
+ return;
+}
diff --git a/gcc/tree-pretty-print.c b/gcc/tree-pretty-print.c
index 87b4044..ebce67e 100644
--- a/gcc/tree-pretty-print.c
+++ b/gcc/tree-pretty-print.c
@@ -1664,6 +1664,16 @@ dump_generic_node (pretty_printer *pp, tree node, int spc, int flags,
break;
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
&& ! (flags & TDF_GIMPLE))
{
@@ -1693,11 +1703,7 @@ dump_generic_node (pretty_printer *pp, tree node, int spc, int flags,
else if (tree_fits_shwi_p (node))
pp_wide_integer (pp, tree_to_shwi (node));
else if (tree_fits_uhwi_p (node))
- {
- pp_unsigned_wide_integer (pp, tree_to_uhwi (node));
- if (flags & TDF_GIMPLE)
- pp_character (pp, 'U');
- }
+ pp_unsigned_wide_integer (pp, tree_to_uhwi (node));
else
{
wide_int val = node;
@@ -1710,6 +1716,24 @@ dump_generic_node (pretty_printer *pp, tree node, int spc, int flags,
print_hex (val, 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))
pp_string (pp, "(OVF)");
break;