From patchwork Mon Oct 9 19:35:06 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Segher Boessenkool X-Patchwork-Id: 823445 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=gcc.gnu.org (client-ip=209.132.180.131; helo=sourceware.org; envelope-from=gcc-patches-return-463804-incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b="rVkO76Of"; dkim-atps=neutral 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 3y9r7J0Mtsz9t4b for ; Tue, 10 Oct 2017 06:35:23 +1100 (AEDT) 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; q=dns; s=default; b=jP617LfIGEVW UDm0/eMyeSb6SHd90+vpsl9fqOIrrvVz6gDZDOzDafpPMrI4lFibC0t0R8YZDC08 iU3SuVtlagf1+glNvXZIbfVMIS3wWlrewEHe/yKZ3gG6elk3c7i1Y4yzsv3R3Z+7 sC5Sfqwrx7LuL8mpoYMgCqwmHZ6aaLU= 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; s=default; bh=ROuvF29I4wBPPI5I9M +XaAdWa04=; b=rVkO76OfsHcz3/b4BRgq5uqwh+leXrswxi4teurDZR4FeR1nX+ SxxH4FE19PwDIIUU27LMrkz8E78/IQbiG0dDVqUTInjKIp/rSWWcVSGrByw0EzU/ vTM0yRWaZz7IHVB987T0C3EJ8F1wosjmWsMoxlYaBndOjdCDikjVolEJ8= Received: (qmail 63360 invoked by alias); 9 Oct 2017 19:35:14 -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 63342 invoked by uid 89); 9 Oct 2017 19:35:13 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-24.1 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_LAZY_DOMAIN_SECURITY, RP_MATCHES_RCVD autolearn=ham version=3.3.2 spammy= X-HELO: gcc1-power7.osuosl.org Received: from gcc1-power7.osuosl.org (HELO gcc1-power7.osuosl.org) (140.211.15.137) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 09 Oct 2017 19:35:11 +0000 Received: by gcc1-power7.osuosl.org (Postfix, from userid 10019) id 277C812402CA; Mon, 9 Oct 2017 19:35:10 +0000 (UTC) From: Segher Boessenkool To: gcc-patches@gcc.gnu.org Cc: law@redhat.com, Segher Boessenkool Subject: [PATCH 1/3] Replace insn_rtx_cost with insn_cost and pattern_cost Date: Mon, 9 Oct 2017 19:35:06 +0000 Message-Id: X-IsSubscribed: yes This replaces insn_rtx_cost with insn_cost if an insn is readily available, and with pattern_cost otherwise. Okayed by Jeff in https://gcc.gnu.org/ml/gcc-patches/2017-08/msg00203.html and I'll commit it now. Segher 2017-10-09 Segher Boessenkool * cfgrtl.c (rtl_account_profile_record): Replace insn_rtx_cost with insn_cost. * combine.c (uid_insn_cost): Adjust comment. (combine_validate_cost): Adjust comment. Use pattern_cost instead of insn_rtx_cost (combine_instructions): Use insn_cost instead of insn_rtx_cost. * dse.c (find_shift_sequence): Ditto. * ifcvt.c (cheap_bb_rtx_cost_p): Ditto. (bb_valid_for_noce_process_p): Use pattern_cost. * rtl.h (insn_rtx_cost): Delete. (pattern_cost): New prototype. (insn_cost): New prototype. * rtlanal.c (insn_rtx_cost): Rename to... (pattern_cost): ... this. (insn_cost): New. --- gcc/cfgrtl.c | 7 +++---- gcc/combine.c | 17 ++++++++--------- gcc/dse.c | 2 +- gcc/ifcvt.c | 12 ++++++------ gcc/rtl.h | 3 ++- gcc/rtlanal.c | 13 +++++++++++-- 6 files changed, 31 insertions(+), 23 deletions(-) diff --git a/gcc/cfgrtl.c b/gcc/cfgrtl.c index 6ef47b7..739d1bb 100644 --- a/gcc/cfgrtl.c +++ b/gcc/cfgrtl.c @@ -5039,14 +5039,13 @@ rtl_account_profile_record (basic_block bb, int after_pass, FOR_BB_INSNS (bb, insn) if (INSN_P (insn)) { - record->size[after_pass] - += insn_rtx_cost (PATTERN (insn), false); + record->size[after_pass] += insn_cost (insn, false); if (bb->count.initialized_p ()) record->time[after_pass] - += insn_rtx_cost (PATTERN (insn), true) * bb->count.to_gcov_type (); + += insn_cost (insn, true) * bb->count.to_gcov_type (); else if (profile_status_for_fn (cfun) == PROFILE_GUESSED) record->time[after_pass] - += insn_rtx_cost (PATTERN (insn), true) * bb->frequency; + += insn_cost (insn, true) * bb->frequency; } } diff --git a/gcc/combine.c b/gcc/combine.c index 3b98ff4..c5f6a00 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -311,7 +311,7 @@ static bool optimize_this_for_speed_p; static int max_uid_known; -/* The following array records the insn_rtx_cost for every insn +/* The following array records the insn_cost for every insn in the instruction stream. */ static int *uid_insn_cost; @@ -841,7 +841,7 @@ do_SUBST_LINK (struct insn_link **into, struct insn_link *newval) #define SUBST_LINK(oldval, newval) do_SUBST_LINK (&oldval, newval) /* Subroutine of try_combine. Determine whether the replacement patterns - NEWPAT, NEWI2PAT and NEWOTHERPAT are cheaper according to insn_rtx_cost + NEWPAT, NEWI2PAT and NEWOTHERPAT are cheaper according to insn_cost than the original sequence I0, I1, I2, I3 and undobuf.other_insn. Note that I0, I1 and/or NEWI2PAT may be NULL_RTX. Similarly, NEWOTHERPAT and undobuf.other_insn may also both be NULL_RTX. Return false if the cost @@ -888,11 +888,11 @@ combine_validate_cost (rtx_insn *i0, rtx_insn *i1, rtx_insn *i2, rtx_insn *i3, old_cost -= i1_cost; - /* Calculate the replacement insn_rtx_costs. */ - new_i3_cost = insn_rtx_cost (newpat, optimize_this_for_speed_p); + /* Calculate the replacement pattern_costs. */ + new_i3_cost = pattern_cost (newpat, optimize_this_for_speed_p); if (newi2pat) { - new_i2_cost = insn_rtx_cost (newi2pat, optimize_this_for_speed_p); + new_i2_cost = pattern_cost (newi2pat, optimize_this_for_speed_p); new_cost = (new_i2_cost > 0 && new_i3_cost > 0) ? new_i2_cost + new_i3_cost : 0; } @@ -907,7 +907,7 @@ combine_validate_cost (rtx_insn *i0, rtx_insn *i1, rtx_insn *i2, rtx_insn *i3, int old_other_cost, new_other_cost; old_other_cost = INSN_COST (undobuf.other_insn); - new_other_cost = insn_rtx_cost (newotherpat, optimize_this_for_speed_p); + new_other_cost = pattern_cost (newotherpat, optimize_this_for_speed_p); if (old_other_cost > 0 && new_other_cost > 0) { old_cost += old_other_cost; @@ -1208,10 +1208,9 @@ combine_instructions (rtx_insn *f, unsigned int nregs) set_nonzero_bits_and_sign_copies (XEXP (links, 0), NULL_RTX, insn); - /* Record the current insn_rtx_cost of this instruction. */ + /* Record the current insn_cost of this instruction. */ if (NONJUMP_INSN_P (insn)) - INSN_COST (insn) = insn_rtx_cost (PATTERN (insn), - optimize_this_for_speed_p); + INSN_COST (insn) = insn_cost (insn, optimize_this_for_speed_p); if (dump_file) { fprintf (dump_file, "insn_cost %d for ", INSN_COST (insn)); diff --git a/gcc/dse.c b/gcc/dse.c index cff3ac4..563ca9f 100644 --- a/gcc/dse.c +++ b/gcc/dse.c @@ -1653,7 +1653,7 @@ find_shift_sequence (int access_size, cost = 0; for (insn = shift_seq; insn != NULL_RTX; insn = NEXT_INSN (insn)) if (INSN_P (insn)) - cost += insn_rtx_cost (PATTERN (insn), speed); + cost += insn_cost (insn, speed); /* The computation up to here is essentially independent of the arguments and could be precomputed. It may diff --git a/gcc/ifcvt.c b/gcc/ifcvt.c index e1b163c..278d5b24 100644 --- a/gcc/ifcvt.c +++ b/gcc/ifcvt.c @@ -121,7 +121,7 @@ count_bb_insns (const_basic_block bb) return count; } -/* Determine whether the total insn_rtx_cost on non-jump insns in +/* Determine whether the total insn_cost on non-jump insns in basic block BB is less than MAX_COST. This function returns false if the cost of any instruction could not be estimated. @@ -140,7 +140,7 @@ cheap_bb_rtx_cost_p (const_basic_block bb, : REG_BR_PROB_BASE; /* Set scale to REG_BR_PROB_BASE to void the identical scaling - applied to insn_rtx_cost when optimizing for size. Only do + applied to insn_cost when optimizing for size. Only do this after combine because if-conversion might interfere with passes before combine. @@ -163,7 +163,7 @@ cheap_bb_rtx_cost_p (const_basic_block bb, { if (NONJUMP_INSN_P (insn)) { - int cost = insn_rtx_cost (PATTERN (insn), speed) * REG_BR_PROB_BASE; + int cost = insn_cost (insn, speed) * REG_BR_PROB_BASE; if (cost == 0) return false; @@ -3021,7 +3021,7 @@ bb_valid_for_noce_process_p (basic_block test_bb, rtx cond, if (first_insn == last_insn) { *simple_p = noce_operand_ok (SET_DEST (first_set)); - *cost += insn_rtx_cost (first_set, speed_p); + *cost += pattern_cost (first_set, speed_p); return *simple_p; } @@ -3037,7 +3037,7 @@ bb_valid_for_noce_process_p (basic_block test_bb, rtx cond, /* The regs that are live out of test_bb. */ bitmap test_bb_live_out = df_get_live_out (test_bb); - int potential_cost = insn_rtx_cost (last_set, speed_p); + int potential_cost = pattern_cost (last_set, speed_p); rtx_insn *insn; FOR_BB_INSNS (test_bb, insn) { @@ -3057,7 +3057,7 @@ bb_valid_for_noce_process_p (basic_block test_bb, rtx cond, || reg_overlap_mentioned_p (SET_DEST (sset), cond)) goto free_bitmap_and_fail; - potential_cost += insn_rtx_cost (sset, speed_p); + potential_cost += pattern_cost (sset, speed_p); bitmap_set_bit (test_bb_temps, REGNO (SET_DEST (sset))); } } diff --git a/gcc/rtl.h b/gcc/rtl.h index a63f33e..f854550 100644 --- a/gcc/rtl.h +++ b/gcc/rtl.h @@ -3203,7 +3203,8 @@ extern int loc_mentioned_in_p (rtx *, const_rtx); extern rtx_insn *find_first_parameter_load (rtx_insn *, rtx_insn *); extern bool keep_with_call_p (const rtx_insn *); extern bool label_is_jump_target_p (const_rtx, const rtx_insn *); -extern int insn_rtx_cost (rtx, bool); +extern int pattern_cost (rtx, bool); +extern int insn_cost (rtx_insn *, bool); extern unsigned seq_cost (const rtx_insn *, bool); /* Given an insn and condition, return a canonical description of diff --git a/gcc/rtlanal.c b/gcc/rtlanal.c index b28325e..f01eab5 100644 --- a/gcc/rtlanal.c +++ b/gcc/rtlanal.c @@ -5269,11 +5269,11 @@ num_sign_bit_copies1 (const_rtx x, scalar_int_mode mode, const_rtx known_x, ? 1 : bitwidth - floor_log2 (nonzero) - 1; } -/* Calculate the rtx_cost of a single instruction. A return value of +/* Calculate the rtx_cost of a single instruction pattern. A return value of zero indicates an instruction pattern without a known cost. */ int -insn_rtx_cost (rtx pat, bool speed) +pattern_cost (rtx pat, bool speed) { int i, cost; rtx set; @@ -5323,6 +5323,15 @@ insn_rtx_cost (rtx pat, bool speed) return cost > 0 ? cost : COSTS_N_INSNS (1); } +/* Calculate the cost of a single instruction. A return value of zero + indicates an instruction pattern without a known cost. */ + +int +insn_cost (rtx_insn *insn, bool speed) +{ + return pattern_cost (PATTERN (insn), speed); +} + /* Returns estimate on cost of computing SEQ. */ unsigned