From patchwork Mon May 18 18:27:01 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Sandiford X-Patchwork-Id: 473546 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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 97EFB140D4D for ; Tue, 19 May 2015 04:27:14 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b=AtInBQEG; dkim-atps=neutral DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :to:subject:references:date:in-reply-to:message-id:mime-version :content-type:content-transfer-encoding; q=dns; s=default; b=n+k 3+jFErSgz+jcSq+sdTvYWThFC2tHZ013JcYjpAKNynr4tG8OErBFVWYbOkmHHjhx y5AvKY1NrWck4ijWkylQ45a/BgsSMyFMhYyQNiHohlJIQXnvKbdEW+I6Le06ZJ0/ 5uf7Jm3oNn1tvjQLrr2LQdkcgOhPFrfOQiDoZxwE= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :to:subject:references:date:in-reply-to:message-id:mime-version :content-type:content-transfer-encoding; s=default; bh=eSIHlnBt0 sH3Khgw8cVnjd5dshc=; b=AtInBQEGxVB8loPHfEWU7erIva60cx8NkJiCyq0Cx +K7nOuO7EuAzZHviWKTe8ps0wE3D1wgGTtyfJjMVEmgb32SDwnI4Uw17y2ol0xhr 6azG5qPRHR2/jbnFIRPRi/EyQszGum1XnLUseKa9iCvEyOdyIPI82j0C5WuMO77y zw= Received: (qmail 90606 invoked by alias); 18 May 2015 18:27:06 -0000 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 Received: (qmail 90595 invoked by uid 89); 18 May 2015 18:27:06 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=0.1 required=5.0 tests=AWL, BAYES_50, KAM_ASCII_DIVIDERS, SPF_PASS autolearn=no version=3.3.2 X-HELO: eu-smtp-delivery-143.mimecast.com Received: from eu-smtp-delivery-143.mimecast.com (HELO eu-smtp-delivery-143.mimecast.com) (146.101.78.143) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 18 May 2015 18:27:04 +0000 Received: from cam-owa1.Emea.Arm.com (fw-tnat.cambridge.arm.com [217.140.96.140]) by uk-mta-7.uk.mimecast.lan; Mon, 18 May 2015 19:27:02 +0100 Received: from localhost ([10.1.2.79]) by cam-owa1.Emea.Arm.com with Microsoft SMTPSVC(6.0.3790.3959); Mon, 18 May 2015 19:27:02 +0100 From: Richard Sandiford To: gcc-patches@gcc.gnu.org Mail-Followup-To: gcc-patches@gcc.gnu.org, richard.sandiford@arm.com Subject: [9/9] Simplify register bitmap operations References: <87oalhu59s.fsf@e105548-lin.cambridge.arm.com> Date: Mon, 18 May 2015 19:27:01 +0100 In-Reply-To: <87oalhu59s.fsf@e105548-lin.cambridge.arm.com> (Richard Sandiford's message of "Mon, 18 May 2015 19:09:19 +0100") Message-ID: <87k2w5spvu.fsf@e105548-lin.cambridge.arm.com> User-Agent: Gnus/5.130012 (Ma Gnus v0.12) Emacs/24.3 (gnu/linux) MIME-Version: 1.0 X-MC-Unique: r5X_z4VGSzOz8EeRuFx1gg-1 After the previous changes, several callers are left with code like: if (HARD_REGISTER_P (x)) bitmap_foo_range (x, REGNO (x), REG_NREGS (x)); else bitmap_foo (x, REGNO (x)); These might as well now be: if (REG_NREGS (x) > 1) bitmap_foo_range (x, REGNO (x), REG_NREGS (x)); else bitmap_foo (x, REGNO (x)); since REG_NREGS is as cheap to test, and since single-register hard REGs are the common case. But if separating out the cases is a win -- and it seems to be, very slightly -- then it would be better to add the shortcut to the range functions themselves. gcc/ * bitmap.c (bitmap_set_range): Handle count==1 specially. (bitmap_clear_range): Likewise. * cfgcleanup.c (mark_effect): Use bitmap_clear_range and bitmap_set_range unconditionally. * df-problems.c (df_simulate_one_insn_forwards): Likewise. * df-scan.c (df_mark_reg): Likewise. * haifa-sched.c (setup_ref_regs): Likewise. * sched-rgn.c (update_live_1): Likewise. Index: gcc/bitmap.c =================================================================== --- gcc/bitmap.c 2015-05-18 08:38:25.845752816 +0100 +++ gcc/bitmap.c 2015-05-18 08:38:25.841752865 +0100 @@ -1212,6 +1212,12 @@ bitmap_set_range (bitmap head, unsigned if (!count) return; + if (count == 1) + { + bitmap_set_bit (head, start); + return; + } + first_index = start / BITMAP_ELEMENT_ALL_BITS; end_bit_plus1 = start + count; last_index = (end_bit_plus1 - 1) / BITMAP_ELEMENT_ALL_BITS; @@ -1311,6 +1317,12 @@ bitmap_clear_range (bitmap head, unsigne if (!count) return; + if (count == 1) + { + bitmap_clear_bit (head, start); + return; + } + first_index = start / BITMAP_ELEMENT_ALL_BITS; end_bit_plus1 = start + count; last_index = (end_bit_plus1 - 1) / BITMAP_ELEMENT_ALL_BITS; Index: gcc/cfgcleanup.c =================================================================== --- gcc/cfgcleanup.c 2015-05-18 08:38:25.845752816 +0100 +++ gcc/cfgcleanup.c 2015-05-18 08:38:25.841752865 +0100 @@ -222,22 +222,15 @@ try_simplify_condjump (basic_block cbran static bool mark_effect (rtx exp, regset nonequal) { - int regno; rtx dest; switch (GET_CODE (exp)) { /* In case we do clobber the register, mark it as equal, as we know the value is dead so it don't have to match. */ case CLOBBER: - if (REG_P (XEXP (exp, 0))) - { - dest = XEXP (exp, 0); - regno = REGNO (dest); - if (HARD_REGISTER_NUM_P (regno)) - bitmap_clear_range (nonequal, regno, REG_NREGS (dest)); - else - bitmap_clear_bit (nonequal, regno); - } + dest = XEXP (exp, 0); + if (REG_P (dest)) + bitmap_clear_range (nonequal, REGNO (dest), REG_NREGS (dest)); return false; case SET: @@ -248,11 +241,7 @@ mark_effect (rtx exp, regset nonequal) return false; if (!REG_P (dest)) return true; - regno = REGNO (dest); - if (HARD_REGISTER_NUM_P (regno)) - bitmap_set_range (nonequal, regno, REG_NREGS (dest)); - else - bitmap_set_bit (nonequal, regno); + bitmap_set_range (nonequal, REGNO (dest), REG_NREGS (dest)); return false; default: Index: gcc/df-problems.c =================================================================== --- gcc/df-problems.c 2015-05-18 08:38:25.845752816 +0100 +++ gcc/df-problems.c 2015-05-18 08:38:25.845752816 +0100 @@ -3574,11 +3574,7 @@ df_simulate_one_insn_forwards (basic_blo case REG_UNUSED: { rtx reg = XEXP (link, 0); - int regno = REGNO (reg); - if (HARD_REGISTER_NUM_P (regno)) - bitmap_clear_range (live, regno, REG_NREGS (reg)); - else - bitmap_clear_bit (live, regno); + bitmap_clear_range (live, REGNO (reg), REG_NREGS (reg)); } break; default: Index: gcc/df-scan.c =================================================================== --- gcc/df-scan.c 2015-05-18 08:38:25.845752816 +0100 +++ gcc/df-scan.c 2015-05-18 08:38:25.841752865 +0100 @@ -3518,15 +3518,7 @@ df_get_eh_block_artificial_uses (bitmap static void df_mark_reg (rtx reg, void *vset) { - bitmap set = (bitmap) vset; - int regno = REGNO (reg); - - gcc_assert (GET_MODE (reg) != BLKmode); - - if (regno < FIRST_PSEUDO_REGISTER) - bitmap_set_range (set, regno, REG_NREGS (reg)); - else - bitmap_set_bit (set, regno); + bitmap_set_range ((bitmap) vset, REGNO (reg), REG_NREGS (reg)); } Index: gcc/haifa-sched.c =================================================================== --- gcc/haifa-sched.c 2015-05-18 08:38:25.845752816 +0100 +++ gcc/haifa-sched.c 2015-05-18 08:38:25.845752816 +0100 @@ -1032,17 +1032,13 @@ initiate_reg_pressure_info (bitmap live) static void setup_ref_regs (rtx x) { - int i, j, regno; + int i, j; const RTX_CODE code = GET_CODE (x); const char *fmt; if (REG_P (x)) { - regno = REGNO (x); - if (HARD_REGISTER_NUM_P (regno)) - bitmap_set_range (region_ref_regs, regno, REG_NREGS (x)); - else - bitmap_set_bit (region_ref_regs, REGNO (x)); + bitmap_set_range (region_ref_regs, REGNO (x), REG_NREGS (x)); return; } fmt = GET_RTX_FORMAT (code); Index: gcc/sched-rgn.c =================================================================== --- gcc/sched-rgn.c 2015-05-18 08:38:25.845752816 +0100 +++ gcc/sched-rgn.c 2015-05-18 08:38:25.845752816 +0100 @@ -1801,11 +1801,7 @@ update_live_1 (int src, rtx x) for (i = 0; i < candidate_table[src].update_bbs.nr_members; i++) { basic_block b = candidate_table[src].update_bbs.first_member[i]; - - if (HARD_REGISTER_NUM_P (regno)) - bitmap_set_range (df_get_live_in (b), regno, REG_NREGS (reg)); - else - bitmap_set_bit (df_get_live_in (b), regno); + bitmap_set_range (df_get_live_in (b), regno, REG_NREGS (reg)); } } }