From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by sourceware.org (Postfix) with ESMTP id D33283A1B420 for ; Fri, 13 Nov 2020 08:19:42 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org D33283A1B420 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 92481142F for ; Fri, 13 Nov 2020 00:19:42 -0800 (PST) Received: from localhost (e121540-lin.manchester.arm.com [10.32.98.126]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 3B6AA3F718 for ; Fri, 13 Nov 2020 00:19:42 -0800 (PST) From: Richard Sandiford To: gcc-patches@gcc.gnu.org Mail-Followup-To: gcc-patches@gcc.gnu.org, richard.sandiford@arm.com Subject: [16/23] recog: Add a way of temporarily undoing changes References: Date: Fri, 13 Nov 2020 08:19:40 +0000 In-Reply-To: (Richard Sandiford's message of "Fri, 13 Nov 2020 08:10:54 +0000") Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Status: No, score=-12.6 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 13 Nov 2020 08:19:44 -0000 In some cases, it can be convenient to roll back the changes that have been made by validate_change to see how things looked before, then reroll the changes. For example, this makes it possible to defer calculating the cost of an instruction until we know that the result is actually needed. It can also make dumps easier to read. This patch adds a couple of helper functions for doing that. gcc/ * recog.h (temporarily_undo_changes, redo_changes): Declare. * recog.c (swap_change, temporarily_undo_changes): New functions. (redo_changes): Likewise. --- gcc/recog.c | 40 ++++++++++++++++++++++++++++++++++++++++ gcc/recog.h | 2 ++ 2 files changed, 42 insertions(+) diff --git a/gcc/recog.c b/gcc/recog.c index 65125b8f0d1..309a578a151 100644 --- a/gcc/recog.c +++ b/gcc/recog.c @@ -577,6 +577,46 @@ cancel_changes (int num) num_changes = num; } +/* Swap the status of change NUM from being applied to not being applied, + or vice versa. */ + +static void +swap_change (int num) +{ + if (changes[num].old_len >= 0) + std::swap (XVECLEN (*changes[num].loc, 0), changes[num].old_len); + else + std::swap (*changes[num].loc, changes[num].old); + if (changes[num].object && !MEM_P (changes[num].object)) + std::swap (INSN_CODE (changes[num].object), changes[num].old_code); +} + +/* Temporarily undo all the changes numbered NUM and up, with a view + to reapplying them later. The next call to the changes machinery + must be: + + redo_changes (NUM) + + otherwise things will end up in an invalid state. */ + +void +temporarily_undo_changes (int num) +{ + for (int i = num_changes - 1; i >= num; i--) + swap_change (i); +} + +/* Redo the changes that were temporarily undone by: + + temporarily_undo_changes (NUM). */ + +void +redo_changes (int num) +{ + for (int i = num; i < num_changes; ++i) + swap_change (i); +} + /* Reduce conditional compilation elsewhere. */ /* A subroutine of validate_replace_rtx_1 that tries to simplify the resulting rtx. */ diff --git a/gcc/recog.h b/gcc/recog.h index e152e2bb591..facf36e7c08 100644 --- a/gcc/recog.h +++ b/gcc/recog.h @@ -96,6 +96,8 @@ extern void confirm_change_group (void); extern int apply_change_group (void); extern int num_validated_changes (void); extern void cancel_changes (int); +extern void temporarily_undo_changes (int); +extern void redo_changes (int); extern int constrain_operands (int, alternative_mask); extern int constrain_operands_cached (rtx_insn *, int); extern int memory_address_addr_space_p (machine_mode, rtx, addr_space_t); -- 2.17.1