From patchwork Wed Oct 20 16:41:58 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jie Zhang X-Patchwork-Id: 68449 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 B0AE7B6EF7 for ; Thu, 21 Oct 2010 03:42:06 +1100 (EST) Received: (qmail 12738 invoked by alias); 20 Oct 2010 16:41:58 -0000 Received: (qmail 12701 invoked by uid 22791); 20 Oct 2010 16:41:54 -0000 X-SWARE-Spam-Status: No, hits=-1.9 required=5.0 tests=AWL, BAYES_00, TW_CP, 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; Wed, 20 Oct 2010 16:41:48 +0000 Received: (qmail 32319 invoked from network); 20 Oct 2010 16:41:46 -0000 Received: from unknown (HELO ?192.168.1.106?) (jie@127.0.0.2) by mail.codesourcery.com with ESMTPA; 20 Oct 2010 16:41:46 -0000 Message-ID: <4CBF1BD6.4010602@codesourcery.com> Date: Thu, 21 Oct 2010 00:41:58 +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: gcc-patches@gcc.gnu.org Subject: Make max_issue honor issue_rate 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 Hi, This patch is an improvement of the patch I posted before: http://gcc.gnu.org/ml/gcc/2010-10/msg00278.html According to the replies to that email, it seems both dropping ISSUE_POINTS and making max_issue honor issue_rate are good. So I clean it up and resubmit it here for review and approval. This new patch does not enable "gcc_assert (more_issue >= 0);" since it's belongs to another issue and I have sent a patch for that. I also added a new gcc_assert: gcc_assert (memcmp (top->state, state, dfa_state_size) != 0); This is mainly for testing purpose. I will remove it if the test results are good. It's already bootstrapped on x86_64-unknown-linux-gnu. The regression testing is going on. Is it OK if no regressions are found? Regards, * haifa-sched.c (ISSUE_POINTS): Remove. (struct choice_entry): Remove field n. (max_issue): Don't issue more than issue_rate instructions. Index: haifa-sched.c =================================================================== --- haifa-sched.c (revision 165712) +++ 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; @@ -2401,8 +2397,6 @@ struct choice_entry int index; /* The number of the rest insns whose issues we should try. */ int rest; - /* The number of issued essential insns. */ - int n; /* State after issuing the insn. */ state_t state; }; @@ -2444,8 +2438,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 +2451,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 i, all, n_ready, best, delay, tries_num; int more_issue; struct choice_entry *top; rtx insn; @@ -2477,7 +2470,6 @@ max_issue (struct ready_list *ready, int } /* Init max_points. */ - max_points = 0; more_issue = issue_rate - cycle_issued_insns; /* ??? We used to assert here that we never issue more insns than issue_rate. @@ -2488,15 +2480,6 @@ max_issue (struct ready_list *ready, int 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; @@ -2505,7 +2488,6 @@ max_issue (struct ready_list *ready, int /* Set initial state of the search. */ memcpy (top->state, state, dfa_state_size); top->rest = dfa_lookahead; - top->n = 0; /* Count the number of the insns to search among. */ for (all = i = 0; i < n_ready; i++) @@ -2521,16 +2503,23 @@ max_issue (struct ready_list *ready, int been asked... */ top->rest == 0 /* Or have nothing else to try. */ - || i >= n_ready) + || i >= n_ready + /* Or can't issue more. */ + || top - choice_stack >= more_issue) { /* ??? (... || i == n_ready). */ gcc_assert (i <= n_ready); + /* We should not issue more than issue_rate instructions. */ + gcc_assert (top - choice_stack <= more_issue); + if (top == choice_stack) break; if (best < top - choice_stack) { + int n; + if (privileged_n) { n = privileged_n; @@ -2548,7 +2537,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 - choice_stack == more_issue || best == all) break; } } @@ -2579,16 +2568,13 @@ max_issue (struct ready_list *ready, int else top->rest--; - n = top->n; - if (memcmp (top->state, state, dfa_state_size) != 0) - n += ISSUE_POINTS (insn); + gcc_assert (memcmp (top->state, state, dfa_state_size) != 0); /* Advance to the next choice_entry. */ top++; /* Initialize it. */ top->rest = dfa_lookahead; top->index = i; - top->n = n; memcpy (top->state, state, dfa_state_size); ready_try [i] = 1;