From patchwork Tue May 10 16:19:34 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ilya Enkovich X-Patchwork-Id: 620735 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 3r44HT45ynz9t47 for ; Wed, 11 May 2016 02:20:52 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b=f+N/z1HU; 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:date :from:to:subject:message-id:mime-version:content-type; q=dns; s= default; b=IDG3TWc/5DS+oOw8km8H7JFZhNGSqgCiIEMHlybtj/IZbY/CO8AAw 1nVJPC2azLoXLB9ycbvR3vmuF4TM25RMkPzJAjdm6pEMhkeNzmbqm4mZVz/9uCUB 0zeaofAjAr1sZmcpRWYaeSFdg+YV+OVBj3+in4VNwvg/TtJ6z/psNc= 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:date :from:to:subject:message-id:mime-version:content-type; s= default; bh=dMO5E5Q24ziWmnVqOO+0amhSEfE=; b=f+N/z1HUvcCcBxSESww+ T/HrV2CJxVrnT0TjlOyIpt0Kt93FZFe+DS0E6D1yTBkANT8bUhciWJttMN9LV1kL 0O33QILk36DzqAgM1mvAl2trxoMUIAMwou4j+4+mGcECLaNhAJYoFF/zh2GaWvX5 oZVgvfeyScXQLHmMff4BUoU= Received: (qmail 7209 invoked by alias); 10 May 2016 16:20:45 -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 7195 invoked by uid 89); 10 May 2016 16:20:44 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.6 required=5.0 tests=BAYES_00, FREEMAIL_FROM, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=ham version=3.3.2 spammy=ilya.enkovich@intel.com, ilyaenkovichintelcom, sk:05476f3, fwprop X-HELO: mail-wm0-f66.google.com Received: from mail-wm0-f66.google.com (HELO mail-wm0-f66.google.com) (74.125.82.66) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-GCM-SHA256 encrypted) ESMTPS; Tue, 10 May 2016 16:20:33 +0000 Received: by mail-wm0-f66.google.com with SMTP id e201so3511505wme.2 for ; Tue, 10 May 2016 09:20:33 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:date:from:to:subject:message-id:mime-version :content-disposition:user-agent; bh=hf3I+c9cIVQJXArbEcjnf4d8YDvwY/WSNLUG4Ft4EBs=; b=GI0e/8j3vV0my3EOzYvcWn7DgXCfedU4lJavr5Y7nd3nZSHC6+7vVqXAYYiIp8L0O7 7waSxCAPNflPm4VnVNC68vzD6ok1I5rc730NPiGDLpFl/KAd9YFgzDwRFZudxp8CrMXn u6pvNBhQj/uCqrCqepVxqz9c2xVUsjD+DF0giPNOuQiAuy9LCZnpZiU8BPp2mC9/jj+a cFFC33Rioe4Fe5G8BAofydzkjeg3IXHxaKNzeeMcUSalhzsbEzfEYyL6NhrRyPeY1hET UDkzKpnfOK3kDYXeyi572XR/dMCeh1+dso3moCJCk30LtmJlJqnm1bchFGWHOVdI9RHX dNDg== X-Gm-Message-State: AOPr4FXMHlO6mkOqzBAcCtM9cVbLZo6xoyuwV9fE2xSnHt4P7/ugBxfolZbOlXyzouH2pQ== X-Received: by 10.194.51.8 with SMTP id g8mr39794699wjo.15.1462897230864; Tue, 10 May 2016 09:20:30 -0700 (PDT) Received: from msticlxl57.ims.intel.com (irdmzpr02-ext.ir.intel.com. [192.198.151.37]) by smtp.gmail.com with ESMTPSA id q125sm3778586wmd.19.2016.05.10.09.20.29 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 10 May 2016 09:20:30 -0700 (PDT) Date: Tue, 10 May 2016 19:19:34 +0300 From: Ilya Enkovich To: gcc-patches@gcc.gnu.org Subject: [PATCH, PR middle-end/70807] Free dominance info in CSE pass Message-ID: <20160510161934.GD46462@msticlxl57.ims.intel.com> MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.5.23 (2014-03-12) X-IsSubscribed: yes Hi, Curretly CSE may modify CFG and leave invalid dominance info. This patch improves track of CFG changes by CSE passes and frees dominance info if required. This allows to remove corresponding workaround from STV pass. Does it look OK? Bootstrapped and regtested on x86-64-unknown-linux-gnu. Thanks, Ilya --- gcc/ 2016-05-10 Ilya Enkovich PR middle-end/70807 * cfgrtl.h (delete_insn_and_edges): Now return bool. * cfgrtl.c (delete_insn_and_edges): Likewise. * config/i386/i386.c (convert_scalars_to_vector): Remove redundant code. * cse.c (cse_insn): Compute cse_cfg_altered. (delete_trivially_dead_insns): Likewise. (cse_cc_succs): Likewise. (rest_of_handle_cse): Free dominance info if required. (rest_of_handle_cse2): Likewise. (rest_of_handle_cse_after_global_opts): Likewise. gcc/testsuite/ 2016-05-10 Ilya Enkovich PR middle-end/70807 * gcc.dg/pr70807.c: New test. diff --git a/gcc/cfgrtl.c b/gcc/cfgrtl.c index 62b0596..3d8ed60 100644 --- a/gcc/cfgrtl.c +++ b/gcc/cfgrtl.c @@ -215,9 +215,10 @@ delete_insn (rtx uncast_insn) } } -/* Like delete_insn but also purge dead edges from BB. */ +/* Like delete_insn but also purge dead edges from BB. + Return true if any edges are eliminated. */ -void +bool delete_insn_and_edges (rtx_insn *insn) { bool purge = false; @@ -228,7 +229,8 @@ delete_insn_and_edges (rtx_insn *insn) purge = true; delete_insn (insn); if (purge) - purge_dead_edges (BLOCK_FOR_INSN (insn)); + return purge_dead_edges (BLOCK_FOR_INSN (insn)); + return false; } /* Unlink a chain of insns between START and FINISH, leaving notes diff --git a/gcc/cfgrtl.h b/gcc/cfgrtl.h index 0d88024..d81928a 100644 --- a/gcc/cfgrtl.h +++ b/gcc/cfgrtl.h @@ -21,7 +21,7 @@ along with GCC; see the file COPYING3. If not see #define GCC_CFGRTL_H extern void delete_insn (rtx); -extern void delete_insn_and_edges (rtx_insn *); +extern bool delete_insn_and_edges (rtx_insn *); extern void delete_insn_chain (rtx, rtx, bool); extern basic_block create_basic_block_structure (rtx_insn *, rtx_insn *, rtx_note *, basic_block); diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 05476f3..7c023b7 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -3911,13 +3911,6 @@ convert_scalars_to_vector () bitmap_obstack_release (NULL); df_process_deferred_rescans (); - /* FIXME: Since the CSE pass may change dominance info, which isn't - expected by the fwprop pass, call free_dominance_info to - invalidate dominance info. Otherwise, the fwprop pass may crash - when dominance info is changed. */ - if (TARGET_64BIT) - free_dominance_info (CDI_DOMINATORS); - /* Conversion means we may have 128bit register spills/fills which require aligned stack. */ if (converted_insns) diff --git a/gcc/cse.c b/gcc/cse.c index 7456e84..04e1a85 100644 --- a/gcc/cse.c +++ b/gcc/cse.c @@ -5505,7 +5505,7 @@ cse_insn (rtx_insn *insn) else if (n_sets == 1 && dest == pc_rtx && src == pc_rtx) { /* One less use of the label this insn used to jump to. */ - delete_insn_and_edges (insn); + cse_cfg_altered |= delete_insn_and_edges (insn); cse_jumps_altered = true; /* No more processing for this set. */ sets[i].rtl = 0; @@ -5516,7 +5516,7 @@ cse_insn (rtx_insn *insn) { if (cfun->can_throw_non_call_exceptions && can_throw_internal (insn)) cse_cfg_altered = true; - delete_insn_and_edges (insn); + cse_cfg_altered |= delete_insn_and_edges (insn); /* No more processing for this set. */ sets[i].rtl = 0; } @@ -5551,7 +5551,7 @@ cse_insn (rtx_insn *insn) REG_NOTES (new_rtx) = note; } - delete_insn_and_edges (insn); + cse_cfg_altered |= delete_insn_and_edges (insn); insn = new_rtx; } else @@ -7131,7 +7131,7 @@ delete_trivially_dead_insns (rtx_insn *insns, int nreg) count_reg_usage (insn, counts, NULL_RTX, -1); ndead++; } - delete_insn_and_edges (insn); + cse_cfg_altered |= delete_insn_and_edges (insn); } } @@ -7427,7 +7427,7 @@ cse_cc_succs (basic_block bb, basic_block orig_bb, rtx cc_reg, rtx cc_src, newreg); } - delete_insn_and_edges (insns[i]); + cse_cfg_altered |= delete_insn_and_edges (insns[i]); } return mode; @@ -7568,6 +7568,9 @@ rest_of_handle_cse (void) else if (tem == 1 || optimize > 1) cleanup_cfg (0); + if (cse_cfg_altered && dom_info_available_p (CDI_DOMINATORS)) + free_dominance_info (CDI_DOMINATORS); + return 0; } @@ -7637,6 +7640,9 @@ rest_of_handle_cse2 (void) else if (tem == 1) cleanup_cfg (0); + if (cse_cfg_altered && dom_info_available_p (CDI_DOMINATORS)) + free_dominance_info (CDI_DOMINATORS); + cse_not_expected = 1; return 0; } @@ -7695,7 +7701,7 @@ rest_of_handle_cse_after_global_opts (void) rebuild_jump_labels (get_insns ()); tem = cse_main (get_insns (), max_reg_num ()); - purge_all_dead_edges (); + cse_cfg_altered |= purge_all_dead_edges (); delete_trivially_dead_insns (get_insns (), max_reg_num ()); cse_not_expected = !flag_rerun_cse_after_loop; @@ -7711,6 +7717,9 @@ rest_of_handle_cse_after_global_opts (void) else if (tem == 1) cleanup_cfg (0); + if (cse_cfg_altered && dom_info_available_p (CDI_DOMINATORS)) + free_dominance_info (CDI_DOMINATORS); + flag_cse_follow_jumps = save_cfj; return 0; } diff --git a/gcc/testsuite/gcc.dg/pr70807.c b/gcc/testsuite/gcc.dg/pr70807.c new file mode 100644 index 0000000..9ef2a4d --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr70807.c @@ -0,0 +1,18 @@ +/* PR middle-end/70807 */ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +typedef int INT; +int a, b, c, d, e, f; +void fn1() { + INT g; + if (d && a) + ; + else if (e && b) + ; + else if (!a && !b && c) + ; + else if (b && d || a && e) + a = 0; + f = g || d; +}