From patchwork Wed Oct 10 19:05:09 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vladimir Makarov X-Patchwork-Id: 190747 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 7EFC62C0086 for ; Thu, 11 Oct 2012 06:05:27 +1100 (EST) Comment: DKIM? See http://www.dkim.org DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=gcc.gnu.org; s=default; x=1350500728; h=Comment: DomainKey-Signature:Received:Received:Received:Received:Received: Message-ID:Date:From:User-Agent:MIME-Version:To:Subject: Content-Type:Mailing-List:Precedence:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:Sender:Delivered-To; bh=vT6OUAF mspxxI1P5EW3vQn9fuSY=; b=PkJSsjFKQcc2RjSRN1lS+YBvQn1ERol9hBjUMBh bbabwyjCnxZOWoDaFOikwTHtVRWuepwARVpG35oPcyasISJ6nXiYvUIA9LtGPP0Z wICNQamaKEcQbyktJtu7UqHF1sUtE97I02ER6p0QdHQzlC67EaOehjWWJm4t2LfD hqSE= Comment: DomainKeys? See http://antispam.yahoo.com/domainkeys DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=default; d=gcc.gnu.org; h=Received:Received:X-SWARE-Spam-Status:X-Spam-Check-By:Received:Received:Received:Message-ID:Date:From:User-Agent:MIME-Version:To:Subject:Content-Type:X-IsSubscribed:Mailing-List:Precedence:List-Id:List-Unsubscribe:List-Archive:List-Post:List-Help:Sender:Delivered-To; b=cifN7jcLwntowOWIK9SZkAoP4/pm386ptV+MuD08N/DXbx3wMj0DnGXW6pOCeJ bDQT4gLgDtFtqMaiSbcjpzSEEKlpH5AjuupYybK0drSO/E7VEBS6wGqreOWM1t/8 cWzZyNOXuu7Uio45lP9eFM0IpozZaYnEgCUq/PgwbMwBo=; Received: (qmail 26040 invoked by alias); 10 Oct 2012 19:05:21 -0000 Received: (qmail 26025 invoked by uid 22791); 10 Oct 2012 19:05:20 -0000 X-SWARE-Spam-Status: No, hits=-7.3 required=5.0 tests=AWL, BAYES_00, KHOP_RCVD_UNTRUST, KHOP_SPAMHAUS_DROP, RCVD_IN_DNSWL_HI, RCVD_IN_HOSTKARMA_W, RP_MATCHES_RCVD, SPF_HELO_PASS X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 10 Oct 2012 19:05:10 +0000 Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q9AJ5A0W004201 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 10 Oct 2012 15:05:10 -0400 Received: from Mair.local (vpn-8-90.rdu.redhat.com [10.11.8.90]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q9AJ58rI001361 for ; Wed, 10 Oct 2012 15:05:09 -0400 Message-ID: <5075C6E5.8050100@redhat.com> Date: Wed, 10 Oct 2012 15:05:09 -0400 From: Vladimir Makarov User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:15.0) Gecko/20120907 Thunderbird/15.0.1 MIME-Version: 1.0 To: GCC Patches Subject: [lra] patch from Richard Sandiford's review of lra-lives.c 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 The following patch implements Richard's proposals from lra-lives.c review. The patch was successfully bootstrapped and tested on x86/x86-64. Committed as rev. 192326. 2012-10-10 Vladimir Makarov * lra-int.h (lra_live_range_in_p): Remove. * lra-lives.c (lra_copy_live_range_list): Simplify the code. (lra_merge_live_ranges): Remove unnecessary code. Add comments and assert. (lra_live_range_in_p): Remove. (make_hard_regno_dead): Move assert above. Index: lra-int.h =================================================================== --- lra-int.h (revision 192264) +++ lra-int.h (working copy) @@ -325,7 +325,6 @@ extern lra_live_range_t lra_merge_live_r lra_live_range_t); extern bool lra_intersected_live_ranges_p (lra_live_range_t, lra_live_range_t); -extern bool lra_live_range_in_p (lra_live_range_t, lra_live_range_t); extern void lra_print_live_range_list (FILE *, lra_live_range_t); extern void lra_debug_live_range_list (lra_live_range_t); extern void lra_debug_pseudo_live_ranges (int); Index: lra-lives.c =================================================================== --- lra-lives.c (revision 192183) +++ lra-lives.c (working copy) @@ -147,25 +147,22 @@ copy_live_range (lra_live_range_t r) lra_live_range_t lra_copy_live_range_list (lra_live_range_t r) { - lra_live_range_t p, first, last; + lra_live_range_t p, first, *chain; - if (r == NULL) - return NULL; - for (first = last = NULL; r != NULL; r = r->next) + first = NULL; + for (chain = &first; r != NULL; r = r->next) { p = copy_live_range (r); - if (first == NULL) - first = p; - else - last->next = p; - last = p; + *chain = p; + chain = &p->next; } return first; } -/* Merge ranges R1 and R2 and returns the result. The function - maintains the order of ranges and tries to minimize size of the - result range list. */ +/* Merge *non-intersected* ranges R1 and R2 and returns the result. + The function maintains the order of ranges and tries to minimize + size of the result range list. Ranges R1 and R2 may not be used + after the call. */ lra_live_range_t lra_merge_live_ranges (lra_live_range_t r1, lra_live_range_t r2) { @@ -183,24 +180,17 @@ lra_merge_live_ranges (lra_live_range_t r1 = r2; r2 = temp; } - if (r1->start <= r2->finish + 1) + if (r1->start == r2->finish + 1) { - /* Intersected ranges: merge r1 and r2 into r1. */ + /* Joint ranges: merge r1 and r2 into r1. */ r1->start = r2->start; - if (r1->finish < r2->finish) - r1->finish = r2->finish; temp = r2; r2 = r2->next; pool_free (live_range_pool, temp); - if (r2 == NULL) - { - /* To try to merge with subsequent ranges in r1. */ - r2 = r1->next; - r1->next = NULL; - } } else { + gcc_assert (r2->finish + 1 < r1->start); /* Add r1 to the result. */ if (first == NULL) first = last = r1; @@ -210,12 +200,6 @@ lra_merge_live_ranges (lra_live_range_t last = r1; } r1 = r1->next; - if (r1 == NULL) - { - /* To try to merge with subsequent ranges in r2. */ - r1 = r2->next; - r2->next = NULL; - } } } if (r1 != NULL) @@ -224,19 +208,14 @@ lra_merge_live_ranges (lra_live_range_t first = r1; else last->next = r1; - lra_assert (r1->next == NULL); } - else if (r2 != NULL) + else { + lra_assert (r2 != NULL); if (first == NULL) first = r2; else last->next = r2; - lra_assert (r2->next == NULL); - } - else - { - lra_assert (last->next == NULL); } return first; } @@ -258,30 +237,6 @@ lra_intersected_live_ranges_p (lra_live_ return false; } -/* Return TRUE if live range R1 is in R2. */ -bool -lra_live_range_in_p (lra_live_range_t r1, lra_live_range_t r2) -{ - /* Remember the live ranges are always kept ordered. */ - while (r1 != NULL && r2 != NULL) - { - /* R1's element is in R2's element. */ - if (r2->start <= r1->start && r1->finish <= r2->finish) - r1 = r1->next; - /* Intersection: R1's start is in R2. */ - else if (r2->start <= r1->start && r1->start <= r2->finish) - return false; - /* Intersection: R1's finish is in R2. */ - else if (r2->start <= r1->finish && r1->finish <= r2->finish) - return false; - else if (r1->start > r2->finish) - return false; /* No covering R2's element for R1's one. */ - else - r2 = r2->next; - } - return r1 == NULL; -} - /* The function processing birth of hard register REGNO. It updates living hard regs, conflict hard regs for living pseudos, and START_LIVING. */ @@ -305,10 +260,10 @@ make_hard_regno_born (int regno) static void make_hard_regno_dead (int regno) { + lra_assert (regno < FIRST_PSEUDO_REGISTER); if (TEST_HARD_REG_BIT (lra_no_alloc_regs, regno) || ! TEST_HARD_REG_BIT (hard_regs_live, regno)) return; - lra_assert (regno < FIRST_PSEUDO_REGISTER); sparseset_set_bit (start_dying, regno); CLEAR_HARD_REG_BIT (hard_regs_live, regno); }