From patchwork Tue Nov 19 02:09:33 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bin Cheng X-Patchwork-Id: 292239 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)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 00F9D2C00C2 for ; Tue, 19 Nov 2013 13:10:13 +1100 (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:references:in-reply-to:subject:date:message-id :mime-version:content-type; q=dns; s=default; b=btQsAKM2HKOJ33kE bAvPyI7GJRI3bR7xkigG96jGDb2Gh76EKHH7MMTlvSA/tzwa/+Xq8OrwMZDNngeD zuneQW7zPe/s5DRYpjpJUEqdw2clBLNG5baHra/5IjPthUix5WsAz2/KNJxyxgxE mJY9bROpauRbAatYANY8k9I7NXg= 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:references:in-reply-to:subject:date:message-id :mime-version:content-type; s=default; bh=1DTSbr102fMHpOUcB9kJsC +tv4o=; b=CgeebPHOiC1vZDoEDstvMVc34plbJQsUpn6JpMPiFqXAkxfcXkexCH RqUGUsXbmUa7dv1i1J0byexwzQ7A//aeVhK2gqb0z2V2ySsxKA4qtuL8PZ0Y7oiz HIZ0Ufc6/AoLnv//BbLwyeGwon5GD4JIM1L8bK2iYn0KKUETe8WkU= Received: (qmail 2333 invoked by alias); 19 Nov 2013 02:10: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 2296 invoked by uid 89); 19 Nov 2013 02:10:00 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-0.1 required=5.0 tests=AWL, BAYES_50, RDNS_NONE, SPF_PASS, URIBL_BLOCKED autolearn=no version=3.3.2 X-HELO: service87.mimecast.com Received: from Unknown (HELO service87.mimecast.com) (91.220.42.44) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 19 Nov 2013 02:09:55 +0000 Received: from cam-owa1.Emea.Arm.com (fw-tnat.cambridge.arm.com [217.140.96.21]) by service87.mimecast.com; Tue, 19 Nov 2013 02:09:46 +0000 Received: from SHAWIN162 ([10.1.255.212]) by cam-owa1.Emea.Arm.com with Microsoft SMTPSVC(6.0.3790.3959); Tue, 19 Nov 2013 02:09:44 +0000 From: "bin.cheng" To: "'Bernd Schmidt'" , "Richard Biener" Cc: References: <001001ced90e$4ecd9af0$ec68d0d0$@arm.com> <528A0269.7070503@codesourcery.com> In-Reply-To: <528A0269.7070503@codesourcery.com> Subject: RE: [PATCH GCC]Compute, cache and use cost of auto-increment rtx patterns in IVOPT Date: Tue, 19 Nov 2013 10:09:33 +0800 Message-ID: <002701cee4cc$64d90a90$2e8b1fb0$@arm.com> MIME-Version: 1.0 X-MC-Unique: 113111902094601401 X-IsSubscribed: yes > -----Original Message----- > From: Bernd Schmidt [mailto:bernds@codesourcery.com] > Sent: Monday, November 18, 2013 8:05 PM > To: Bin Cheng > Cc: gcc-patches@gcc.gnu.org > Subject: Re: [PATCH GCC]Compute, cache and use cost of auto-increment rtx > patterns in IVOPT > > On 11/04/2013 04:31 AM, bin.cheng wrote: > > 2013-11-01 Bin Cheng > > > > * tree-ssa-loop-ivopts.c (enum ainc_type): New. > > (address_cost_data): New field. > > (get_address_cost): Compute auto-increment rtx cost in ainc_costs. > > Use ainc_costs for auto-increment rtx patterns. > > Cleanup TWS. > > I think this is fine. I'd just like to see AINC_NUM gone and its use replaced by > AIC_NONE, we don't really need two separate enum codes for that. > Thanks for reviewing, I updated patch as suggested. Hi Richard, is this patch ok for you too? Thanks, bin Index: gcc/tree-ssa-loop-ivopts.c =================================================================== --- gcc/tree-ssa-loop-ivopts.c (revision 204996) +++ gcc/tree-ssa-loop-ivopts.c (working copy) @@ -3207,10 +3207,20 @@ multiplier_allowed_in_address_p (HOST_WIDE_INT rat TODO -- there must be some better way. This all is quite crude. */ +enum ainc_type +{ + AINC_PRE_INC, /* Pre increment. */ + AINC_PRE_DEC, /* Pre decrement. */ + AINC_POST_INC, /* Post increment. */ + AINC_POST_DEC, /* Post decrement. */ + AINC_NONE /* Also the number of auto increment types. */ +}; + typedef struct address_cost_data_s { HOST_WIDE_INT min_offset, max_offset; unsigned costs[2][2][2][2]; + unsigned ainc_costs[AINC_NONE]; } *address_cost_data; @@ -3228,6 +3238,7 @@ get_address_cost (bool symbol_present, bool var_pr static bool has_preinc[MAX_MACHINE_MODE], has_postinc[MAX_MACHINE_MODE]; static bool has_predec[MAX_MACHINE_MODE], has_postdec[MAX_MACHINE_MODE]; unsigned cost, acost, complexity; + enum ainc_type autoinc_type; bool offset_p, ratio_p, autoinc; HOST_WIDE_INT s_offset, autoinc_offset, msize; unsigned HOST_WIDE_INT mask; @@ -3299,33 +3310,49 @@ get_address_cost (bool symbol_present, bool var_pr reg0 = gen_raw_REG (address_mode, LAST_VIRTUAL_REGISTER + 1); reg1 = gen_raw_REG (address_mode, LAST_VIRTUAL_REGISTER + 2); - if (USE_LOAD_PRE_DECREMENT (mem_mode) + if (USE_LOAD_PRE_DECREMENT (mem_mode) || USE_STORE_PRE_DECREMENT (mem_mode)) { addr = gen_rtx_PRE_DEC (address_mode, reg0); has_predec[mem_mode] = memory_address_addr_space_p (mem_mode, addr, as); + + if (has_predec[mem_mode]) + data->ainc_costs[AINC_PRE_DEC] + = address_cost (addr, mem_mode, as, speed); } - if (USE_LOAD_POST_DECREMENT (mem_mode) + if (USE_LOAD_POST_DECREMENT (mem_mode) || USE_STORE_POST_DECREMENT (mem_mode)) { addr = gen_rtx_POST_DEC (address_mode, reg0); has_postdec[mem_mode] = memory_address_addr_space_p (mem_mode, addr, as); + + if (has_postdec[mem_mode]) + data->ainc_costs[AINC_POST_DEC] + = address_cost (addr, mem_mode, as, speed); } - if (USE_LOAD_PRE_INCREMENT (mem_mode) + if (USE_LOAD_PRE_INCREMENT (mem_mode) || USE_STORE_PRE_DECREMENT (mem_mode)) { addr = gen_rtx_PRE_INC (address_mode, reg0); has_preinc[mem_mode] = memory_address_addr_space_p (mem_mode, addr, as); + + if (has_preinc[mem_mode]) + data->ainc_costs[AINC_PRE_INC] + = address_cost (addr, mem_mode, as, speed); } - if (USE_LOAD_POST_INCREMENT (mem_mode) + if (USE_LOAD_POST_INCREMENT (mem_mode) || USE_STORE_POST_INCREMENT (mem_mode)) { addr = gen_rtx_POST_INC (address_mode, reg0); has_postinc[mem_mode] = memory_address_addr_space_p (mem_mode, addr, as); + + if (has_postinc[mem_mode]) + data->ainc_costs[AINC_POST_INC] + = address_cost (addr, mem_mode, as, speed); } for (i = 0; i < 16; i++) { @@ -3451,22 +3478,32 @@ get_address_cost (bool symbol_present, bool var_pr s_offset = offset; autoinc = false; + autoinc_type = AINC_NONE; msize = GET_MODE_SIZE (mem_mode); autoinc_offset = offset; if (stmt_after_inc) autoinc_offset += ratio * cstep; if (symbol_present || var_present || ratio != 1) autoinc = false; - else if ((has_postinc[mem_mode] && autoinc_offset == 0 + else + { + if (has_postinc[mem_mode] && autoinc_offset == 0 + && msize == cstep) + autoinc_type = AINC_POST_INC; + else if (has_postdec[mem_mode] && autoinc_offset == 0 + && msize == -cstep) + autoinc_type = AINC_POST_DEC; + else if (has_preinc[mem_mode] && autoinc_offset == msize && msize == cstep) - || (has_postdec[mem_mode] && autoinc_offset == 0 + autoinc_type = AINC_PRE_INC; + else if (has_predec[mem_mode] && autoinc_offset == -msize && msize == -cstep) - || (has_preinc[mem_mode] && autoinc_offset == msize - && msize == cstep) - || (has_predec[mem_mode] && autoinc_offset == -msize - && msize == -cstep)) - autoinc = true; + autoinc_type = AINC_PRE_DEC; + if (autoinc_type != AINC_NONE) + autoinc = true; + } + cost = 0; offset_p = (s_offset != 0 && data->min_offset <= s_offset @@ -3482,7 +3519,10 @@ get_address_cost (bool symbol_present, bool var_pr if (may_autoinc) *may_autoinc = autoinc; - acost = data->costs[symbol_present][var_present][offset_p][ratio_p]; + if (autoinc) + acost = data->ainc_costs[autoinc_type]; + else + acost = data->costs[symbol_present][var_present][offset_p][ratio_p]; complexity = (symbol_present != 0) + (var_present != 0) + offset_p + ratio_p; return new_cost (cost + acost, complexity); }