From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 15957 invoked by alias); 20 May 2011 09:21:36 -0000 Received: (qmail 15931 invoked by uid 22791); 20 May 2011 09:21:35 -0000 X-SWARE-Spam-Status: No, hits=-1.5 required=5.0 tests=AWL,BAYES_00,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mail.codesourcery.com (HELO mail.codesourcery.com) (38.113.113.100) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 20 May 2011 09:21:16 +0000 Received: (qmail 29937 invoked from network); 20 May 2011 09:21:15 -0000 Received: from unknown (HELO ?192.168.1.68?) (vries@127.0.0.2) by mail.codesourcery.com with ESMTPA; 20 May 2011 09:21:15 -0000 Message-ID: <4DD6323B.6030308@codesourcery.com> Date: Fri, 20 May 2011 11:32:00 -0000 From: Tom de Vries User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.17) Gecko/20110424 Lightning/1.0b2 Thunderbird/3.1.10 MIME-Version: 1.0 To: Zdenek Dvorak CC: gcc-patches@gcc.gnu.org Subject: Re: [PATCH PR45098, 9/10] Cheap shift-add. References: <4DD21F6E.4050308@codesourcery.com> <4DD221FC.7060303@codesourcery.com> <4DD4006E.406@codesourcery.com> <20110518212018.GA28543@kam.mff.cuni.cz> In-Reply-To: <20110518212018.GA28543@kam.mff.cuni.cz> Content-Type: multipart/mixed; boundary="------------030806060308060200070600" Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org X-SW-Source: 2011-05/txt/msg01436.txt.bz2 This is a multi-part message in MIME format. --------------030806060308060200070600 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Content-length: 809 Hi, On 05/18/2011 11:20 PM, Zdenek Dvorak wrote: >> + sa_cost = (TREE_CODE (expr) != MINUS_EXPR >> + ? shiftadd_cost[speed][mode][m] >> + : (mult == op1 >> + ? shiftsub1_cost[speed][mode][m] >> + : shiftsub0_cost[speed][mode][m])); >> + res = new_cost (sa_cost, 0); >> + res = add_costs (res, mult == op1 ? cost0 : cost1); > > just forgetting the cost of the other operand does not seem correct -- what > if it contains some more complicated subexpression? > True. I now added the cost of TREE_OPERAND (mult, 0). Thanks, - Tom 2011-05-05 Tom de Vries PR target/45098 * tree-ssa-loop-ivopts.c: Include expmed.h. (get_shiftadd_cost): New function. (force_expr_to_var_cost): Declare forward. Use get_shiftadd_cost. --------------030806060308060200070600 Content-Type: text/x-patch; name="09_pr45098-shift-add-cost.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="09_pr45098-shift-add-cost.patch" Content-length: 3012 Index: gcc/tree-ssa-loop-ivopts.c =================================================================== --- gcc/tree-ssa-loop-ivopts.c (revision 173380) +++ gcc/tree-ssa-loop-ivopts.c (working copy) @@ -92,6 +92,12 @@ along with GCC; see the file COPYING3. #include "tree-inline.h" #include "tree-ssa-propagate.h" +/* FIXME: add_cost and zero_cost defined in exprmed.h conflict with local uses. + */ +#include "expmed.h" +#undef add_cost +#undef zero_cost + /* FIXME: Expressions are expanded to RTL in this pass to determine the cost of different addressing modes. This should be moved to a TBD interface between the GIMPLE and RTL worlds. */ @@ -377,6 +383,8 @@ struct iv_ca_delta static VEC(tree,heap) *decl_rtl_to_reset; +static comp_cost force_expr_to_var_cost (tree, bool); + /* Number of uses recorded in DATA. */ static inline unsigned @@ -3504,6 +3512,42 @@ get_address_cost (bool symbol_present, b return new_cost (cost + acost, complexity); } + /* Calculate the SPEED or size cost of shiftadd EXPR in MODE. MULT is the + the EXPR operand holding the shift. COST0 and COST1 are the costs for + calculating the operands of EXPR. Returns true if successful, and returns + the cost in COST. */ + +static bool +get_shiftadd_cost (tree expr, enum machine_mode mode, comp_cost cost0, + comp_cost cost1, tree mult, bool speed, comp_cost *cost) +{ + comp_cost res; + tree op1 = TREE_OPERAND (expr, 1); + tree cst = TREE_OPERAND (mult, 1); + tree multop = TREE_OPERAND (mult, 0); + int m = exact_log2 (int_cst_value (cst)); + int maxm = MIN (BITS_PER_WORD, GET_MODE_BITSIZE (mode)); + int sa_cost; + + if (!(m >= 0 && m < maxm)) + return false; + + sa_cost = (TREE_CODE (expr) != MINUS_EXPR + ? shiftadd_cost[speed][mode][m] + : (mult == op1 + ? shiftsub1_cost[speed][mode][m] + : shiftsub0_cost[speed][mode][m])); + res = new_cost (sa_cost, 0); + res = add_costs (res, mult == op1 ? cost0 : cost1); + + STRIP_NOPS (multop); + if (!is_gimple_val (multop)) + res = add_costs (res, force_expr_to_var_cost (multop, speed)); + + *cost = res; + return true; +} + /* Estimates cost of forcing expression EXPR into a variable. */ static comp_cost @@ -3629,6 +3673,21 @@ force_expr_to_var_cost (tree expr, bool case MINUS_EXPR: case NEGATE_EXPR: cost = new_cost (add_cost (mode, speed), 0); + if (TREE_CODE (expr) != NEGATE_EXPR) + { + tree mult = NULL_TREE; + comp_cost sa_cost; + if (TREE_CODE (op1) == MULT_EXPR) + mult = op1; + else if (TREE_CODE (op0) == MULT_EXPR) + mult = op0; + + if (mult != NULL_TREE + && TREE_CODE (TREE_OPERAND (mult, 1)) == INTEGER_CST + && get_shiftadd_cost (expr, mode, cost0, cost1, mult, speed, + &sa_cost)) + return sa_cost; + } break; case MULT_EXPR: --------------030806060308060200070600--