From patchwork Wed Nov 13 11:24:54 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom de Vries X-Patchwork-Id: 290895 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)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 6297C2C008A for ; Wed, 13 Nov 2013 22:28:33 +1100 (EST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :message-id:date:from:mime-version:to:cc:subject:references :in-reply-to:content-type; q=dns; s=default; b=hfoK0QLH4+Z0NVOkg XMiVzvBvCqhgj4jxa9ypUJgkkAVQHxTYBu4It4kuoRBQ3L32gSH5CvBE6W4OAdsx c5hcnwqF0o7Y8CjyYzA7WjcTSmSPWacY+itncSRxnvzdDJTke67dr2VDvOaql95v XmNDDT+v5XNieF3zLek2Asv5Fo= 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 :message-id:date:from:mime-version:to:cc:subject:references :in-reply-to:content-type; s=default; bh=wJCr3zonaOOMWP7Y/fIFghb z3Ps=; b=TzIX/n5PecL0L083Ky5DnBPcrxygh6frh304RX3Q2NABQVAXGdk6d7s 1byhqN8pHZqHmirh6XBf4K47kcsx0ECfyqJcMWt9BJ5mej65VM9In9/xZy0DYPMZ 6TDUxoloUG2aTfYOAZxJLYOKDKRLEB+X0eesIzS9dJE6hQGqd1OI= Received: (qmail 22035 invoked by alias); 13 Nov 2013 11:26:57 -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 22006 invoked by uid 89); 13 Nov 2013 11:26:56 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-0.2 required=5.0 tests=AWL, BAYES_50, RDNS_NONE, URIBL_BLOCKED autolearn=no version=3.3.2 X-HELO: relay1.mentorg.com Received: from Unknown (HELO relay1.mentorg.com) (192.94.38.131) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 13 Nov 2013 11:25:14 +0000 Received: from svr-orw-fem-01.mgc.mentorg.com ([147.34.98.93]) by relay1.mentorg.com with esmtp id 1VgYZ8-0007Eo-FU from Tom_deVries@mentor.com ; Wed, 13 Nov 2013 03:24:58 -0800 Received: from SVR-IES-FEM-02.mgc.mentorg.com ([137.202.0.106]) by svr-orw-fem-01.mgc.mentorg.com over TLS secured channel with Microsoft SMTPSVC(6.0.3790.4675); Wed, 13 Nov 2013 03:24:58 -0800 Received: from [127.0.0.1] (137.202.0.76) by SVR-IES-FEM-02.mgc.mentorg.com (137.202.0.106) with Microsoft SMTP Server id 14.2.247.3; Wed, 13 Nov 2013 11:24:56 +0000 Message-ID: <52836186.4020304@mentor.com> Date: Wed, 13 Nov 2013 12:24:54 +0100 From: Tom de Vries User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: Richard Biener CC: Subject: Re: [PATCH] Factor out gimple_dont_merge_p References: <527E590A.9060608@mentor.com> In-Reply-To: On 11-11-13 10:37, Richard Biener wrote: > On Sat, 9 Nov 2013, Tom de Vries wrote: > >> Richard, >> >> This patch factors out gimple_dont_merge_p from gimple_equal_p and >> find_duplicate. >> >> Bootstrapped and regtested on x86_64. >> >> OK for trunk? > > +static bool > +gimple_dont_merge_p (gimple stmt) > +{ > + switch (gimple_code (stmt)) > + { > + case GIMPLE_CALL: > + /* Eventually, we'll significantly complicate the CFG by adding > + back edges to properly model the effects of transaction restart. > + For the bulk of optimization this does not matter, but what we > + cannot recover from is tail merging blocks between two separate > + transactions. Avoid that by making commit not match. */ > + if (gimple_call_builtin_p (stmt, BUILT_IN_TM_COMMIT)) > + return true; > + > + /* We cannot tail-merge the builtins that end transactions. > + ??? The alternative being unsharing of BBs in the tm_init pass. > */ > + if (flag_tm > + && (gimple_call_flags (stmt) & ECF_TM_BUILTIN) > + && is_tm_ending_fndecl (gimple_call_fndecl (stmt))) > + return true; > > > 1) BUILT_IN_TM_COMMIT is handled in is_tm_ending_fndecl, > 2) fndecl may be NULL > > I'd simply get rid of gimple_dont_merge_p and call a > is_tm_ending (gimple) function you'd add to TM. > Richard, I've update the patch according to comments, bootstrapped and reg-tested. OK for trunk? Thanks, - Tom 2013-11-06 Tom de Vries * trans-mem.c (is_tm_ending): New function. * gimple.h (is_tm_ending): Declare. * tree-ssa-tail-merge.c (gimple_equal_p): Remove test on BUILT_IN_TM_COMMIT. (find_duplicate): Use is_tm_ending instead of is_tm_ending_fndecl. diff --git a/gcc/gimple.h b/gcc/gimple.h index 33e790c..8f902b9 100644 --- a/gcc/gimple.h +++ b/gcc/gimple.h @@ -1043,6 +1043,7 @@ extern bool infer_nonnull_range (gimple, tree); /* In trans-mem.c. */ extern void diagnose_tm_safe_errors (tree); extern void compute_transaction_bits (void); +extern bool is_tm_ending (gimple); /* In tree-nested.c. */ extern void lower_nested_functions (tree); diff --git a/gcc/trans-mem.c b/gcc/trans-mem.c index 784ff24..7dca40e 100644 --- a/gcc/trans-mem.c +++ b/gcc/trans-mem.c @@ -321,6 +321,22 @@ is_tm_ending_fndecl (tree fndecl) return false; } +/* Return true if STMT is a built in function call that "ends" a + transaction. */ + +bool +is_tm_ending (gimple stmt) +{ + tree fndecl; + + if (gimple_code (stmt) != GIMPLE_CALL) + return false; + + fndecl = gimple_call_fndecl (stmt); + return (fndecl != NULL_TREE + && is_tm_ending_fndecl (fndecl)); +} + /* Return true if STMT is a TM load. */ static bool diff --git a/gcc/tree-ssa-tail-merge.c b/gcc/tree-ssa-tail-merge.c index 00dd071..15356bd 100644 --- a/gcc/tree-ssa-tail-merge.c +++ b/gcc/tree-ssa-tail-merge.c @@ -1099,14 +1099,6 @@ gimple_equal_p (same_succ same_succ, gimple s1, gimple s2) if (!gimple_call_same_target_p (s1, s2)) return false; - /* Eventually, we'll significantly complicate the CFG by adding - back edges to properly model the effects of transaction restart. - For the bulk of optimization this does not matter, but what we - cannot recover from is tail merging blocks between two separate - transactions. Avoid that by making commit not match. */ - if (gimple_call_builtin_p (s1, BUILT_IN_TM_COMMIT)) - return false; - for (i = 0; i < gimple_call_num_args (s1); ++i) { t1 = gimple_call_arg (s1, i); @@ -1220,15 +1212,14 @@ find_duplicate (same_succ same_succ, basic_block bb1, basic_block bb2) gimple stmt1 = gsi_stmt (gsi1); gimple stmt2 = gsi_stmt (gsi2); - if (!gimple_equal_p (same_succ, stmt1, stmt2)) + /* What could be better than to this this here is to blacklist the bb + containing the stmt, when encountering the stmt f.i. in + same_succ_hash. */ + if (is_tm_ending (stmt1) + || is_tm_ending (stmt2)) return; - // We cannot tail-merge the builtins that end transactions. - // ??? The alternative being unsharing of BBs in the tm_init pass. - if (flag_tm - && is_gimple_call (stmt1) - && (gimple_call_flags (stmt1) & ECF_TM_BUILTIN) - && is_tm_ending_fndecl (gimple_call_fndecl (stmt1))) + if (!gimple_equal_p (same_succ, stmt1, stmt2)) return; gsi_prev_nondebug (&gsi1);