From patchwork Sat Oct 30 03:06:58 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nathan Froyd X-Patchwork-Id: 69645 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id 852F3B7043 for ; Sat, 30 Oct 2010 14:07:10 +1100 (EST) Received: (qmail 6136 invoked by alias); 30 Oct 2010 03:07:08 -0000 Received: (qmail 6126 invoked by uid 22791); 30 Oct 2010 03:07:07 -0000 X-SWARE-Spam-Status: No, hits=-1.8 required=5.0 tests=AWL, BAYES_00, T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mail.codesourcery.com (HELO mail.codesourcery.com) (38.113.113.100) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Sat, 30 Oct 2010 03:07:03 +0000 Received: (qmail 15947 invoked from network); 30 Oct 2010 03:07:01 -0000 Received: from unknown (HELO codesourcery.com) (froydnj@127.0.0.2) by mail.codesourcery.com with ESMTPA; 30 Oct 2010 03:07:01 -0000 Date: Fri, 29 Oct 2010 23:06:58 -0400 From: Nathan Froyd To: gcc-patches@gcc.gnu.org Subject: [PATCH] merge {set,reset}_used_flags Message-ID: <20101030030657.GC6758@nightcrawler> MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.5.20 (2009-06-14) X-IsSubscribed: yes 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 set_used_flags and reset_used_flags in emit-rtl.c are essentially the same function, except they set the used flag slightly differently. This patch introduces a common function, mark_used_flags, and makes them both call it. As a bonus, set_used_flags now gets to benefit from the small tail recursion optimization that reset_used_flags employed. Tested on x86_64-unknown-linux-gnu. OK to commit? -Nathan * emit-rtl.c (mark_used_flags): New function. (set_used_flags, reset_used_flags): Call it. diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c index 19d290c..0aed7c0 100644 --- a/gcc/emit-rtl.c +++ b/gcc/emit-rtl.c @@ -2728,11 +2728,8 @@ repeat: return; } -/* Clear all the USED bits in X to allow copy_rtx_if_shared to be used - to look for shared sub-parts. */ - -void -reset_used_flags (rtx x) +static void +mark_used_flags (rtx x, int flag) { int i, j; enum rtx_code code; @@ -2778,7 +2775,7 @@ repeat: break; } - RTX_FLAG (x, used) = 0; + RTX_FLAG (x, used) = flag; format_ptr = GET_RTX_FORMAT (code); length = GET_RTX_LENGTH (code); @@ -2793,81 +2790,33 @@ repeat: x = XEXP (x, i); goto repeat; } - reset_used_flags (XEXP (x, i)); + mark_used_flags (XEXP (x, i), flag); break; case 'E': for (j = 0; j < XVECLEN (x, i); j++) - reset_used_flags (XVECEXP (x, i, j)); + mark_used_flags (XVECEXP (x, i, j), flag); break; } } } -/* Set all the USED bits in X to allow copy_rtx_if_shared to be used +/* Clear all the USED bits in X to allow copy_rtx_if_shared to be used to look for shared sub-parts. */ void -set_used_flags (rtx x) +reset_used_flags (rtx x) { - int i, j; - enum rtx_code code; - const char *format_ptr; - - if (x == 0) - return; - - code = GET_CODE (x); - - /* These types may be freely shared so we needn't do any resetting - for them. */ - - switch (code) - { - case REG: - case DEBUG_EXPR: - case VALUE: - case CONST_INT: - case CONST_DOUBLE: - case CONST_FIXED: - case CONST_VECTOR: - case SYMBOL_REF: - case CODE_LABEL: - case PC: - case CC0: - return; - - case DEBUG_INSN: - case INSN: - case JUMP_INSN: - case CALL_INSN: - case NOTE: - case LABEL_REF: - case BARRIER: - /* The chain of insns is not being copied. */ - return; - - default: - break; - } - - RTX_FLAG (x, used) = 1; + mark_used_flags (x, 0); +} - format_ptr = GET_RTX_FORMAT (code); - for (i = 0; i < GET_RTX_LENGTH (code); i++) - { - switch (*format_ptr++) - { - case 'e': - set_used_flags (XEXP (x, i)); - break; +/* Set all the USED bits in X to allow copy_rtx_if_shared to be used + to look for shared sub-parts. */ - case 'E': - for (j = 0; j < XVECLEN (x, i); j++) - set_used_flags (XVECEXP (x, i, j)); - break; - } - } +void +set_used_flags (rtx x) +{ + mark_used_flags (x, 1); } /* Copy X if necessary so that it won't be altered by changes in OTHER.