From patchwork Thu Jul 15 19:03:14 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 59030 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 AD817B6F1B for ; Fri, 16 Jul 2010 05:03:31 +1000 (EST) Received: (qmail 24187 invoked by alias); 15 Jul 2010 19:03:29 -0000 Received: (qmail 23818 invoked by uid 22791); 15 Jul 2010 19:03:27 -0000 X-SWARE-Spam-Status: No, hits=-5.2 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_HI, SPF_HELO_PASS, T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 15 Jul 2010 19:03:17 +0000 Received: from int-mx05.intmail.prod.int.phx2.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.18]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id o6FJ3FbP009116 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 15 Jul 2010 15:03:15 -0400 Received: from anchor.twiddle.home (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx05.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id o6FJ3Eex030788; Thu, 15 Jul 2010 15:03:15 -0400 Message-ID: <4C3F5B72.3030201@redhat.com> Date: Thu, 15 Jul 2010 12:03:14 -0700 From: Richard Henderson User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.10) Gecko/20100621 Fedora/3.0.5-1.fc13 Thunderbird/3.0.5 MIME-Version: 1.0 To: Jan Hubicka CC: GCC Patches , rguenther@suse.de Subject: [RFA] Switch cgraph to IPA_SSA state reliably 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 This is a piece of the emutls rewrite. The ipa_lower_emutls pass is placed at the end of all_small_ipa_passes. This position allows the OMP and profile passes within pass_early_local_passes to create new TLS variables without having to worry about emutls at all. The ipa_lower_emutls pass may create one new function: a constructor to perform the runtime initialization of any DECL_COMMON tls variables. Creating this constructor during the IPA pass is easier and tidier than the existing method of creating it at the end of compilation. However, this exposes a problem with cgraph_state: it isn't updated properly. When ipa_lower_emutls runs, cgraph_state == IPA but not IPA_SSA, despite the fact that all functions *are* in SSA form. Further, the new function is never placed in SSA form by cgraph_process_new_functions, so when we get to pass_all_optimizations we crash due to SSA state not being allocated. I'm not sure of the logic behind switching cgraph_state in pass_all_early_optimizations. For whatever reason, it's not working. Simply moving the state change to pass_early_local_passes does the trick, however. Bootstrap is continuing on amd64-linux. Ok for mainline if it passes? r~ * cgraphunit.c (ipa_passes): Assert we're already in IPA_SSA state, rather than forcing it. * tree-optimize.c (execute_early_local_optimizations): Remove. (execute_all_early_local_passes): Add. Adjust passes to match. diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c index 47f8f76..cf58a75 100644 --- a/gcc/cgraphunit.c +++ b/gcc/cgraphunit.c @@ -1850,10 +1850,8 @@ ipa_passes (void) if (!in_lto_p) execute_ipa_pass_list (all_small_ipa_passes); - /* If pass_all_early_optimizations was not scheduled, the state of - the cgraph will not be properly updated. Update it now. */ - if (cgraph_state < CGRAPH_STATE_IPA_SSA) - cgraph_state = CGRAPH_STATE_IPA_SSA; + /* We should have run pass_early_local_passes, which updated this state. */ + gcc_assert (cgraph_state >= CGRAPH_STATE_IPA_SSA); if (!in_lto_p) { diff --git a/gcc/tree-optimize.c b/gcc/tree-optimize.c index e736b4f..5df3fdb 100644 --- a/gcc/tree-optimize.c +++ b/gcc/tree-optimize.c @@ -87,13 +87,27 @@ gate_all_early_local_passes (void) return (!seen_error () && !in_lto_p); } +static unsigned int +execute_all_early_local_passes (void) +{ + /* Once this pass (and its sub-passes) are complete, all functions + will be in SSA form. Technically this state change is happening + a tad early, since the sub-passes have not yet run, but since + none of the sub-passes are IPA passes and do not create new + functions, this is ok. We're setting this value for the benefit + of IPA passes that follow. */ + if (cgraph_state < CGRAPH_STATE_IPA_SSA) + cgraph_state = CGRAPH_STATE_IPA_SSA; + return 0; +} + struct simple_ipa_opt_pass pass_early_local_passes = { { SIMPLE_IPA_PASS, "early_local_cleanups", /* name */ gate_all_early_local_passes, /* gate */ - NULL, /* execute */ + execute_all_early_local_passes, /* execute */ NULL, /* sub */ NULL, /* next */ 0, /* static_pass_number */ @@ -106,18 +120,6 @@ struct simple_ipa_opt_pass pass_early_local_passes = } }; -static unsigned int -execute_early_local_optimizations (void) -{ - /* First time we start with early optimization we need to advance - cgraph state so newly inserted functions are also early optimized. - However we execute early local optimizations for lately inserted - functions, in that case don't reset cgraph state back to IPA_SSA. */ - if (cgraph_state < CGRAPH_STATE_IPA_SSA) - cgraph_state = CGRAPH_STATE_IPA_SSA; - return 0; -} - /* Gate: execute, or not, all of the non-trivial optimizations. */ static bool @@ -134,7 +136,7 @@ struct gimple_opt_pass pass_all_early_optimizations = GIMPLE_PASS, "early_optimizations", /* name */ gate_all_early_optimizations, /* gate */ - execute_early_local_optimizations, /* execute */ + NULL, /* execute */ NULL, /* sub */ NULL, /* next */ 0, /* static_pass_number */