Hi. The patch is about support of a new GIMPLE expr.
Patch can bootstrap on x86_64-linux-gnu and survives regression tests. Ready to be installed? Thanks, Martin
>From a4f23fe8d876f2d8a0628feb57127e276348aab0 Mon Sep 17 00:00:00 2001 From: marxin <mli...@suse.cz> Date: Fri, 3 May 2019 13:54:40 +0200 Subject: [PATCH 2/2] Support {MIN,MAX}_EXPR in GIMPLE FE. gcc/ChangeLog: 2019-05-03 Martin Liska <mli...@suse.cz> * gimple-pretty-print.c (dump_binary_rhs): Dump MIN_EXPR and MAX_EXPR in GIMPLE FE format. gcc/c/ChangeLog: 2019-05-03 Martin Liska <mli...@suse.cz> * c-typeck.c (build_binary_op): Handle MIN_EXPR and MAX_EXPR with flag_gimple. * gimple-parser.c (c_parser_gimple_statement): Support __MIN and __MAX. (c_parser_gimple_unary_expression): Parse also binary expression __MIN and __MAX. gcc/testsuite/ChangeLog: 2019-05-03 Martin Liska <mli...@suse.cz> * gcc.dg/gimplefe-39.c: New test. --- gcc/c/c-typeck.c | 10 ++++++++++ gcc/c/gimple-parser.c | 21 ++++++++++++++++++++- gcc/gimple-pretty-print.c | 15 ++++++++++++++- gcc/testsuite/gcc.dg/gimplefe-39.c | 21 +++++++++++++++++++++ 4 files changed, 65 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/gimplefe-39.c diff --git a/gcc/c/c-typeck.c b/gcc/c/c-typeck.c index 4e443754002..d0ae9c51f6b 100644 --- a/gcc/c/c-typeck.c +++ b/gcc/c/c-typeck.c @@ -12193,6 +12193,16 @@ build_binary_op (location_t location, enum tree_code code, maybe_warn_bool_compare (location, code, orig_op0, orig_op1); break; + case MIN_EXPR: + case MAX_EXPR: + if (flag_gimple) + { + result_type = c_common_type (type0, type1); + break; + } + else + gcc_unreachable (); + default: gcc_unreachable (); } diff --git a/gcc/c/gimple-parser.c b/gcc/c/gimple-parser.c index 6558770873f..f3e0d2f94ad 100644 --- a/gcc/c/gimple-parser.c +++ b/gcc/c/gimple-parser.c @@ -747,7 +747,9 @@ c_parser_gimple_statement (gimple_parser &parser, gimple_seq *seq) { tree id = c_parser_peek_token (parser)->value; 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; break; } @@ -1062,6 +1064,7 @@ c_parser_gimple_unary_expression (gimple_parser &parser) } case CPP_NAME: { + bool is_min; tree id = c_parser_peek_token (parser)->value; if (strcmp (IDENTIFIER_POINTER (id), "__ABS") == 0) { @@ -1075,6 +1078,22 @@ c_parser_gimple_unary_expression (gimple_parser &parser) op = c_parser_gimple_postfix_expression (parser); return parser_build_unary_op (op_loc, ABSU_EXPR, op); } + else if ((is_min = strcmp (IDENTIFIER_POINTER (id), "__MIN") == 0) + || strcmp (IDENTIFIER_POINTER (id), "__MAX") == 0) + { + 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; + return parser_build_binary_op (op_loc, + is_min ? MIN_EXPR : MAX_EXPR, + op1, op2); + } else return c_parser_gimple_postfix_expression (parser); } diff --git a/gcc/gimple-pretty-print.c b/gcc/gimple-pretty-print.c index 7e3916bff86..58212c4dcc1 100644 --- a/gcc/gimple-pretty-print.c +++ b/gcc/gimple-pretty-print.c @@ -423,9 +423,22 @@ dump_binary_rhs (pretty_printer *buffer, gassign *gs, int spc, enum tree_code code = gimple_assign_rhs_code (gs); switch (code) { - case COMPLEX_EXPR: case MIN_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_LO_EXPR: case VEC_WIDEN_MULT_EVEN_EXPR: diff --git a/gcc/testsuite/gcc.dg/gimplefe-39.c b/gcc/testsuite/gcc.dg/gimplefe-39.c new file mode 100644 index 00000000000..30677356d5b --- /dev/null +++ b/gcc/testsuite/gcc.dg/gimplefe-39.c @@ -0,0 +1,21 @@ +/* { 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" } } */ -- 2.21.0