From patchwork Tue Feb 7 08:40:19 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Biener X-Patchwork-Id: 725020 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3vHd8S58p4z9s7m for ; Tue, 7 Feb 2017 19:40:40 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b="NWUT7GXx"; dkim-atps=neutral DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:date :from:to:subject:message-id:mime-version:content-type; q=dns; s= default; b=ViYgLTvQDCTaLmw2hskSn9JHPuFFDNknJlRw3Fr42mj7+lmAoPZ9j SKFXeIq/d5NsWdHjJBTve21v497g8ae3+FHdYm+jN5WZ5hSj/UGGDophNBuHOxGl sqatHae5FEjRtFCQxElFbeqtVKkRpMo88z1W3PNAQIYJeT7RzJS3gw= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:date :from:to:subject:message-id:mime-version:content-type; s= default; bh=dtH+abtM5/3N7H7PPJ7qzTQh5bM=; b=NWUT7GXx7EJQ1hmCLmhw w7+BWxz9IThRwEjdcmGm2x2cq6lDrun9IlyLxo+7lEl/hjEHdR6f3moNWJJvxSe8 XeVKV+zImBCc1MGi9RAhWsr2LnBs4H8IcCL1EqWrdRw8Koy5t9C+5lhoZJy9dXDP W98qDjgKCzsqQ9jUnTk40iE= Received: (qmail 126409 invoked by alias); 7 Feb 2017 08:40:32 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 126392 invoked by uid 89); 7 Feb 2017 08:40:31 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.1 required=5.0 tests=BAYES_00, KAM_ASCII_DIVIDERS, RP_MATCHES_RCVD, SPF_PASS autolearn=no version=3.3.2 spammy=GIMPLEFE, UD:release, gimplefe, auto_vec X-HELO: mx2.suse.de Received: from mx2.suse.de (HELO mx2.suse.de) (195.135.220.15) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 07 Feb 2017 08:40:21 +0000 Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id AD6CDAAC7 for ; Tue, 7 Feb 2017 08:40:19 +0000 (UTC) Date: Tue, 7 Feb 2017 09:40:19 +0100 (CET) From: Richard Biener To: gcc-patches@gcc.gnu.org Subject: [PATCH][GIMPLEFE] Simplify/fix call stmt building Message-ID: User-Agent: Alpine 2.20 (LSU 67 2015-01-07) MIME-Version: 1.0 This avoids the C machinery when building CALL_EXPRs (folding and argument promotion). Bootstrap and regtest in progress on x86_64-unknown-linux-gnu. Richard. 2017-02-07 Richard Biener c/ * gimple-parser.c (c_parser_gimple_expr_list): Simplify. (c_parser_gimple_postfix_expression_after_primary): Do not use c_build_function_call_vec to avoid folding and promotion. Simplify. * gcc.dg/gimplefe-23.c: New testcase. * gcc.dg/gimplefe-24.c: Likewise. Index: gcc/c/gimple-parser.c =================================================================== --- gcc/c/gimple-parser.c (revision 245240) +++ gcc/c/gimple-parser.c (working copy) @@ -73,8 +73,7 @@ static void c_parser_gimple_switch_stmt static void c_parser_gimple_return_stmt (c_parser *, gimple_seq *); static void c_finish_gimple_return (location_t, tree); static tree c_parser_gimple_paren_condition (c_parser *); -static vec *c_parser_gimple_expr_list (c_parser *, - vec **, vec *); +static void c_parser_gimple_expr_list (c_parser *, vec *); /* Parse the body of a function declaration marked with "__GIMPLE". */ @@ -898,10 +897,6 @@ c_parser_gimple_postfix_expression_after location_t expr_loc, struct c_expr expr) { - struct c_expr orig_expr; - vec *exprlist; - vec *origtypes = NULL; - vec arg_loc = vNULL; location_t start; location_t finish; tree ident; @@ -936,34 +931,16 @@ c_parser_gimple_postfix_expression_after { /* Function call. */ c_parser_consume_token (parser); - if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN)) - exprlist = NULL; - else - exprlist = c_parser_gimple_expr_list (parser, &origtypes, - &arg_loc); + auto_vec exprlist; + if (! c_parser_next_token_is (parser, CPP_CLOSE_PAREN)) + c_parser_gimple_expr_list (parser, &exprlist); c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>"); - orig_expr = expr; - start = expr.get_start (); - finish = c_parser_tokens_buf (parser, 0)->get_finish (); - expr.value = c_build_function_call_vec (expr_loc, arg_loc, - expr.value, - exprlist, origtypes); - set_c_expr_source_range (&expr, start, finish); - + expr.value = build_call_array_loc + (expr_loc, TREE_TYPE (TREE_TYPE (expr.value)), + expr.value, exprlist.length (), exprlist.address ()); expr.original_code = ERROR_MARK; - if (TREE_CODE (expr.value) == INTEGER_CST - && TREE_CODE (orig_expr.value) == FUNCTION_DECL - && DECL_BUILT_IN_CLASS (orig_expr.value) == BUILT_IN_NORMAL - && DECL_FUNCTION_CODE (orig_expr.value) == BUILT_IN_CONSTANT_P) - expr.original_code = C_MAYBE_CONST_EXPR; expr.original_type = NULL; - if (exprlist) - { - release_tree_vector (exprlist); - release_tree_vector (origtypes); - } - arg_loc.release (); break; } case CPP_DOT: @@ -1058,41 +1035,19 @@ c_parser_gimple_postfix_expression_after */ -static vec * -c_parser_gimple_expr_list (c_parser *parser, vec **p_orig_types, - vec *locations) +static void +c_parser_gimple_expr_list (c_parser *parser, vec *ret) { - vec *ret; - vec *orig_types; struct c_expr expr; - location_t loc = c_parser_peek_token (parser)->location; - - ret = make_tree_vector (); - if (p_orig_types == NULL) - orig_types = NULL; - else - orig_types = make_tree_vector (); expr = c_parser_gimple_unary_expression (parser); - vec_safe_push (ret, expr.value); - if (orig_types) - vec_safe_push (orig_types, expr.original_type); - if (locations) - locations->safe_push (loc); + ret->safe_push (expr.value); while (c_parser_next_token_is (parser, CPP_COMMA)) { c_parser_consume_token (parser); - loc = c_parser_peek_token (parser)->location; expr = c_parser_gimple_unary_expression (parser); - vec_safe_push (ret, expr.value); - if (orig_types) - vec_safe_push (orig_types, expr.original_type); - if (locations) - locations->safe_push (loc); + ret->safe_push (expr.value); } - if (orig_types) - *p_orig_types = orig_types; - return ret; } /* Parse gimple label. Index: gcc/testsuite/gcc.dg/gimplefe-23.c =================================================================== --- gcc/testsuite/gcc.dg/gimplefe-23.c (nonexistent) +++ gcc/testsuite/gcc.dg/gimplefe-23.c (working copy) @@ -0,0 +1,33 @@ +/* { dg-do compile } */ +/* { dg-options "-fgimple" } */ + +short int __GIMPLE () +foo (short int s) +{ + short int D_1803; + +bb_2: + D_1803 = s; + +L0: + return D_1803; + +} + +int __GIMPLE () +main (int argc, char * * argv) +{ + short int s; + int D_1805; + int _1; + short _2; + +bb_2: + s = (short int) argc; + _1 = (int) s; + _2 = foo (_1); + D_1805 = (int) _2; + +L0: + return D_1805; +} Index: gcc/testsuite/gcc.dg/gimplefe-24.c =================================================================== --- gcc/testsuite/gcc.dg/gimplefe-24.c (nonexistent) +++ gcc/testsuite/gcc.dg/gimplefe-24.c (working copy) @@ -0,0 +1,9 @@ +/* { dg-do compile } */ +/* { dg-options "-fgimple" } */ + +int __GIMPLE foo(int a) +{ + int t1; + t1_1 = __builtin_abs (a); + return t1_1; +}