From patchwork Tue Oct 26 17:44:52 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jie Zhang X-Patchwork-Id: 69270 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 0E27EB70CC for ; Wed, 27 Oct 2010 04:45:11 +1100 (EST) Received: (qmail 5857 invoked by alias); 26 Oct 2010 17:45:01 -0000 Received: (qmail 5716 invoked by uid 22791); 26 Oct 2010 17:44:58 -0000 X-SWARE-Spam-Status: No, hits=-1.9 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; Tue, 26 Oct 2010 17:44:53 +0000 Received: (qmail 6797 invoked from network); 26 Oct 2010 17:44:51 -0000 Received: from unknown (HELO ?192.168.1.106?) (jie@127.0.0.2) by mail.codesourcery.com with ESMTPA; 26 Oct 2010 17:44:51 -0000 Message-ID: <4CC71394.1080001@codesourcery.com> Date: Wed, 27 Oct 2010 01:44:52 +0800 From: Jie Zhang User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.9) Gecko/20100918 Icedove/3.1.4 MIME-Version: 1.0 To: Maxim Kuvyrkov CC: gcc-patches@gcc.gnu.org, Vladimir Makarov Subject: Re: Make max_issue honor issue_rate References: <4CBF1BD6.4010602@codesourcery.com> <4CC1D982.7070407@codesourcery.com> <4CC5C8E4.9050205@codesourcery.com> <4CC5CE1C.6090502@codesourcery.com> <4CC5FD75.2020003@codesourcery.com> In-Reply-To: <4CC5FD75.2020003@codesourcery.com> 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 On 10/26/2010 05:58 AM, Maxim Kuvyrkov wrote: > On 10/25/10 2:36 PM, Jie Zhang wrote: > >> 4 units: a, b, c, d. >> >> insn 1 uses a, insn 2 uses b, insn 3 uses c, insn 4 uses d. >> >> and we set issue_rate to 3. In this case, we can only issue insn 1, 2, 3 >> but not 4 although its unit is free. >> >> To extend this example a little, i.e. insn4 uses nothing, (it does not >> change the state, right? I'm not very sure), it still can not be issued. >> >> So I think we should use "top - choice_stack >= more_issue" instead of >> "top->n >= more_issue". Am I right? > > I think the 'n' field was introduced for a reason. DFA description has > the "nothing" reservation that specifies that a particular instruction > does not have a noticeable effect on a CPU (imagine a nop instruction > that gets optimized out by decoder and does not get into the pipeline). > OK. This version of the patch removes some unnecessary changes in your version to ease the scheduler maintainer review. * haifa-sched.c (ISSUE_POINTS): Remove. (max_issue): Don't issue more than issue_rate instructions. Index: haifa-sched.c =================================================================== --- haifa-sched.c (revision 165970) +++ haifa-sched.c (working copy) @@ -199,10 +199,6 @@ struct common_sched_info_def *common_sch /* The minimal value of the INSN_TICK of an instruction. */ #define MIN_TICK (-max_insn_queue_index) -/* Issue points are used to distinguish between instructions in max_issue (). - For now, all instructions are equally good. */ -#define ISSUE_POINTS(INSN) 1 - /* List of important notes we must keep around. This is a pointer to the last element in the list. */ rtx note_list; @@ -2444,8 +2440,7 @@ static int cached_issue_rate = 0; insns is insns with the best rank (the first insn in READY). To make this function tries different samples of ready insns. READY is current queue `ready'. Global array READY_TRY reflects what - insns are already issued in this try. MAX_POINTS is the sum of points - of all instructions in READY. The function stops immediately, + insns are already issued in this try. The function stops immediately, if it reached the such a solution, that all instruction can be issued. INDEX will contain index of the best insn in READY. The following function is used only for first cycle multipass scheduling. @@ -2458,7 +2453,7 @@ int max_issue (struct ready_list *ready, int privileged_n, state_t state, int *index) { - int n, i, all, n_ready, best, delay, tries_num, max_points; + int n, i, all, n_ready, best, delay, tries_num; int more_issue; struct choice_entry *top; rtx insn; @@ -2477,19 +2472,9 @@ max_issue (struct ready_list *ready, int } /* Init max_points. */ - max_points = 0; more_issue = issue_rate - cycle_issued_insns; gcc_assert (more_issue >= 0); - for (i = 0; i < n_ready; i++) - if (!ready_try [i]) - { - if (more_issue-- > 0) - max_points += ISSUE_POINTS (ready_element (ready, i)); - else - break; - } - /* The number of the issued insns in the best solution. */ best = 0; @@ -2513,12 +2498,17 @@ max_issue (struct ready_list *ready, int if (/* If we've reached a dead end or searched enough of what we have been asked... */ top->rest == 0 - /* Or have nothing else to try. */ - || i >= n_ready) + /* or have nothing else to try... */ + || i >= n_ready + /* or should not issue more. */ + || top->n >= more_issue) { /* ??? (... || i == n_ready). */ gcc_assert (i <= n_ready); + /* We should not issue more than issue_rate instructions. */ + gcc_assert (top->n <= more_issue); + if (top == choice_stack) break; @@ -2541,7 +2531,7 @@ max_issue (struct ready_list *ready, int /* This is the index of the insn issued first in this solution. */ *index = choice_stack [1].index; - if (top->n == max_points || best == all) + if (top->n == more_issue || best == all) break; } } @@ -2574,7 +2564,7 @@ max_issue (struct ready_list *ready, int n = top->n; if (memcmp (top->state, state, dfa_state_size) != 0) - n += ISSUE_POINTS (insn); + n++; /* Advance to the next choice_entry. */ top++;