From patchwork Wed Aug 3 15:30:36 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexander Monakov X-Patchwork-Id: 108281 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 0E0E2B71E2 for ; Thu, 4 Aug 2011 01:31:27 +1000 (EST) Received: (qmail 14404 invoked by alias); 3 Aug 2011 15:31:21 -0000 Received: (qmail 14287 invoked by uid 22791); 3 Aug 2011 15:31:19 -0000 X-SWARE-Spam-Status: No, hits=-2.1 required=5.0 tests=AWL, BAYES_00, RP_MATCHES_RCVD, TW_CF, TW_QN X-Spam-Check-By: sourceware.org Received: from smtp.ispras.ru (HELO smtp.ispras.ru) (83.149.198.202) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 03 Aug 2011 15:30:56 +0000 Received: from condor.intra.ispras.ru (winnie.ispras.ru [83.149.198.236]) by smtp.ispras.ru (Postfix) with ESMTP id 6565F5D404C; Wed, 3 Aug 2011 19:21:47 +0400 (MSD) Received: by condor.intra.ispras.ru (Postfix, from userid 23246) id 78E3A12205EF; Wed, 3 Aug 2011 19:30:38 +0400 (MSD) From: Alexander Monakov To: gcc-patches@gcc.gnu.org Cc: vmakarov@redhat.com Subject: [PATCH 6/8] Try successors to find seqno Date: Wed, 3 Aug 2011 19:30:36 +0400 Message-Id: <1312385438-6273-7-git-send-email-amonakov@ispras.ru> In-Reply-To: <1312385438-6273-1-git-send-email-amonakov@ispras.ru> References: <1312385438-6273-1-git-send-email-amonakov@ispras.ru> To: gcc-patches@gcc.gnu.org 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 From: Sergey Grechanik This patch fixes a problem when new jumps created in sel_redirect_edge_and_branch_force could not get correct seqnos. get_seqno_of_a_pred is renamed to get_seqno_for_a_jump. Implementation-wise, it supports looking at multiple predecessors, and, if that fails, also at successors. get_seqno_by_succs is implemented similar to get_seqno_by_preds. 2011-08-04 Sergey Grechanik * sel-sched-ir.c (get_seqno_of_a_pred): Rename to get_seqno_for_a_jump. Update the caller. (get_seqno_by_succs): New. Use it ... (get_seqno_for_a_jump): ... here to find a seqno if looking at predecessors was not sufficient. (get_seqno_by_preds): Include head in iteration range, exclude insn. diff --git a/gcc/sel-sched-ir.c b/gcc/sel-sched-ir.c index dd8b3da..91f9dd9 100644 --- a/gcc/sel-sched-ir.c +++ b/gcc/sel-sched-ir.c @@ -3940,9 +3940,39 @@ sel_luid_for_non_insn (rtx x) return -1; } -/* Return seqno of the only predecessor of INSN. */ +/* Find the proper seqno for inserting at INSN by successors. + Return -1 if no successors with positive seqno exist. */ static int -get_seqno_of_a_pred (insn_t insn) +get_seqno_by_succs (rtx insn) +{ + basic_block bb = BLOCK_FOR_INSN (insn); + rtx tmp = insn, end = BB_END (bb); + int seqno; + insn_t succ = NULL; + succ_iterator si; + + while (tmp != end) + { + tmp = NEXT_INSN (tmp); + if (INSN_P (tmp)) + return INSN_SEQNO (tmp); + } + + seqno = INT_MAX; + + FOR_EACH_SUCC_1 (succ, si, end, SUCCS_NORMAL) + if (INSN_SEQNO (succ) > 0) + seqno = MIN (seqno, INSN_SEQNO (succ)); + + if (seqno == INT_MAX) + return -1; + + return seqno; +} + +/* Compute seqno for INSN by its preds or succs. */ +static int +get_seqno_for_a_jump (insn_t insn) { int seqno; @@ -3982,14 +4012,24 @@ get_seqno_of_a_pred (insn_t insn) int n; cfg_preds (BLOCK_FOR_INSN (insn), &preds, &n); - gcc_assert (n == 1); - seqno = INSN_SEQNO (preds[0]); + gcc_assert (n > 0); + /* For one predecessor, use simple method. */ + if (n == 1) + seqno = INSN_SEQNO (preds[0]); + else + seqno = get_seqno_by_preds (insn); free (preds); } } + /* We were unable to find a good seqno among preds. */ + if (seqno < 0) + seqno = get_seqno_by_succs (insn); + + gcc_assert (seqno >= 0); + return seqno; } @@ -4004,10 +4044,11 @@ get_seqno_by_preds (rtx insn) int n, i, seqno; while (tmp != head) - if (INSN_P (tmp)) - return INSN_SEQNO (tmp); - else + { tmp = PREV_INSN (tmp); + if (INSN_P (tmp)) + return INSN_SEQNO (tmp); + } cfg_preds (bb, &preds, &n); for (i = 0, seqno = -1; i < n; i++) @@ -4179,7 +4220,7 @@ init_simplejump_data (insn_t insn) init_expr (INSN_EXPR (insn), vinsn_create (insn, false), 0, REG_BR_PROB_BASE, 0, 0, 0, 0, 0, 0, NULL, true, false, false, false, true); - INSN_SEQNO (insn) = get_seqno_of_a_pred (insn); + INSN_SEQNO (insn) = get_seqno_for_a_jump (insn); init_first_time_insn_data (insn); }