From patchwork Fri Apr 19 17:15:49 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Greenhalgh X-Patchwork-Id: 238060 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 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client CN "localhost", Issuer "www.qmailtoaster.com" (not verified)) by ozlabs.org (Postfix) with ESMTPS id 4AA6A2C01E4 for ; Sat, 20 Apr 2013 03:17:08 +1000 (EST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-type; q=dns; s=default; b=C6GjpehPKSoKeAGo MDBKjbPSabUDnp6fPmF0NiUm2t9YOGTaK+ZL34Adx0k3VrWj8NMYTfeLFkHSmsMk FN4kKWa7renekplcBieQcdJf3ocFC6QN4M2LZpM+Lu3ZKJLA+z3V2CkIt/9UGU0c dnYrBuMRhi0HcNb27GEYKfvRSfQ= 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:from :to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-type; s=default; bh=YbXde8R1jLtQ38EN1wYRKW H1OJ4=; b=sjut0n9U35JOyRedgp+G7Fr0mWf+gL1lEXbqEkOSHXSNcoJQA505A0 yJfCn13HhF+MLrRROu2ZwU3Ipm/t4gGNfhmJwGDwM7/Rdy0Qcn/rfNhJKnVHq6s2 FAdzt68e9suVuP7vjQbSpgeZT4qaf7auWRgL127hFmaahUomV4A2Y= Received: (qmail 20665 invoked by alias); 19 Apr 2013 17:17:01 -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 20653 invoked by uid 89); 19 Apr 2013 17:17:01 -0000 X-Spam-SWARE-Status: No, score=-0.8 required=5.0 tests=AWL, BAYES_00, KHOP_RCVD_UNTRUST, KHOP_THREADED, RCVD_IN_DNSWL_LOW, TW_FN, TW_TM, URIBL_BLACK autolearn=no version=3.3.1 Received: from service87.mimecast.com (HELO service87.mimecast.com) (91.220.42.44) by sourceware.org (qpsmtpd/0.84/v0.84-167-ge50287c) with ESMTP; Fri, 19 Apr 2013 17:16:59 +0000 Received: from cam-owa2.Emea.Arm.com (fw-tnat.cambridge.arm.com [217.140.96.21]) by service87.mimecast.com; Fri, 19 Apr 2013 18:16:56 +0100 Received: from e106375-lin.cambridge.arm.com ([10.1.255.212]) by cam-owa2.Emea.Arm.com with Microsoft SMTPSVC(6.0.3790.3959); Fri, 19 Apr 2013 18:16:56 +0100 From: James Greenhalgh To: gcc-patches@gcc.gnu.org Cc: richard.guenther@gmail.com, jason@redhat.com, jakub@redhat.com, gdr@integrable-solutions.net, mark@codesourcery.com, marcus.shawcroft@arm.com, tejas.belagod@arm.com Subject: Re: [C++11][4.9] Add missing REDUC_PLUS_EXPR case to potential_constant_expression_1. Date: Fri, 19 Apr 2013 18:15:49 +0100 Message-Id: <1366391749-1765-1-git-send-email-james.greenhalgh@arm.com> In-Reply-To: References: MIME-Version: 1.0 X-MC-Unique: 113041918165602601 X-Virus-Found: No Hi Richard, Thanks for your feedback. This does feel like a much nicer solution now. > Yes, it looks basically ok. I'd probably restrict it to folding target > builtins > though - similar to what TARGET_FOLD_BUILTIN did. Exactly to not > expose all stmts to the backends. That is, move the target hook call > to gimple_fold_call, after the inplace check (and remove the inplace > argument of the target hook), and call it only for DECL_BUILT_IN_CLASS > BUILT_IN_MD. This seems sensible - hopefully something like the attached will be closer to an acceptable implementation. The aarch64 portion certainly looks much cleaner now. > Not sure if TARGET_FOLD_STMT is then still an appropriate name ... > TARGET_FOLD_BUILTIN is already taken unfortunately. Maybe > TARGET_FOLD_BUILTIN_MD_CALL? I've gone for TARGET_GIMPLE_FOLD_BUILTIN (to fit with the non-target-specific gimple_fold_builtin). I've also updated the documentation for TARGET_FOLD_BUILTIN to make it clear that the tree returned must be valid in GENERIC and GIMPLE. Thanks again for your help. James Graduate Engineer ARM. --- gcc/ 2013-04-19 James Greenhalgh * coretypes.h (gimple_stmt_iterator_d): Forward declare. (gimple_stmt_iterator): New typedef. * gimple.h (gimple_stmt_iterator): Rename to... (gimple_stmt_iterator_d): ... This. * doc/tm.texi.in (TARGET_FOLD_BUILTIN): Detail restriction that trees be valid for GIMPLE and GENERIC. (TARGET_GIMPLE_FOLD_BUILTIN): New. * gimple-fold.c (gimple_fold_call): Call target hook gimple_fold_builtin. * hooks.c (hook_bool_gsiptr_false): New. * hooks.h (hook_bool_gsiptr_false): New. * target.def (fold_stmt): New. * doc/tm.texi: Regenerate. 2013-04-19 James Greenhalgh * config/aarch64/aarch64-builtins.c (aarch64_fold_builtin): Move folds to gimple-specific tree codes to aarch64_gimple_fold_builtin. (aarch64_gimple_fold_builtin): New. * config/aarch64/aarch64-protos.h (aarch64_gimple_fold_builtin): New. * config/aarch64/aarch64.c (TARGET_GIMPLE_FOLD_BUILTIN): Define. diff --git a/gcc/config/aarch64/aarch64-builtins.c b/gcc/config/aarch64/aarch64-builtins.c index 8361632..7a65d59 100644 --- a/gcc/config/aarch64/aarch64-builtins.c +++ b/gcc/config/aarch64/aarch64-builtins.c @@ -30,6 +30,9 @@ #include "langhooks.h" #include "diagnostic-core.h" #include "optabs.h" +#include "gimple.h" +#include "tree-ssa-propagate.h" +#include "gimple-fold.h" enum aarch64_simd_builtin_type_mode { @@ -1310,21 +1313,11 @@ aarch64_fold_builtin (tree fndecl, int n_args ATTRIBUTE_UNUSED, tree *args, { int fcode = DECL_FUNCTION_CODE (fndecl); tree type = TREE_TYPE (TREE_TYPE (fndecl)); - switch (fcode) { - BUILTIN_VALL (UNOP, reduc_splus_, 10) - return fold_build1 (REDUC_PLUS_EXPR, type, args[0]); - break; - BUILTIN_VDQIF (UNOP, reduc_smax_, 10) - return fold_build1 (REDUC_MAX_EXPR, type, args[0]); - break; - BUILTIN_VDQIF (UNOP, reduc_smin_, 10) - return fold_build1 (REDUC_MIN_EXPR, type, args[0]); - break; BUILTIN_VDQF (UNOP, abs, 2) return fold_build1 (ABS_EXPR, type, args[0]); - break; + break; BUILTIN_VDQF (BINOP, cmge, 0) BUILTIN_VDQF (BINOP, cmgt, 0) BUILTIN_VDQF (BINOP, cmeq, 0) @@ -1340,15 +1333,15 @@ aarch64_fold_builtin (tree fndecl, int n_args ATTRIBUTE_UNUSED, tree *args, { BUILTIN_VDQF (BINOP, cmge, 0) cmp = fold_build2 (GE_EXPR, type, args[0], args[1]); - break; + break; BUILTIN_VDQF (BINOP, cmgt, 0) cmp = fold_build2 (GT_EXPR, type, args[0], args[1]); - break; + break; BUILTIN_VDQF (BINOP, cmeq, 0) cmp = fold_build2 (EQ_EXPR, type, args[0], args[1]); - break; - default: - gcc_unreachable (); + break; + default: + gcc_unreachable (); } return fold_build3 (VEC_COND_EXPR, type, cmp, vect_true, vect_false); break; @@ -1357,14 +1350,70 @@ aarch64_fold_builtin (tree fndecl, int n_args ATTRIBUTE_UNUSED, tree *args, VAR1 (UNOP, floatv4si, 2, v4sf) VAR1 (UNOP, floatv2di, 2, v2df) return fold_build1 (FLOAT_EXPR, type, args[0]); - break; - default: - break; + break; + default: + break; } return NULL_TREE; } +bool +aarch64_gimple_fold_builtin (gimple_stmt_iterator *gsi) +{ + bool changed = false; + gimple stmt = gsi_stmt (*gsi); + tree call = gimple_call_fn (stmt); + tree fndecl; + gimple new_stmt = NULL; + if (call) + { + fndecl = gimple_call_fndecl (stmt); + if (fndecl) + { + int fcode = DECL_FUNCTION_CODE (fndecl); + int nargs = gimple_call_num_args (stmt); + tree *args = (nargs > 0 + ? gimple_call_arg_ptr (stmt, 0) + : &error_mark_node); + + switch (fcode) + { + BUILTIN_VALL (UNOP, reduc_splus_, 10) + new_stmt = gimple_build_assign_with_ops ( + REDUC_PLUS_EXPR, + gimple_call_lhs (stmt), + args[0], + NULL_TREE); + break; + BUILTIN_VDQIF (UNOP, reduc_smax_, 10) + new_stmt = gimple_build_assign_with_ops ( + REDUC_MAX_EXPR, + gimple_call_lhs (stmt), + args[0], + NULL_TREE); + break; + BUILTIN_VDQIF (UNOP, reduc_smin_, 10) + new_stmt = gimple_build_assign_with_ops ( + REDUC_MIN_EXPR, + gimple_call_lhs (stmt), + args[0], + NULL_TREE); + break; + default: + break; + } + } + } + + if (new_stmt) + { + gsi_replace (gsi, new_stmt, true); + changed = true; + } + return changed; +} + #undef AARCH64_CHECK_BUILTIN_MODE #undef AARCH64_FIND_FRINT_VARIANT #undef BUILTIN_DX diff --git a/gcc/config/aarch64/aarch64-protos.h b/gcc/config/aarch64/aarch64-protos.h index 2400239..4a53f32 100644 --- a/gcc/config/aarch64/aarch64-protos.h +++ b/gcc/config/aarch64/aarch64-protos.h @@ -179,6 +179,7 @@ bool aarch64_simd_mem_operand_p (rtx); rtx aarch64_simd_vect_par_cnst_half (enum machine_mode, bool); rtx aarch64_tls_get_addr (void); tree aarch64_fold_builtin (tree, int, tree *, bool); +bool aarch64_gimple_fold_builtin (gimple_stmt_iterator *); unsigned aarch64_dbx_register_number (unsigned); unsigned aarch64_trampoline_size (void); void aarch64_asm_output_labelref (FILE *, const char *); diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c index d3b349f..b9535bf 100644 --- a/gcc/config/aarch64/aarch64.c +++ b/gcc/config/aarch64/aarch64.c @@ -7859,6 +7859,9 @@ aarch64_vectorize_vec_perm_const_ok (enum machine_mode vmode, #undef TARGET_FOLD_BUILTIN #define TARGET_FOLD_BUILTIN aarch64_fold_builtin +#undef TARGET_GIMPLE_FOLD_BUILTIN +#define TARGET_GIMPLE_FOLD_BUILTIN aarch64_gimple_fold_builtin + #undef TARGET_FUNCTION_ARG #define TARGET_FUNCTION_ARG aarch64_function_arg