From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 67382 invoked by alias); 4 Jan 2019 12:18:09 -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 67367 invoked by uid 89); 4 Jan 2019 12:18:09 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-11.9 required=5.0 tests=BAYES_00,GIT_PATCH_2,GIT_PATCH_3,SPF_PASS autolearn=ham version=3.3.2 spammy= X-HELO: foss.arm.com Received: from usa-sjc-mx-foss1.foss.arm.com (HELO foss.arm.com) (217.140.101.70) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 04 Jan 2019 12:18:07 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 8FD4015AD; Fri, 4 Jan 2019 04:18:05 -0800 (PST) Received: from localhost (unknown [10.32.98.35]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id E2CAF3F5D4; Fri, 4 Jan 2019 04:18:04 -0800 (PST) From: Richard Sandiford To: Alan Modra Mail-Followup-To: Alan Modra ,gcc-patches@gcc.gnu.org, richard.sandiford@arm.com Cc: gcc-patches@gcc.gnu.org Subject: Re: [PATCH] genattrtab bit-rot, and if_then_else in values References: <20190103092154.GZ30978@bubble.grove.modra.org> <87a7khsyjz.fsf@arm.com> <20190103143637.GA3170@bubble.grove.modra.org> <87lg41r7nb.fsf@arm.com> <87h8epr2ao.fsf@arm.com> <20190104001952.GB3170@bubble.grove.modra.org> Date: Fri, 04 Jan 2019 12:18:00 -0000 In-Reply-To: <20190104001952.GB3170@bubble.grove.modra.org> (Alan Modra's message of "Fri, 4 Jan 2019 10:49:52 +1030") Message-ID: <87imz4pqf8.fsf@arm.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.1 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-SW-Source: 2019-01/txt/msg00155.txt.bz2 Alan Modra writes: > On Thu, Jan 03, 2019 at 07:03:59PM +0000, Richard Sandiford wrote: >> Richard Sandiford writes: >> > This still seems risky and isn't what the name and function comment > > OK, how about this delta from the previous patch to ameliorate the > maintenance risk? attr_value_alignment seems clearer, and means that we can handle things like: (mult (symbol_ref "...") (const_int 4)) How about the patch below? Thanks, Richard 2019-01-04 Richard Sandiford gcc/ * genattrtab.c (or_attr_value): Replace with... (attr_value_alignment): ...this new function. Handle PLUS, MINUS and MULT. (write_length_unit_log): Update accordingly. Index: gcc/genattrtab.c =================================================================== --- gcc/genattrtab.c 2019-01-04 12:16:51.000000000 +0000 +++ gcc/genattrtab.c 2019-01-04 12:16:51.322900008 +0000 @@ -268,7 +268,7 @@ static void insert_insn_ent (stru static void walk_attr_value (rtx); static int max_attr_value (rtx, int*); static int min_attr_value (rtx, int*); -static int or_attr_value (rtx, int*); +static unsigned int attr_value_alignment (rtx); static rtx simplify_test_exp (rtx, int, int); static rtx simplify_test_exp_in_temp (rtx, int, int); static rtx copy_rtx_unchanging (rtx); @@ -1568,24 +1568,21 @@ write_length_unit_log (FILE *outf) struct attr_value *av; struct insn_ent *ie; unsigned int length_unit_log, length_or; - int unknown = 0; if (length_attr) { - length_or = or_attr_value (length_attr->default_val->value, &unknown); + length_or = attr_value_alignment (length_attr->default_val->value); for (av = length_attr->first_value; av; av = av->next) for (ie = av->first_insn; ie; ie = ie->next) - length_or |= or_attr_value (av->value, &unknown); - } + length_or |= attr_value_alignment (av->value); - if (length_attr == NULL || unknown) - length_unit_log = 0; - else - { length_or = ~length_or; for (length_unit_log = 0; length_or & 1; length_or >>= 1) length_unit_log++; } + else + length_unit_log = 0; + fprintf (outf, "EXPORTED_CONST int length_unit_log = %u;\n", length_unit_log); } @@ -3835,16 +3832,16 @@ min_attr_value (rtx exp, int *unknownp) return current_min; } -/* Given an attribute value, return the result of ORing together all - CONST_STRING arguments encountered. Set *UNKNOWNP and return -1 - if the numeric value is not known. */ +/* Given an attribute value EXP, return the maximum alignment that all + values are known to have. Return 0 if EXP is known to be zero. */ -static int -or_attr_value (rtx exp, int *unknownp) +static unsigned int +attr_value_alignment (rtx exp) { - int current_or; + unsigned int current_or; int i; + /* When breaking, OR the possible alignment values into CURRENT_OR. */ switch (GET_CODE (exp)) { case CONST_STRING: @@ -3852,23 +3849,31 @@ or_attr_value (rtx exp, int *unknownp) break; case COND: - current_or = or_attr_value (XEXP (exp, 1), unknownp); + current_or = attr_value_alignment (XEXP (exp, 1)); for (i = 0; i < XVECLEN (exp, 0); i += 2) - current_or |= or_attr_value (XVECEXP (exp, 0, i + 1), unknownp); + current_or |= attr_value_alignment (XVECEXP (exp, 0, i + 1)); break; case IF_THEN_ELSE: - current_or = or_attr_value (XEXP (exp, 1), unknownp); - current_or |= or_attr_value (XEXP (exp, 2), unknownp); + current_or = attr_value_alignment (XEXP (exp, 1)); + current_or |= attr_value_alignment (XEXP (exp, 2)); break; - default: - *unknownp = 1; - current_or = -1; + case PLUS: + case MINUS: + current_or = attr_value_alignment (XEXP (exp, 0)); + current_or |= attr_value_alignment (XEXP (exp, 1)); break; + + case MULT: + return (attr_value_alignment (XEXP (exp, 0)) + * attr_value_alignment (XEXP (exp, 1))); + + default: + return 1; } - return current_or; + return current_or & -current_or; } /* Scan an attribute value, possibly a conditional, and record what actions