From patchwork Wed Oct 14 03:25:19 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexandre Oliva X-Patchwork-Id: 529992 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 877C314029E for ; Wed, 14 Oct 2015 14:26:00 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b=faZeJXJR; 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:from :to:cc:subject:references:date:in-reply-to:message-id :mime-version:content-type; q=dns; s=default; b=O+KKGVgb7H+aijQ8 xezm5Hzq/FBwKbqwC11fVuIUgBwtEvf4BnIr8lAR5RGFvnE8/7e0zySZEKl7UBvA MLeFddm4jCepM+mxsnqyXtAUyTPIQXfKWR0EWptGJJ/6RqGezLdAzY4P3gSBYAiK 7/IesoXduW79JNUo6jRlSX5mx3c= 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:from :to:cc:subject:references:date:in-reply-to:message-id :mime-version:content-type; s=default; bh=7MhV30mk5vka0nl7QJ4OSi n6rp0=; b=faZeJXJRuCN1cCWmDXHDGP2KvLJQuOXUzyhrfPi3V8VOUgH561itjp gR3v710nKQ51afN850t74wR7KA2zwWIv6HXMcLwuH2SORifStrszYjKDkdGK0t8J 7lo9iB3N2rpoIuJGb37IK12NQylsBcqZShiiDSSbNTQOcJi2UoklI= Received: (qmail 5103 invoked by alias); 14 Oct 2015 03:25:51 -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 5083 invoked by uid 89); 14 Oct 2015 03:25:49 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.7 required=5.0 tests=AWL, BAYES_00, SPF_HELO_PASS, T_RP_MATCHES_RCVD autolearn=ham version=3.3.2 X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-GCM-SHA384 encrypted) ESMTPS; Wed, 14 Oct 2015 03:25:47 +0000 Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id F0696319B30; Wed, 14 Oct 2015 03:25:45 +0000 (UTC) Received: from freie.home (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t9E3PgZP024911 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Tue, 13 Oct 2015 23:25:43 -0400 Received: from livre.home (livre.home [172.31.160.2]) by freie.home (8.14.9/8.14.9) with ESMTP id t9E3PJ5F023215; Wed, 14 Oct 2015 00:25:20 -0300 From: Alexandre Oliva To: Richard Biener Cc: =?utf-8?Q?Uro=C5=A1?= Bizjak , Alan Lawrence , Jeff Law , James Greenhalgh , "H.J. Lu" , Segher Boessenkool , GCC Patches , Christophe Lyon , David Edelsohn , Eric Botcazou Subject: Re: [PR67891] drop is_gimple_reg test from set_parm_rtl References: <20150810082355.GA31149@arm.com> <55C8BFC3.3030603@redhat.com> <55E72D4C.40705@arm.com> <55FC3171.7040509@arm.com> Date: Wed, 14 Oct 2015 00:25:19 -0300 In-Reply-To: (Richard Biener's message of "Mon, 12 Oct 2015 12:21:58 +0200") Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.5 (gnu/linux) MIME-Version: 1.0 On Oct 12, 2015, Richard Biener wrote: > On Sat, Oct 10, 2015 at 3:16 PM, Alexandre Oliva wrote: >> On Oct 9, 2015, Richard Biener wrote: >> >>> Ok. Note that I think emit_block_move shouldn't mess with the addressable flag. >> >> I have successfully tested a patch that stops it from doing so, >> reverting https://gcc.gnu.org/bugzilla/show_bug.cgi?id=49429#c11 but >> according to bugs 49429 and 49454, it looks like removing it would mess >> with escape analysis introduced in r175063 for bug 44194. The thread >> that introduces the mark_addressable calls suggests some discomfort with >> this solution, and even a suggestion that the markings should be >> deferred past the end of expand, but in the end there was agreement to >> go with it. https://gcc.gnu.org/ml/gcc-patches/2011-06/msg01746.html > Aww, indeed. Of course the issue is that we don't track pointers to the > stack introduced during RTL properly. > Thanks for checking. Might want to add a comment before that > addressable setting now that you've done the archeology. I decided to give the following approach a try instead. The following patch was regstrapped on x86_64-linux-gnu and i686-linux-gnu. Ok to install? Would anyone with access to hpux (pa and ia64 are both affected) give it a spin? defer mark_addressable calls during expand till the end of expand From: Alexandre Oliva for gcc/ChangeLog * gimple-expr.c: Include hash-set.h and rtl.h. (mark_addressable_queue): New var. (mark_addressable): Factor actual marking into... (mark_addressable_1): ... this. Queue it up during expand. (mark_addressable_2): New. (flush_mark_addressable_queue): New. * gimple-expr.h (flush_mark_addressable_queue): Declare. * cfgexpand.c: Include gimple-expr.h. (pass_expand::execute): Flush mark_addressable queue. --- gcc/cfgexpand.c | 3 +++ gcc/gimple-expr.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++-- gcc/gimple-expr.h | 1 + 3 files changed, 52 insertions(+), 2 deletions(-) diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c index eaad859..a362e17 100644 --- a/gcc/cfgexpand.c +++ b/gcc/cfgexpand.c @@ -51,6 +51,7 @@ along with GCC; see the file COPYING3. If not see #include "internal-fn.h" #include "tree-eh.h" #include "gimple-iterator.h" +#include "gimple-expr.h" #include "gimple-walk.h" #include "cgraph.h" #include "tree-cfg.h" @@ -6373,6 +6374,8 @@ pass_expand::execute (function *fun) /* We're done expanding trees to RTL. */ currently_expanding_to_rtl = 0; + flush_mark_addressable_queue (); + FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR_FOR_FN (fun)->next_bb, EXIT_BLOCK_PTR_FOR_FN (fun), next_bb) { diff --git a/gcc/gimple-expr.c b/gcc/gimple-expr.c index 2a6ba1a..db249a3 100644 --- a/gcc/gimple-expr.c +++ b/gcc/gimple-expr.c @@ -35,6 +35,8 @@ along with GCC; see the file COPYING3. If not see #include "gimplify.h" #include "stor-layout.h" #include "demangle.h" +#include "hash-set.h" +#include "rtl.h" /* ----- Type related ----- */ @@ -823,6 +825,50 @@ is_gimple_mem_ref_addr (tree t) || decl_address_invariant_p (TREE_OPERAND (t, 0))))); } +/* Hold trees marked addressable during expand. */ + +static hash_set *mark_addressable_queue; + +/* Mark X as addressable or queue it up if called during expand. */ + +static void +mark_addressable_1 (tree x) +{ + if (!currently_expanding_to_rtl) + { + TREE_ADDRESSABLE (x) = 1; + return; + } + + if (!mark_addressable_queue) + mark_addressable_queue = new hash_set(); + mark_addressable_queue->add (x); +} + +/* Adaptor for mark_addressable_1 for use in hash_set traversal. */ + +bool +mark_addressable_2 (tree const &x, void * ATTRIBUTE_UNUSED = NULL) +{ + mark_addressable_1 (x); + return false; +} + +/* Mark all queued trees as addressable, and empty the queue. To be + called right after clearing CURRENTLY_EXPANDING_TO_RTL. */ + +void +flush_mark_addressable_queue () +{ + gcc_assert (!currently_expanding_to_rtl); + if (mark_addressable_queue) + { + mark_addressable_queue->traverse (NULL); + delete mark_addressable_queue; + mark_addressable_queue = NULL; + } +} + /* Mark X addressable. Unlike the langhook we expect X to be in gimple form and we don't do any syntax checking. */ @@ -838,7 +884,7 @@ mark_addressable (tree x) && TREE_CODE (x) != PARM_DECL && TREE_CODE (x) != RESULT_DECL) return; - TREE_ADDRESSABLE (x) = 1; + mark_addressable_1 (x); /* Also mark the artificial SSA_NAME that points to the partition of X. */ if (TREE_CODE (x) == VAR_DECL @@ -849,7 +895,7 @@ mark_addressable (tree x) { tree *namep = cfun->gimple_df->decls_to_pointers->get (x); if (namep) - TREE_ADDRESSABLE (*namep) = 1; + mark_addressable_1 (*namep); } } diff --git a/gcc/gimple-expr.h b/gcc/gimple-expr.h index 3d1c89f..2917d2752c 100644 --- a/gcc/gimple-expr.h +++ b/gcc/gimple-expr.h @@ -52,6 +52,7 @@ extern bool is_gimple_asm_val (tree); extern bool is_gimple_min_lval (tree); extern bool is_gimple_call_addr (tree); extern bool is_gimple_mem_ref_addr (tree); +extern void flush_mark_addressable_queue (void); extern void mark_addressable (tree); extern bool is_gimple_reg_rhs (tree);