From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 3790 invoked by alias); 26 Sep 2011 22:30:36 -0000 Received: (qmail 3776 invoked by uid 22791); 26 Sep 2011 22:30:34 -0000 X-SWARE-Spam-Status: No, hits=-7.0 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_HI,RP_MATCHES_RCVD,SPF_HELO_PASS,TW_CF,TW_FC X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 26 Sep 2011 22:30:14 +0000 Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id p8QMUDqC000936 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 26 Sep 2011 18:30:13 -0400 Received: from ns3.rdu.redhat.com (ns3.rdu.redhat.com [10.11.255.199]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id p8QMUCuL020775; Mon, 26 Sep 2011 18:30:13 -0400 Received: from [10.3.113.60] (ovpn-113-60.phx2.redhat.com [10.3.113.60]) by ns3.rdu.redhat.com (8.13.8/8.13.8) with ESMTP id p8QMU7VY027328; Mon, 26 Sep 2011 18:30:11 -0400 Message-ID: <4E80FCEE.2030304@redhat.com> Date: Tue, 27 Sep 2011 00:11:00 -0000 From: Jeff Law User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:6.0.2) Gecko/20110906 Thunderbird/6.0.2 MIME-Version: 1.0 To: Richard Henderson CC: Richard Guenther , gcc-patches Subject: Re: RFA: Avoiding unprofitable speculation References: <4E4ADDAC.4090006@redhat.com> <4E4D8B54.1050409@redhat.com> In-Reply-To: <4E4D8B54.1050409@redhat.com> Content-Type: multipart/mixed; boundary="------------040905070206040506010304" X-IsSubscribed: yes 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-09/txt/msg01657.txt.bz2 This is a multi-part message in MIME format. --------------040905070206040506010304 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Content-length: 1294 -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 On 08/18/11 15:59, Richard Henderson wrote: > On 08/17/2011 12:21 AM, Richard Guenther wrote: >> The patch itself looks sensible, though I am surprised ifcvt >> doesn't run in cfglayout mode (so you have to use reg notes to >> find probabilities ...) > > It does run in cfglayout mode. > > Jeff, I believe you're supposed to get the probabilities from some > combination of > > bb->frequency edge->probability EDGE_FREQUENCY(edge) OK. Here's the revised patch. There's other places in ifcvt.c that utilize the notes that I didn't modify. Bootstrapped & regression tested x86_64-unknown-linux-gnu. Also verified performance data hasn't changed materially. OK for trunk? Thanks, jeff -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/ iQEcBAEBAgAGBQJOgPzuAAoJEBRtltQi2kC7uQkH+wTyLl3MwKkqC11ozyOAVSQ9 CrlwLAuN7JV7kZcguKZ9GpXYHePZHZHCISXaVv3LQQBXnE7PehJOWsd1D5BQRv2/ eqVHIAOYg0LamY2cRiWW8pKMiMjs7vb9q0fiehQGg0zxAJMc9crBjwLPGFjZAksw UNzzon/NKfSMYsz9X/olDfk8DPa1DmAjBnNOcHzKLGdx7KDa6Npo20k3D/PwDbIe y1Ff9pZBXJP6tNU+0cn9lyyt+w6ghFQRkpKJoJ6iSOxKQ6v23+03o4sT5GHv3Gvy 07R6NJU9vqt7a9GvxcyJ9BsOlCCJ/pA/4lProHrdcAZrOYWZAA4uoJeDBPOEq+g= =a5LI -----END PGP SIGNATURE----- --------------040905070206040506010304 Content-Type: text/plain; name="Q" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="Q" Content-length: 6923 * ifcvt.c (cheap_bb_rtx_cost_p): Add SCALE argument. Scale non-jumping insns by REG_BR_PROB_BASE and the maximum cost by SCALE. (find_if_case_1): Use the probability of the THEN clause when determining if speculation if profitable. (find_if_case_2): Similarly for the ELSE clause. Index: ifcvt.c =================================================================== *** ifcvt.c (revision 179218) --- ifcvt.c (working copy) *************** static int cond_exec_changed_p; *** 85,91 **** /* Forward references. */ static int count_bb_insns (const_basic_block); ! static bool cheap_bb_rtx_cost_p (const_basic_block, int); static rtx first_active_insn (basic_block); static rtx last_active_insn (basic_block, int); static rtx find_active_insn_before (basic_block, rtx); --- 85,91 ---- /* Forward references. */ static int count_bb_insns (const_basic_block); ! static bool cheap_bb_rtx_cost_p (const_basic_block, int, int); static rtx first_active_insn (basic_block); static rtx last_active_insn (basic_block, int); static rtx find_active_insn_before (basic_block, rtx); *************** count_bb_insns (const_basic_block bb) *** 131,150 **** /* Determine whether the total insn_rtx_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. */ static bool ! cheap_bb_rtx_cost_p (const_basic_block bb, int max_cost) { int count = 0; rtx insn = BB_HEAD (bb); bool speed = optimize_bb_for_speed_p (bb); while (1) { if (NONJUMP_INSN_P (insn)) { ! int cost = insn_rtx_cost (PATTERN (insn), speed); if (cost == 0) return false; --- 131,161 ---- /* Determine whether the total insn_rtx_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. ! ! The cost of the non-jump insns in BB is scaled by REG_BR_PROB_BASE ! as those insns are being speculated. MAX_COST is scaled with SCALE ! plus a small fudge factor. */ static bool ! cheap_bb_rtx_cost_p (const_basic_block bb, int scale, int max_cost) { int count = 0; rtx insn = BB_HEAD (bb); bool speed = optimize_bb_for_speed_p (bb); + /* Our branch probability/scaling factors are just estimates and don't + account for cases where we can get speculation for free and other + secondary benefits. So we fudge the scale factor to make speculating + appear a little more profitable. */ + scale += REG_BR_PROB_BASE / 8; + max_cost *= scale; + while (1) { if (NONJUMP_INSN_P (insn)) { ! int cost = insn_rtx_cost (PATTERN (insn), speed) * REG_BR_PROB_BASE; if (cost == 0) return false; *************** find_if_case_1 (basic_block test_bb, edg *** 3796,3803 **** basic_block then_bb = then_edge->dest; basic_block else_bb = else_edge->dest; basic_block new_bb; rtx else_target = NULL_RTX; - int then_bb_index; /* If we are partitioning hot/cold basic blocks, we don't want to mess up unconditional or indirect jumps that cross between hot --- 3807,3814 ---- basic_block then_bb = then_edge->dest; basic_block else_bb = else_edge->dest; basic_block new_bb; + int then_bb_index, then_prob; rtx else_target = NULL_RTX; /* If we are partitioning hot/cold basic blocks, we don't want to mess up unconditional or indirect jumps that cross between hot *************** find_if_case_1 (basic_block test_bb, edg *** 3840,3847 **** "\nIF-CASE-1 found, start %d, then %d\n", test_bb->index, then_bb->index); ! /* THEN is small. */ ! if (! cheap_bb_rtx_cost_p (then_bb, COSTS_N_INSNS (BRANCH_COST (optimize_bb_for_speed_p (then_edge->src), predictable_edge_p (then_edge))))) return FALSE; --- 3851,3864 ---- "\nIF-CASE-1 found, start %d, then %d\n", test_bb->index, then_bb->index); ! if (then_edge->probability) ! then_prob = REG_BR_PROB_BASE - then_edge->probability; ! else ! then_prob = REG_BR_PROB_BASE / 2; ! ! /* We're speculating from the THEN path, we want to make sure the cost ! of speculation is within reason. */ ! if (! cheap_bb_rtx_cost_p (then_bb, then_prob, COSTS_N_INSNS (BRANCH_COST (optimize_bb_for_speed_p (then_edge->src), predictable_edge_p (then_edge))))) return FALSE; *************** find_if_case_2 (basic_block test_bb, edg *** 3910,3916 **** basic_block then_bb = then_edge->dest; basic_block else_bb = else_edge->dest; edge else_succ; ! rtx note; /* If we are partitioning hot/cold basic blocks, we don't want to mess up unconditional or indirect jumps that cross between hot --- 3927,3933 ---- basic_block then_bb = then_edge->dest; basic_block else_bb = else_edge->dest; edge else_succ; ! int then_prob, else_prob; /* If we are partitioning hot/cold basic blocks, we don't want to mess up unconditional or indirect jumps that cross between hot *************** find_if_case_2 (basic_block test_bb, edg *** 3949,3957 **** if (then_bb->index < NUM_FIXED_BLOCKS) return FALSE; /* ELSE is predicted or SUCC(ELSE) postdominates THEN. */ ! note = find_reg_note (BB_END (test_bb), REG_BR_PROB, NULL_RTX); ! if (note && INTVAL (XEXP (note, 0)) >= REG_BR_PROB_BASE / 2) ; else if (else_succ->dest->index < NUM_FIXED_BLOCKS || dominated_by_p (CDI_POST_DOMINATORS, then_bb, --- 3966,3984 ---- if (then_bb->index < NUM_FIXED_BLOCKS) return FALSE; + if (else_edge->probability) + { + else_prob = else_edge->probability; + then_prob = REG_BR_PROB_BASE - else_prob; + } + else + { + else_prob = REG_BR_PROB_BASE / 2; + then_prob = REG_BR_PROB_BASE / 2; + } + /* ELSE is predicted or SUCC(ELSE) postdominates THEN. */ ! if (else_prob > then_prob) ; else if (else_succ->dest->index < NUM_FIXED_BLOCKS || dominated_by_p (CDI_POST_DOMINATORS, then_bb, *************** find_if_case_2 (basic_block test_bb, edg *** 3966,3973 **** "\nIF-CASE-2 found, start %d, else %d\n", test_bb->index, else_bb->index); ! /* ELSE is small. */ ! if (! cheap_bb_rtx_cost_p (else_bb, COSTS_N_INSNS (BRANCH_COST (optimize_bb_for_speed_p (else_edge->src), predictable_edge_p (else_edge))))) return FALSE; --- 3993,4001 ---- "\nIF-CASE-2 found, start %d, else %d\n", test_bb->index, else_bb->index); ! /* We're speculating from the ELSE path, we want to make sure the cost ! of speculation is within reason. */ ! if (! cheap_bb_rtx_cost_p (else_bb, else_prob, COSTS_N_INSNS (BRANCH_COST (optimize_bb_for_speed_p (else_edge->src), predictable_edge_p (else_edge))))) return FALSE; --------------040905070206040506010304--