From patchwork Thu Nov 12 16:44:16 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bradley Lucier X-Patchwork-Id: 543448 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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id DCD5B141434 for ; Fri, 13 Nov 2015 03:44:29 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b=kiCuUZlW; dkim-atps=neutral DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:cc:to :from:subject:message-id:date:mime-version:content-type; q=dns; s=default; b=eepIfMzmn8Yq790MTOIAUk/p+a4XRTRx9U2/AtZ7Rlmymw1S7J hxctWq66G76ZobZntsSoBgtlqQaUqXlqBYsUgwESKBVF14XlV+VCdgx0dyXHo6Vi ELehVy6mqr5fF3/gT3iXxCFeigObACXC/I9aInAcoi3kkvV52XY+fz4jY= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:cc:to :from:subject:message-id:date:mime-version:content-type; s= default; bh=nJA/mBVqIRhktVlXDjdFbg9hAco=; b=kiCuUZlWZmWtEFskM485 Ybeccw2nz+WTcXXNdIMJc9z/9j9QCMbJPY23YXbUD4wx/Cky0zzNfuC0V9epEke+ +H2fhov2sty5X9NKzwERKFWpivs6hRVCxS1uIAGNO5V6SoymfckBgSMp9MWPbH7N VCOPHN9iNSKwsW+kLul7WVs= Received: (qmail 36043 invoked by alias); 12 Nov 2015 16:44:21 -0000 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 Received: (qmail 36031 invoked by uid 89); 12 Nov 2015 16:44:20 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.2 required=5.0 tests=AWL, BAYES_00, KAM_ASCII_DIVIDERS, KAM_LAZY_DOMAIN_SECURITY, RCVD_IN_DNSWL_LOW, RP_MATCHES_RCVD autolearn=no version=3.3.2 X-HELO: mailhub247.itcs.purdue.edu Received: from mailhub247.itcs.purdue.edu (HELO mailhub247.itcs.purdue.edu) (128.210.5.247) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-SHA encrypted) ESMTPS; Thu, 12 Nov 2015 16:44:19 +0000 Received: from [10.0.1.12] (c-24-12-4-162.hsd1.in.comcast.net [24.12.4.162]) (authenticated bits=0) by mailhub247.itcs.purdue.edu (8.14.4/8.14.4/mta-auth.smtp.purdue.edu) with ESMTP id tACGiGdm017253 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NOT); Thu, 12 Nov 2015 11:44:16 -0500 Cc: Bradley Lucier To: gcc-patches@gcc.gnu.org From: Bradley Lucier Subject: [PATCH] Make disabled-optimization warning more informative; increase default max-gcse-memory Message-ID: <5644C1E0.7060307@math.purdue.edu> Date: Thu, 12 Nov 2015 11:44:16 -0500 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.3.0 MIME-Version: 1.0 X-PerlMx-URL-Scanned: Yes X-PerlMx-Virus-Scanned: Yes This patch (a) removes an exact copy of is_too_expensive from cprop.c, (b) renames is_too_expensive in gcse.c to gcse_or_cprop_is_too_expensive, (c) expands the warning in gcse_or_cprop_is_too_expensive to say how much --param max-gcse-memory needs to be increased, and (d) increases the default max-gcse-memory from 50MB to 128MB. The expanded warning allowed me to see how much memory really was needed to apply gcse to some of my routines, and 128MB fixes my problem. The limit has been 50MB for over 10 years, I think we can up it a bit now. Bootstrapped and checked, default languages, no regressions. Brad * gcc/cprop.c (is_too_expensive): Remove. (gcse.h): Include. (one_cprop_pass): Call gcse_or_cprop_is_too_expensive, not is_too_expensive. * gcc/gcse.h (gcse_or_cprop_is_too_expensive): Declare. * gcc/gcse.c (is_too_expensive): Rename to ... (gcse_or_cprop_is_too_expensive): ... this. Expand warning to add required size of max-gcse-memory. (one_pre_gcse_pass): Use it. (one_code_hoisting_pass): Use it. * gcc/params.def (max-gcse-memory): Increase from 50MB to 128MB. Index: gcc/gcse.c =================================================================== --- gcc/gcse.c (revision 230136) +++ gcc/gcse.c (working copy) @@ -510,7 +510,6 @@ static void update_ld_motion_stores (struct gcse_expr *); static void clear_modify_mem_tables (void); static void free_modify_mem_tables (void); -static bool is_too_expensive (const char *); #define GNEW(T) ((T *) gmalloc (sizeof (T))) #define GCNEW(T) ((T *) gcalloc (1, sizeof (T))) @@ -2565,7 +2564,7 @@ /* Return if there's nothing to do, or it is too expensive. */ if (n_basic_blocks_for_fn (cfun) <= NUM_FIXED_BLOCKS + 1 - || is_too_expensive (_("PRE disabled"))) + || gcse_or_cprop_is_too_expensive (_("PRE disabled"))) return 0; /* We need alias. */ @@ -3493,7 +3492,7 @@ /* Return if there's nothing to do, or it is too expensive. */ if (n_basic_blocks_for_fn (cfun) <= NUM_FIXED_BLOCKS + 1 - || is_too_expensive (_("GCSE disabled"))) + || gcse_or_cprop_is_too_expensive (_("GCSE disabled"))) return 0; doing_code_hoisting_p = true; @@ -3957,9 +3956,13 @@ /* Return true if the graph is too expensive to optimize. PASS is the optimization about to be performed. */ -static bool -is_too_expensive (const char *pass) +bool +gcse_or_cprop_is_too_expensive (const char *pass) { + unsigned int memory_request = n_basic_blocks_for_fn (cfun) + * SBITMAP_SET_SIZE (max_reg_num ()) + * sizeof (SBITMAP_ELT_TYPE); + /* Trying to perform global optimizations on flow graphs which have a high connectivity will take a long time and is unlikely to be particularly useful. @@ -3981,13 +3984,12 @@ /* If allocating memory for the dataflow bitmaps would take up too much storage it's better just to disable the optimization. */ - if ((n_basic_blocks_for_fn (cfun) - * SBITMAP_SET_SIZE (max_reg_num ()) - * sizeof (SBITMAP_ELT_TYPE)) > MAX_GCSE_MEMORY) + if (memory_request > MAX_GCSE_MEMORY) { warning (OPT_Wdisabled_optimization, - "%s: %d basic blocks and %d registers", - pass, n_basic_blocks_for_fn (cfun), max_reg_num ()); + "%s: %d basic blocks and %d registers; increase --param max-gcse-memory above %d", + pass, n_basic_blocks_for_fn (cfun), max_reg_num (), + memory_request); return true; } Index: gcc/gcse.h =================================================================== --- gcc/gcse.h (revision 230136) +++ gcc/gcse.h (working copy) @@ -40,5 +40,6 @@ #endif void gcse_c_finalize (void); +extern bool gcse_or_cprop_is_too_expensive (const char *); #endif Index: gcc/cprop.c =================================================================== --- gcc/cprop.c (revision 230136) +++ gcc/cprop.c (working copy) @@ -39,6 +39,7 @@ #include "tree-pass.h" #include "dbgcnt.h" #include "cfgloop.h" +#include "gcse.h" /* An obstack for our working variables. */ @@ -1724,47 +1725,6 @@ return changed; } -/* Return true if the graph is too expensive to optimize. PASS is the - optimization about to be performed. */ - -static bool -is_too_expensive (const char *pass) -{ - /* Trying to perform global optimizations on flow graphs which have - a high connectivity will take a long time and is unlikely to be - particularly useful. - - In normal circumstances a cfg should have about twice as many - edges as blocks. But we do not want to punish small functions - which have a couple switch statements. Rather than simply - threshold the number of blocks, uses something with a more - graceful degradation. */ - if (n_edges_for_fn (cfun) > 20000 + n_basic_blocks_for_fn (cfun) * 4) - { - warning (OPT_Wdisabled_optimization, - "%s: %d basic blocks and %d edges/basic block", - pass, n_basic_blocks_for_fn (cfun), - n_edges_for_fn (cfun) / n_basic_blocks_for_fn (cfun)); - - return true; - } - - /* If allocating memory for the cprop bitmap would take up too much - storage it's better just to disable the optimization. */ - if ((n_basic_blocks_for_fn (cfun) - * SBITMAP_SET_SIZE (max_reg_num ()) - * sizeof (SBITMAP_ELT_TYPE)) > MAX_GCSE_MEMORY) - { - warning (OPT_Wdisabled_optimization, - "%s: %d basic blocks and %d registers", - pass, n_basic_blocks_for_fn (cfun), max_reg_num ()); - - return true; - } - - return false; -} - /* Main function for the CPROP pass. */ static int @@ -1775,7 +1735,7 @@ /* Return if there's nothing to do, or it is too expensive. */ if (n_basic_blocks_for_fn (cfun) <= NUM_FIXED_BLOCKS + 1 - || is_too_expensive (_ ("const/copy propagation disabled"))) + || gcse_or_cprop_is_too_expensive (_ ("const/copy propagation disabled"))) return 0; global_const_prop_count = local_const_prop_count = 0; Index: gcc/params.def =================================================================== --- gcc/params.def (revision 230136) +++ gcc/params.def (working copy) @@ -218,7 +218,7 @@ DEFPARAM(PARAM_MAX_GCSE_MEMORY, "max-gcse-memory", "The maximum amount of memory to be allocated by GCSE.", - 50 * 1024 * 1024, 0, 0) + 128 * 1024 * 1024, 0, 0) /* The GCSE optimization of an expression will avoided if the ratio of insertions to deletions is greater than this value. */