From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 93517 invoked by alias); 24 Jun 2019 14:30:58 -0000 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 Received: (qmail 93385 invoked by uid 89); 24 Jun 2019 14:30:57 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-9.5 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_2,GIT_PATCH_3,SPF_HELO_PASS autolearn=ham version=3.3.1 spammy=holding, alternatives, somebody, MAP X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 24 Jun 2019 14:30:56 +0000 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 53B0B30C021A; Mon, 24 Jun 2019 14:30:50 +0000 (UTC) Received: from [10.10.125.153] (ovpn-125-153.rdu2.redhat.com [10.10.125.153]) by smtp.corp.redhat.com (Postfix) with ESMTP id E0D715C21F; Mon, 24 Jun 2019 14:30:47 +0000 (UTC) Subject: Re: [PATCH 2/5] Simplify ira_setup_alts To: gcc-patches@gcc.gnu.org, richard.sandiford@arm.com References: From: Vladimir Makarov Message-ID: <7fe0c3a5-2777-8842-1753-2eb5922bcf74@redhat.com> Date: Mon, 24 Jun 2019 14:30:00 -0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.6.1 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit X-IsSubscribed: yes X-SW-Source: 2019-06/txt/msg01460.txt.bz2 On 2019-06-21 9:40 a.m., Richard Sandiford wrote: > ira_setup_alts has its own code to calculate the start of the > constraint string for each operand/alternative combination, > but preprocess_constraints now provides that information in (almost) > constant time for non-asm instructions. Using it here should speed > up the common case at the cost of potentially slowing down the handling > of asm statements. The documentation says that '%' should be the very first constraint character.  But I think there is a possibility that somebody can forget this and put a blank before '%' and effect of this would be very hard to find as still the correct code would be generated although the code might be slower.  That was my thoughts why I processed all constraint string. It is hard to for me to say what the probability of this can be. I guess it is tiny.  So the patch is ok for me. > The real reason for doing this is that a later patch wants to use > more of the operand_alternative information. > > 2019-06-21 Richard Sandiford > > gcc/ > * ira.c (ira_setup_alts): Use preprocess_constraints to get the > constraint string for each operand/alternative combo. Only handle > '%' at the start of constraint strings, and look for it outside > the main loop. > > Index: gcc/ira.c > =================================================================== > --- gcc/ira.c 2019-06-21 14:34:05.887715020 +0100 > +++ gcc/ira.c 2019-06-21 14:34:09.455685354 +0100 > @@ -1791,60 +1791,42 @@ setup_prohibited_mode_move_regs (void) > alternative_mask > ira_setup_alts (rtx_insn *insn) > { > - /* MAP nalt * nop -> start of constraints for given operand and > - alternative. */ > - static vec insn_constraints; > int nop, nalt; > bool curr_swapped; > const char *p; > int commutative = -1; > > extract_insn (insn); > + preprocess_constraints (insn); > alternative_mask preferred = get_preferred_alternatives (insn); > alternative_mask alts = 0; > - insn_constraints.release (); > - insn_constraints.safe_grow_cleared (recog_data.n_operands > - * recog_data.n_alternatives + 1); > /* Check that the hard reg set is enough for holding all > alternatives. It is hard to imagine the situation when the > assertion is wrong. */ > ira_assert (recog_data.n_alternatives > <= (int) MAX (sizeof (HARD_REG_ELT_TYPE) * CHAR_BIT, > FIRST_PSEUDO_REGISTER)); > + for (nop = 0; nop < recog_data.n_operands; nop++) > + if (recog_data.constraints[nop][0] == '%') > + { > + commutative = nop; > + break; > + } > for (curr_swapped = false;; curr_swapped = true) > { > - /* Calculate some data common for all alternatives to speed up the > - function. */ > - for (nop = 0; nop < recog_data.n_operands; nop++) > - { > - for (nalt = 0, p = recog_data.constraints[nop]; > - nalt < recog_data.n_alternatives; > - nalt++) > - { > - insn_constraints[nop * recog_data.n_alternatives + nalt] = p; > - while (*p && *p != ',') > - { > - /* We only support one commutative marker, the first > - one. We already set commutative above. */ > - if (*p == '%' && commutative < 0) > - commutative = nop; > - p++; > - } > - if (*p) > - p++; > - } > - } > for (nalt = 0; nalt < recog_data.n_alternatives; nalt++) > { > if (!TEST_BIT (preferred, nalt) || TEST_BIT (alts, nalt)) > continue; > > + const operand_alternative *op_alt > + = &recog_op_alt[nalt * recog_data.n_operands]; > for (nop = 0; nop < recog_data.n_operands; nop++) > { > int c, len; > > rtx op = recog_data.operand[nop]; > - p = insn_constraints[nop * recog_data.n_alternatives + nalt]; > + p = op_alt[nop].constraint; > if (*p == 0 || *p == ',') > continue; >