From patchwork Tue Jan 4 22:30:38 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Fang, Changpeng" X-Patchwork-Id: 77542 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 2B8A4B70F9 for ; Wed, 5 Jan 2011 09:35:19 +1100 (EST) Received: (qmail 11797 invoked by alias); 4 Jan 2011 22:35:13 -0000 Received: (qmail 11519 invoked by uid 22791); 4 Jan 2011 22:35:08 -0000 X-SWARE-Spam-Status: No, hits=-1.9 required=5.0 tests=AWL,BAYES_00,TW_DB X-Spam-Check-By: sourceware.org Received: from tx2ehsobe002.messaging.microsoft.com (HELO TX2EHSOBE004.bigfish.com) (65.55.88.12) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Tue, 04 Jan 2011 22:35:01 +0000 Received: from mail177-tx2-R.bigfish.com (10.9.14.248) by TX2EHSOBE004.bigfish.com (10.9.40.24) with Microsoft SMTP Server id 14.1.225.8; Tue, 4 Jan 2011 22:34:59 +0000 Received: from mail177-tx2 (localhost.localdomain [127.0.0.1]) by mail177-tx2-R.bigfish.com (Postfix) with ESMTP id 5DDCC1710294; Tue, 4 Jan 2011 22:34:59 +0000 (UTC) X-SpamScore: -33 X-BigFish: VPS-33(zz1432N98dN4015L1447R9371Pzz1202hzz8275dhz32i668h34h) X-Forefront-Antispam-Report: KIP:(null); UIP:(null); IPVD:NLI; H:ausb3twp02.amd.com; RD:none; EFVD:NLI Received: from mail177-tx2 (localhost.localdomain [127.0.0.1]) by mail177-tx2 (MessageSwitch) id 1294180498803111_9442; Tue, 4 Jan 2011 22:34:58 +0000 (UTC) Received: from TX2EHSMHS005.bigfish.com (unknown [10.9.14.240]) by mail177-tx2.bigfish.com (Postfix) with ESMTP id BE810620050; Tue, 4 Jan 2011 22:34:58 +0000 (UTC) Received: from ausb3twp02.amd.com (163.181.249.109) by TX2EHSMHS005.bigfish.com (10.9.99.105) with Microsoft SMTP Server id 14.1.225.8; Tue, 4 Jan 2011 22:34:57 +0000 X-M-MSG: Received: from sausexedgep02.amd.com (sausexedgep02-ext.amd.com [163.181.249.73]) (using TLSv1 with cipher AES128-SHA (128/128 bits)) (No client certificate requested) by ausb3twp02.amd.com (Tumbleweed MailGate 3.7.2) with ESMTP id 2A80BC85E9; Tue, 4 Jan 2011 16:34:54 -0600 (CST) Received: from sausexhtp02.amd.com (163.181.3.152) by sausexedgep02.amd.com (163.181.36.59) with Microsoft SMTP Server (TLS) id 8.3.106.1; Tue, 4 Jan 2011 16:38:03 -0600 Received: from SAUSEXMBP01.amd.com ([163.181.3.198]) by sausexhtp02.amd.com ([163.181.3.152]) with mapi; Tue, 4 Jan 2011 16:34:55 -0600 From: "Fang, Changpeng" To: Jack Howarth CC: Zdenek Dvorak , Richard Guenther , Xinliang David Li , "gcc-patches@gcc.gnu.org" Date: Tue, 4 Jan 2011 16:30:38 -0600 Subject: RE: [PATCH, Loop optimizer]: Add logic to disable certain loop optimizations on pre-/post-loops Message-ID: References: <20101214075629.GA10020@kam.mff.cuni.cz> <20101214210552.GA19633@kam.mff.cuni.cz> <20101215092220.GA9872@kam.mff.cuni.cz> , <20110104030426.GA28556@bromo.med.uc.edu> In-Reply-To: <20110104030426.GA28556@bromo.med.uc.edu> MIME-Version: 1.0 X-OriginatorOrg: amd.com 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, Thanks, Jack. Hopefully the 6% protein gain (for -m64) is not just noise. I updated the patch based on the current trunk (REV 168477). Is it OK to commit now? Thanks, Changpeng From 7d10fcfe379e3fe4387cf192fbbdbea7daff0637 Mon Sep 17 00:00:00 2001 From: Changpeng Fang Date: Tue, 4 Jan 2011 14:36:50 -0800 Subject: [PATCH] Consider a loop not hot if it rolls only a few times (non-rolling) * basic-block.h (bb_flags): Add a new flag BB_HEADER_OF_NONROLLING_LOOP. * cfg.c (clear_bb_flags): Keep BB_HEADER_OF_NONROLLING marker. * cfgloop.h (mark_non_rolling_loop): New function declaration. (non_rolling_loop_p): New function declaration. * predict.c (optimize_loop_for_size_p): Return true if the loop was marked NON-ROLLING. (optimize_loop_for_speed_p): Return false if the loop was marked NON-ROLLING. * tree-ssa-loop-manip.c (tree_transform_and_unroll_loop): Mark the non-rolling loop. * tree-ssa-loop-niter.c (mark_non_rolling_loop): Implement the new function. (non_rolling_loop_p): Implement the new function. * tree-vect-loop-manip.c (vect_do_peeling_for_loop_bound): Mark the non-rolling loop. (vect_do_peeling_for_alignment): Mark the non-rolling loop. --- gcc/basic-block.h | 5 ++++- gcc/cfg.c | 7 ++++--- gcc/cfgloop.h | 2 ++ gcc/predict.c | 6 ++++++ gcc/tree-ssa-loop-manip.c | 3 +++ gcc/tree-ssa-loop-niter.c | 20 ++++++++++++++++++++ gcc/tree-vect-loop-manip.c | 8 ++++++++ 7 files changed, 47 insertions(+), 4 deletions(-) diff --git a/gcc/basic-block.h b/gcc/basic-block.h index 3594eea..081c175 100644 --- a/gcc/basic-block.h +++ b/gcc/basic-block.h @@ -251,7 +251,10 @@ enum bb_flags df_set_bb_dirty, but not cleared by df_analyze, so it can be used to test whether a block has been modified prior to a df_analyze call. */ - BB_MODIFIED = 1 << 12 + BB_MODIFIED = 1 << 12, + + /* Set on blocks that are headers of non-rolling loops. */ + BB_HEADER_OF_NONROLLING_LOOP = 1 << 13 }; /* Dummy flag for convenience in the hot/cold partitioning code. */ diff --git a/gcc/cfg.c b/gcc/cfg.c index c8ef799..e59a637 100644 --- a/gcc/cfg.c +++ b/gcc/cfg.c @@ -425,8 +425,8 @@ redirect_edge_pred (edge e, basic_block new_pred) connect_src (e); } -/* Clear all basic block flags, with the exception of partitioning and - setjmp_target. */ +/* Clear all basic block flags, with the exception of partitioning, + setjmp_target, and the non-rolling loop marker. */ void clear_bb_flags (void) { @@ -434,7 +434,8 @@ clear_bb_flags (void) FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, NULL, next_bb) bb->flags = (BB_PARTITION (bb) - | (bb->flags & (BB_DISABLE_SCHEDULE + BB_RTL + BB_NON_LOCAL_GOTO_TARGET))); + | (bb->flags & (BB_DISABLE_SCHEDULE + BB_RTL + BB_NON_LOCAL_GOTO_TARGET + + BB_HEADER_OF_NONROLLING_LOOP))); } /* Check the consistency of profile information. We can't do that diff --git a/gcc/cfgloop.h b/gcc/cfgloop.h index f7bb134..0f48115 100644 --- a/gcc/cfgloop.h +++ b/gcc/cfgloop.h @@ -279,6 +279,8 @@ extern rtx doloop_condition_get (rtx); void estimate_numbers_of_iterations_loop (struct loop *, bool); HOST_WIDE_INT estimated_loop_iterations_int (struct loop *, bool); bool estimated_loop_iterations (struct loop *, bool, double_int *); +void mark_non_rolling_loop (struct loop *); +bool non_rolling_loop_p (struct loop *); /* Loop manipulation. */ extern bool can_duplicate_loop_p (const struct loop *loop); diff --git a/gcc/predict.c b/gcc/predict.c index a86708a..34d7dff 100644 --- a/gcc/predict.c +++ b/gcc/predict.c @@ -280,6 +280,9 @@ optimize_insn_for_speed_p (void) bool optimize_loop_for_size_p (struct loop *loop) { + /* Loops marked NON-ROLLING are not likely to be hot. */ + if (non_rolling_loop_p (loop)) + return true; return optimize_bb_for_size_p (loop->header); } @@ -288,6 +291,9 @@ optimize_loop_for_size_p (struct loop *loop) bool optimize_loop_for_speed_p (struct loop *loop) { + /* Loops marked NON-ROLLING are not likely to be hot. */ + if (non_rolling_loop_p (loop)) + return false; return optimize_bb_for_speed_p (loop->header); } diff --git a/gcc/tree-ssa-loop-manip.c b/gcc/tree-ssa-loop-manip.c index 8176ed8..3ff0790 100644 --- a/gcc/tree-ssa-loop-manip.c +++ b/gcc/tree-ssa-loop-manip.c @@ -931,6 +931,9 @@ tree_transform_and_unroll_loop (struct loop *loop, unsigned factor, gcc_assert (new_loop != NULL); update_ssa (TODO_update_ssa); + /* NEW_LOOP is a non-rolling loop. */ + mark_non_rolling_loop (new_loop); + /* Determine the probability of the exit edge of the unrolled loop. */ new_est_niter = est_niter / factor; diff --git a/gcc/tree-ssa-loop-niter.c b/gcc/tree-ssa-loop-niter.c index ee85f6f..ec108c2 100644 --- a/gcc/tree-ssa-loop-niter.c +++ b/gcc/tree-ssa-loop-niter.c @@ -3011,6 +3011,26 @@ estimate_numbers_of_iterations (bool use_undefined_p) fold_undefer_and_ignore_overflow_warnings (); } +/* Mark LOOP as a non-rolling loop. */ + +void +mark_non_rolling_loop (struct loop *loop) +{ + gcc_assert (loop && loop->header); + loop->header->flags |= BB_HEADER_OF_NONROLLING_LOOP; +} + +/* Return true if LOOP is a non-rolling loop. */ + +bool +non_rolling_loop_p (struct loop *loop) +{ + int masked_flags; + gcc_assert (loop && loop->header); + masked_flags = (loop->header->flags & BB_HEADER_OF_NONROLLING_LOOP); + return (masked_flags != 0); +} + /* Returns true if statement S1 dominates statement S2. */ bool diff --git a/gcc/tree-vect-loop-manip.c b/gcc/tree-vect-loop-manip.c index 28b75f1..9bbe68b 100644 --- a/gcc/tree-vect-loop-manip.c +++ b/gcc/tree-vect-loop-manip.c @@ -1938,6 +1938,10 @@ vect_do_peeling_for_loop_bound (loop_vec_info loop_vinfo, tree *ratio, cond_expr, cond_expr_stmt_list); gcc_assert (new_loop); gcc_assert (loop_num == loop->num); + + /* NEW_LOOP is a non-rolling loop. */ + mark_non_rolling_loop (new_loop); + #ifdef ENABLE_CHECKING slpeel_verify_cfg_after_peeling (loop, new_loop); #endif @@ -2191,6 +2195,10 @@ vect_do_peeling_for_alignment (loop_vec_info loop_vinfo) th, true, NULL_TREE, NULL); gcc_assert (new_loop); + + /* NEW_LOOP is a non-rolling loop. */ + mark_non_rolling_loop (new_loop); + #ifdef ENABLE_CHECKING slpeel_verify_cfg_after_peeling (new_loop, loop); #endif -- 1.6.3.3