@@ -61,7 +61,7 @@ static bool c_parser_gimple_compound_statement (c_parser *, gimple_seq *);
static void c_parser_gimple_label (c_parser *, gimple_seq *);
static void c_parser_gimple_statement (c_parser *, gimple_seq *);
static struct c_expr c_parser_gimple_binary_expression (c_parser *);
-static struct c_expr c_parser_gimple_unary_expression (c_parser *);
+static struct c_expr c_parser_gimple_unary_expression (c_parser *, bool called_from_stmt_parser = false);
static struct c_expr c_parser_gimple_postfix_expression (c_parser *);
static struct c_expr c_parser_gimple_postfix_expression_after_primary (c_parser *,
location_t,
@@ -323,7 +323,8 @@ c_parser_gimple_statement (c_parser *parser, gimple_seq *seq)
}
/* Unary expression. */
- switch (c_parser_peek_token (parser)->type)
+ enum cpp_ttype toktype = c_parser_peek_token (parser)->type;
+ switch (toktype)
{
case CPP_KEYWORD:
if (c_parser_peek_token (parser)->keyword != RID_REALPART
@@ -336,7 +337,12 @@ c_parser_gimple_statement (c_parser *parser, gimple_seq *seq)
case CPP_COMPL:
case CPP_NOT:
case CPP_MULT: /* pointer deref */
- rhs = c_parser_gimple_unary_expression (parser);
+ case CPP_NAME:
+ rhs = c_parser_gimple_unary_expression (parser, true);
+ if (toktype == CPP_NAME
+ && rhs.value == NULL)
+ break;
+
if (rhs.value != error_mark_node)
{
assign = gimple_build_assign (lhs.value, rhs.value);
@@ -537,11 +543,11 @@ c_parser_gimple_binary_expression (c_parser *parser)
unary-operator gimple-postfix-expression
unary-operator: one of
- & * + - ~
+ & * + - ~ abs_expr
*/
static c_expr
-c_parser_gimple_unary_expression (c_parser *parser)
+c_parser_gimple_unary_expression (c_parser *parser, bool called_from_stmt_parser)
{
struct c_expr ret, op;
location_t op_loc = c_parser_peek_token (parser)->location;
@@ -599,6 +606,23 @@ c_parser_gimple_unary_expression (c_parser *parser)
default:
return c_parser_gimple_postfix_expression (parser);
}
+ case CPP_NAME:
+ {
+ tree id = c_parser_peek_token (parser)->value;
+ if (strcmp (IDENTIFIER_POINTER (id), "__ABS") == 0)
+ {
+ c_parser_consume_token (parser);
+ op = c_parser_gimple_postfix_expression (parser);
+ return parser_build_unary_op (op_loc, ABS_EXPR, op);
+ }
+ else if (called_from_stmt_parser)
+ {
+ ret.value = NULL;
+ return ret;
+ }
+ else
+ return c_parser_gimple_postfix_expression (parser);
+ }
default:
return c_parser_gimple_postfix_expression (parser);
}
@@ -323,9 +323,17 @@ dump_unary_rhs (pretty_printer *buffer, gassign *gs, int spc, int flags)
break;
case ABS_EXPR:
- pp_string (buffer, "ABS_EXPR <");
- dump_generic_node (buffer, rhs, spc, flags, false);
- pp_greater (buffer);
+ if (flags & TDF_GIMPLE)
+ {
+ pp_string (buffer, "__ABS ");
+ dump_generic_node (buffer, rhs, spc, flags, false);
+ }
+ else
+ {
+ pp_string (buffer, "ABS_EXPR <");
+ dump_generic_node (buffer, rhs, spc, flags, false);
+ pp_greater (buffer);
+ }
break;
default:
new file mode 100644
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fgimple -fdump-tree-ssa-gimple" } */
+
+int __GIMPLE foo(int a)
+{
+ int t1;
+ t1_1 = __ABS a;
+ return t1_1;
+}
+
+/* { dg-final { scan-tree-dump "__ABS a" "ssa" } } */