Commit fd4485aa by Martin Liska Committed by Martin Liska

Support {MIN,MAX}_EXPR in GIMPLE FE.

2019-05-09  Martin Liska  <mliska@suse.cz>

	* gimple-pretty-print.c (dump_binary_rhs): Dump MIN_EXPR
	and MAX_EXPR in GIMPLE FE format.
2019-05-09  Martin Liska  <mliska@suse.cz>

	* gimple-parser.c (c_parser_gimple_statement): Support __MIN and
	__MAX.
	(c_parser_gimple_unary_expression): Parse also binary expression
	__MIN and __MAX.
	(c_parser_gimple_parentized_binary_expression): New function.
2019-05-09  Martin Liska  <mliska@suse.cz>

	* gcc.dg/gimplefe-39.c: New test.

From-SVN: r271035
parent d276406a
2019-05-09 Martin Liska <mliska@suse.cz> 2019-05-09 Martin Liska <mliska@suse.cz>
* gimple-pretty-print.c (dump_binary_rhs): Dump MIN_EXPR
and MAX_EXPR in GIMPLE FE format.
2019-05-09 Martin Liska <mliska@suse.cz>
* tree-cfg.c (dump_function_to_file): Dump entry BB count. * tree-cfg.c (dump_function_to_file): Dump entry BB count.
* gimple-pretty-print.c (dump_gimple_bb_header): * gimple-pretty-print.c (dump_gimple_bb_header):
Dump BB count. Dump BB count.
......
2019-05-09 Martin Liska <mliska@suse.cz> 2019-05-09 Martin Liska <mliska@suse.cz>
* gimple-parser.c (c_parser_gimple_statement): Support __MIN and
__MAX.
(c_parser_gimple_unary_expression): Parse also binary expression
__MIN and __MAX.
(c_parser_gimple_parentized_binary_expression): New function.
2019-05-09 Martin Liska <mliska@suse.cz>
* gimple-parser.c (struct gimple_parser): Add probability. * gimple-parser.c (struct gimple_parser): Add probability.
for gimple_parser_edge. for gimple_parser_edge.
(gimple_parser::push_edge): Add new argument probability. (gimple_parser::push_edge): Add new argument probability.
......
...@@ -750,7 +750,9 @@ c_parser_gimple_statement (gimple_parser &parser, gimple_seq *seq) ...@@ -750,7 +750,9 @@ c_parser_gimple_statement (gimple_parser &parser, gimple_seq *seq)
{ {
tree id = c_parser_peek_token (parser)->value; tree id = c_parser_peek_token (parser)->value;
if (strcmp (IDENTIFIER_POINTER (id), "__ABS") == 0 if (strcmp (IDENTIFIER_POINTER (id), "__ABS") == 0
|| strcmp (IDENTIFIER_POINTER (id), "__ABSU") == 0) || strcmp (IDENTIFIER_POINTER (id), "__ABSU") == 0
|| strcmp (IDENTIFIER_POINTER (id), "__MIN") == 0
|| strcmp (IDENTIFIER_POINTER (id), "__MAX") == 0)
goto build_unary_expr; goto build_unary_expr;
break; break;
} }
...@@ -989,6 +991,32 @@ c_parser_gimple_binary_expression (gimple_parser &parser) ...@@ -989,6 +991,32 @@ c_parser_gimple_binary_expression (gimple_parser &parser)
return ret; return ret;
} }
/* Parse a gimple parentized binary expression. */
static c_expr
c_parser_gimple_parentized_binary_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_CLOSE_PAREN, "expected %<)%>"))
return ret;
if (op1.value != error_mark_node && op2.value != error_mark_node)
ret.value = build2_loc (op_loc,
code, TREE_TYPE (op1.value), op1.value, op2.value);
return ret;
}
/* Parse gimple unary expression. /* Parse gimple unary expression.
gimple-unary-expression: gimple-unary-expression:
...@@ -1078,6 +1106,14 @@ c_parser_gimple_unary_expression (gimple_parser &parser) ...@@ -1078,6 +1106,14 @@ c_parser_gimple_unary_expression (gimple_parser &parser)
op = c_parser_gimple_postfix_expression (parser); op = c_parser_gimple_postfix_expression (parser);
return parser_build_unary_op (op_loc, ABSU_EXPR, op); return parser_build_unary_op (op_loc, ABSU_EXPR, op);
} }
else if (strcmp (IDENTIFIER_POINTER (id), "__MIN") == 0)
return c_parser_gimple_parentized_binary_expression (parser,
op_loc,
MIN_EXPR);
else if (strcmp (IDENTIFIER_POINTER (id), "__MAX") == 0)
return c_parser_gimple_parentized_binary_expression (parser,
op_loc,
MAX_EXPR);
else else
return c_parser_gimple_postfix_expression (parser); return c_parser_gimple_postfix_expression (parser);
} }
......
...@@ -423,9 +423,22 @@ dump_binary_rhs (pretty_printer *buffer, gassign *gs, int spc, ...@@ -423,9 +423,22 @@ dump_binary_rhs (pretty_printer *buffer, gassign *gs, int spc,
enum tree_code code = gimple_assign_rhs_code (gs); enum tree_code code = gimple_assign_rhs_code (gs);
switch (code) switch (code)
{ {
case COMPLEX_EXPR:
case MIN_EXPR: case MIN_EXPR:
case MAX_EXPR: case MAX_EXPR:
if (flags & TDF_GIMPLE)
{
pp_string (buffer, code == MIN_EXPR ? "__MIN (" : "__MAX (");
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, ")");
break;
}
else
gcc_fallthrough ();
case COMPLEX_EXPR:
case VEC_WIDEN_MULT_HI_EXPR: case VEC_WIDEN_MULT_HI_EXPR:
case VEC_WIDEN_MULT_LO_EXPR: case VEC_WIDEN_MULT_LO_EXPR:
case VEC_WIDEN_MULT_EVEN_EXPR: case VEC_WIDEN_MULT_EVEN_EXPR:
......
2019-05-09 Martin Liska <mliska@suse.cz> 2019-05-09 Martin Liska <mliska@suse.cz>
* gcc.dg/gimplefe-39.c: New test.
2019-05-09 Martin Liska <mliska@suse.cz>
* gcc.dg/gimplefe-37.c: New test. * gcc.dg/gimplefe-37.c: New test.
* gcc.dg/gimplefe-33.c: Likewise. * gcc.dg/gimplefe-33.c: Likewise.
......
/* { dg-do compile } */
/* { dg-options "-O2 -fgimple -fdump-tree-optimized" } */
int a, b;
int __GIMPLE (ssa,guessed_local(1073741824))
main (int argc)
{
int _1;
int _2;
int _4;
__BB(2,guessed_local(1073741824)):
_1 = a;
_2 = b;
_4 = __MAX (_1, _2);
return _4;
}
/* { dg-final { scan-tree-dump "MAX_EXPR" "optimized" } } */
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