From patchwork Sat Apr 23 13:10:32 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kugan Vivekanandarajah X-Patchwork-Id: 614045 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 3qsXtJ0dNGz9t4k for ; Sat, 23 Apr 2016 23:11:02 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b=weZjfPrn; 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 :subject:to:references:cc:from:message-id:date:mime-version :in-reply-to:content-type; q=dns; s=default; b=HiKuCVeIFybavGPV2 P1gapK3lI1pEkB0j79xtPeQ44MkZw5cKYDX9fQDMc0pPQWeml7k3tlf557RhxTzO EI/R6XednijzYCVz+G+9i5GHbrGfh+zAl7QhEi9JLd79UGwAl0G2Y6PIWie1Ver8 /texPYGNYz55cjvDU0hb3y4qf4= 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 :subject:to:references:cc:from:message-id:date:mime-version :in-reply-to:content-type; s=default; bh=30Tz+vDsoUPo8pMCrhta3N8 DmfA=; b=weZjfPrnR8ZyXg8+HktPgKJohd+NG0kI6btdCIb0pKAtiO8/NVluRN+ oroHMy4z6h4ORgKIed5qVq2oC5IKdoeVb0GChW/Vx1h014xBh4Atdwx545KCzdTA QKeQcayBmYUwaag6kkPyz8UH1pbYOuSxsWJxg60rcgSEJYsaVFyU= Received: (qmail 98744 invoked by alias); 23 Apr 2016 13:10:55 -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 98735 invoked by uid 89); 23 Apr 2016 13:10:54 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.4 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=ham version=3.3.2 spammy=42526, unsuccessful, 2016-04-23 X-HELO: mail-pf0-f177.google.com Received: from mail-pf0-f177.google.com (HELO mail-pf0-f177.google.com) (209.85.192.177) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-GCM-SHA256 encrypted) ESMTPS; Sat, 23 Apr 2016 13:10:44 +0000 Received: by mail-pf0-f177.google.com with SMTP id y69so31013296pfb.1 for ; Sat, 23 Apr 2016 06:10:43 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:subject:to:references:cc:from:message-id:date :user-agent:mime-version:in-reply-to; bh=DZNCE/3+WnIkBw3eyBEE3FtACAUspbAug2AtCbU8akY=; b=GMM37Zg7DhAHCbqEDTF3SdOtJKS/NE/3pEUXS4LDiM7tESJimiq2NbXfENMkHpLgPn CiIeRM9toJGlr7h350k9zY5tm9ot6MsLPDOBB/KndONGhs6+p9PnOmwXObWa4t7V7p72 DC/3yvHJyRk0JyUjvLvWRQWFInm94oDr2VOBJvWkz7R8pEwdgynf6s4R2NUfR7JCPvcD mKk78nQPrrIaCCUXDFheQRaZ21cyJb94rpC+w2VXibQyCLdj+5kTRHUHK3i8kBz1jy5w 5PLzvOCO04vRsjCq1lrEsbT/g2bIP8Kbd+PEkd6u1rC4legGMqHfdMPqzF5y2sHmF71r LjIg== X-Gm-Message-State: AOPr4FV8jpMbNmubwGRM2xXBAVdTvFmp13611ZJw/EOK0u2k54NYIMR9T5c7axSpKDdJvc1g X-Received: by 10.98.4.67 with SMTP id 64mr35800769pfe.126.1461417042046; Sat, 23 Apr 2016 06:10:42 -0700 (PDT) Received: from [10.1.1.7] (58-6-183-210.dyn.iinet.net.au. [58.6.183.210]) by smtp.googlemail.com with ESMTPSA id t14sm4758364pfj.12.2016.04.23.06.10.39 (version=TLSv1/SSLv3 cipher=OTHER); Sat, 23 Apr 2016 06:10:41 -0700 (PDT) Subject: Re: [RFC][PATCH][PR40921] Convert x + (-y * z * z) into x - y * z * z To: Richard Biener References: <56CFC02F.2070801@linaro.org> <56D42341.5090607@linaro.org> <5718B5B1.8030809@linaro.org> Cc: "gcc-patches@gcc.gnu.org" From: kugan Message-ID: <571B7448.4080005@linaro.org> Date: Sat, 23 Apr 2016 23:10:32 +1000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.5.1 MIME-Version: 1.0 In-Reply-To: X-IsSubscribed: yes >> I am not sure I understand this. I tried doing this. If I add -1 and rhs1 >> for the NEGATE_EXPR to ops list, when it come to rewrite_expr_tree constant >> will be sorted early and would make it hard to generate: >> x + (-y * z * z) => x - y * z * z >> >> Do you want to swap the constant in MULT_EXPR chain (if present) like in >> swap_ops_for_binary_stmt and then create a NEGATE_EXPR ? > > In addition to linearize_expr handling you need to handle a -1 in the MULT_EXPR > chain specially at rewrite_expr_tree time by emitting a NEGATE_EXPR instead > of a MULT_EXPR (which also means you should sort the -1 "last"). Hi Richard, Thanks. Here is an attempt which does this. Regression tested and bootstrapped on x86-64-linux-gnu with no new regressions. Is this OK for trunk? Thanks, Kugan 2016-04-23 Kugan Vivekanandarajah PR middle-end/40921 * gcc.dg/tree-ssa/pr40921.c: New test. gcc/ChangeLog: 2016-04-23 Kugan Vivekanandarajah PR middle-end/40921 * tree-ssa-reassoc.c (try_special_add_to_ops): New. (linearize_expr_tree): Call try_special_add_to_ops. (reassociate_bb): Convert MULT_EXPR by (-1) to NEGATE_EXPR. diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr40921.c b/gcc/testsuite/gcc.dg/tree-ssa/pr40921.c index e69de29..f587a8f 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/pr40921.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr40921.c @@ -0,0 +1,20 @@ + +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-optimized -ffast-math" } */ + +unsigned int foo (unsigned int x, unsigned int y, unsigned int z) +{ + return x + (-y * z*z); +} + +float bar (float x, float y, float z) +{ + return x + (-y * z*z); +} + +float bar (float x, float y, float z) +{ + return x + (-y * z*z * 5.0); +} + +/* { dg-final { scan-tree-dump-times "_* = -y_" 0 "optimized" } } */ diff --git a/gcc/tree-ssa-reassoc.c b/gcc/tree-ssa-reassoc.c index d23dabd..1b38207 100644 --- a/gcc/tree-ssa-reassoc.c +++ b/gcc/tree-ssa-reassoc.c @@ -4252,6 +4252,45 @@ acceptable_pow_call (gimple *stmt, tree *base, HOST_WIDE_INT *exponent) return true; } +/* Try to derive and add operand entry for OP to *OPS. Return false if + unsuccessful. */ + +static bool +try_special_add_to_ops (vec *ops, + enum tree_code code, + tree op, gimple* def_stmt) +{ + tree base = NULL_TREE; + HOST_WIDE_INT exponent = 0; + + if (TREE_CODE (op) != SSA_NAME) + return false; + + if (code == MULT_EXPR + && acceptable_pow_call (def_stmt, &base, &exponent)) + { + add_repeat_to_ops_vec (ops, base, exponent); + gimple_set_visited (def_stmt, true); + return true; + } + else if (code == MULT_EXPR + && is_gimple_assign (def_stmt) + && gimple_assign_rhs_code (def_stmt) == NEGATE_EXPR + && !HONOR_SNANS (TREE_TYPE (op)) + && (!HONOR_SIGNED_ZEROS (TREE_TYPE (op)) + || !COMPLEX_FLOAT_TYPE_P (TREE_TYPE (op)))) + { + tree rhs1 = gimple_assign_rhs1 (def_stmt); + tree cst = build_minus_one_cst (TREE_TYPE (op)); + add_to_ops_vec (ops, rhs1); + add_to_ops_vec (ops, cst); + gimple_set_visited (def_stmt, true); + return true; + } + + return false; +} + /* Recursively linearize a binary expression that is the RHS of STMT. Place the operands of the expression tree in the vector named OPS. */ @@ -4266,8 +4305,6 @@ linearize_expr_tree (vec *ops, gimple *stmt, bool binrhsisreassoc = false; enum tree_code rhscode = gimple_assign_rhs_code (stmt); struct loop *loop = loop_containing_stmt (stmt); - tree base = NULL_TREE; - HOST_WIDE_INT exponent = 0; if (set_visited) gimple_set_visited (stmt, true); @@ -4303,26 +4340,11 @@ linearize_expr_tree (vec *ops, gimple *stmt, if (!binrhsisreassoc) { - if (rhscode == MULT_EXPR - && TREE_CODE (binrhs) == SSA_NAME - && acceptable_pow_call (binrhsdef, &base, &exponent)) - { - add_repeat_to_ops_vec (ops, base, exponent); - gimple_set_visited (binrhsdef, true); - } - else + if (!try_special_add_to_ops (ops, rhscode, binrhs, binrhsdef)) add_to_ops_vec (ops, binrhs); - if (rhscode == MULT_EXPR - && TREE_CODE (binlhs) == SSA_NAME - && acceptable_pow_call (binlhsdef, &base, &exponent)) - { - add_repeat_to_ops_vec (ops, base, exponent); - gimple_set_visited (binlhsdef, true); - } - else + if (!try_special_add_to_ops (ops, rhscode, binlhs, binlhsdef)) add_to_ops_vec (ops, binlhs); - return; } @@ -4360,14 +4382,7 @@ linearize_expr_tree (vec *ops, gimple *stmt, linearize_expr_tree (ops, SSA_NAME_DEF_STMT (binlhs), is_associative, set_visited); - if (rhscode == MULT_EXPR - && TREE_CODE (binrhs) == SSA_NAME - && acceptable_pow_call (SSA_NAME_DEF_STMT (binrhs), &base, &exponent)) - { - add_repeat_to_ops_vec (ops, base, exponent); - gimple_set_visited (SSA_NAME_DEF_STMT (binrhs), true); - } - else + if (!try_special_add_to_ops (ops, rhscode, binrhs, binrhsdef)) add_to_ops_vec (ops, binrhs); } @@ -5127,6 +5142,19 @@ reassociate_bb (basic_block bb) powi_result = attempt_builtin_powi (stmt, &ops); } + int last = ops.length () - 1; + bool negate_result = false; + if (rhs_code == MULT_EXPR + && ops.length () > 1 + && ((TREE_CODE (ops[last]->op) == INTEGER_CST + && integer_minus_onep (ops[last]->op)) + || ((TREE_CODE (ops[last]->op) == REAL_CST) + && real_equal (&TREE_REAL_CST (ops[last]->op), &dconstm1)))) + { + ops.unordered_remove (last); + negate_result = true; + } + /* If the operand vector is now empty, all operands were consumed by the __builtin_powi optimization. */ if (ops.length () == 0) @@ -5169,6 +5197,17 @@ reassociate_bb (basic_block bb) powi_result != NULL); } + if (negate_result) + { + tree tmp = make_ssa_name (TREE_TYPE (lhs)); + gimple_set_lhs (stmt, tmp); + gassign *neg_stmt = gimple_build_assign (lhs, NEGATE_EXPR, + tmp); + gimple_stmt_iterator gsi = gsi_for_stmt (stmt); + gsi_insert_after (&gsi, neg_stmt, GSI_NEW_STMT); + update_stmt (stmt); + } + /* If we combined some repeated factors into a __builtin_powi call, multiply that result by the reassociated operands. */