From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 30231 invoked by alias); 21 Apr 2015 07:28:49 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 30218 invoked by uid 89); 21 Apr 2015 07:28:48 -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,KAM_LAZY_DOMAIN_SECURITY,T_RP_MATCHES_RCVD autolearn=no version=3.3.2 X-HELO: mx2.suse.de Received: from cantor2.suse.de (HELO mx2.suse.de) (195.135.220.15) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (CAMELLIA256-SHA encrypted) ESMTPS; Tue, 21 Apr 2015 07:28:42 +0000 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 5CAC2AB1C; Tue, 21 Apr 2015 07:28:39 +0000 (UTC) Date: Tue, 21 Apr 2015 07:28:00 -0000 From: Richard Biener To: Tom de Vries cc: GCC Patches Subject: Re: [PATCH][PR65802] Mark ifn_va_arg with ECF_NOTHROW In-Reply-To: <5535F7EF.1000305@mentor.com> Message-ID: References: <5535F7EF.1000305@mentor.com> User-Agent: Alpine 2.11 (LSU 23 2013-08-11) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-SW-Source: 2015-04/txt/msg01121.txt.bz2 On Tue, 21 Apr 2015, Tom de Vries wrote: > Hi, > > this patch fixes PR65802. > > The problem described in PR65802 is that when compiling the test-case > (included in the patch below) at -O0, the compiler runs into a gcc_assert ICE > in redirect_eh_edge_1 during pass_cleanup_eh: > ... > gcc_assert (lookup_stmt_eh_lp (throw_stmt) == old_lp_nr); > ... > > > In more detail, during compilation the ifn_va_arg is marked at as a throwing > function. That causes exception handling code to be generated, with exception > handling edges: > ... > ;; basic block 2, loop depth 0, count 0, freq 0, maybe hot > ;; prev block 0, next block 3, flags: (NEW, REACHABLE) > ;; pred: ENTRY (FALLTHRU) > [LP 1] # .MEM_5 = VDEF <.MEM_4(D)> > # USE = anything > # CLB = anything > _6 = VA_ARG (&cD.2333, 0B); > ;; succ: 7 (EH) > ;; 3 (FALLTHRU) > ... > > After pass_lower_vaarg, the expansion of ifn_va_arg is spread over several > basic blocks: > ... > ;; basic block 2, loop depth 0, count 0, freq 0, maybe hot > ;; prev block 0, next block 11, flags: (NEW, REACHABLE) > ;; pred: ENTRY (FALLTHRU) > ;; succ: 11 [100.0%] (FALLTHRU) > > ;; basic block 11, loop depth 0, count 0, freq 0, maybe hot > ;; prev block 2, next block 12, flags: (NEW) > ;; pred: 2 [100.0%] (FALLTHRU) > # VUSE <.MEM_4(D)> > _22 = cD.2333.gp_offsetD.5; > if (_22 >= 48) > goto (); > else > goto (); > ;; succ: 13 (TRUE_VALUE) > ;; 12 (FALSE_VALUE) > > ;; basic block 12, loop depth 0, count 0, freq 0, maybe hot > ;; prev block 11, next block 13, flags: (NEW) > ;; pred: 11 (FALSE_VALUE) > : > # VUSE <.MEM_4(D)> > _23 = cD.2333.reg_save_areaD.8; > # VUSE <.MEM_4(D)> > _24 = cD.2333.gp_offsetD.5; > _25 = (sizetype) _24; > addr.1_26 = _23 + _25; > # VUSE <.MEM_4(D)> > _27 = cD.2333.gp_offsetD.5; > _28 = _27 + 8; > # .MEM_29 = VDEF <.MEM_4(D)> > cD.2333.gp_offsetD.5 = _28; > goto (); > ;; succ: 14 (FALLTHRU) > > ;; basic block 13, loop depth 0, count 0, freq 0, maybe hot > ;; prev block 12, next block 14, flags: (NEW) > ;; pred: 11 (TRUE_VALUE) > : > # VUSE <.MEM_4(D)> > _30 = cD.2333.overflow_arg_areaD.7; > addr.1_31 = _30; > _32 = _30 + 8; > # .MEM_33 = VDEF <.MEM_4(D)> > cD.2333.overflow_arg_areaD.7 = _32; > ;; succ: 14 (FALLTHRU) > > ;; basic block 14, loop depth 0, count 0, freq 0, maybe hot > ;; prev block 13, next block 15, flags: (NEW) > ;; pred: 12 (FALLTHRU) > ;; 13 (FALLTHRU) > # .MEM_20 = PHI <.MEM_29(12), .MEM_33(13)> > # addr.1_21 = PHI > : > # VUSE <.MEM_20> > _6 = MEM[(intD.9 * * {ref-all})addr.1_21]; > ;; succ: 15 (FALLTHRU) > > ;; basic block 15, loop depth 0, count 0, freq 0, maybe hot > ;; prev block 14, next block 3, flags: (NEW) > ;; pred: 14 (FALLTHRU) > ;; succ: 7 (EH) > ;; 3 (FALLTHRU) > ... > > And an ICE is triggered in redirect_eh_edge_1, because the code expects the > last statement in a BB with an outgoing EH edge to be a throwing statement. > > That's obviously not the case, since bb15 is empty. But also all the other > statements in the expansion are non-throwing. > > > Looking at the representation before the ifn_va_arg, VA_ARG_EXPR is > non-throwing (even with -fnon-call-exceptions). > > And looking at the situation before the introduction of ifn_va_arg, the > expansion of VA_ARG_EXPR also didn't contain any throwing statements. > > > This patch fixes the ICE by marking ifn_va_arg with ECF_NOTHROW. > > Bootstrapped and reg-tested on x86_64. > > OK for trunk? Ok. Thanks, Richard. > Thanks, > - Tom > -- Richard Biener SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Jennifer Guild, Dilip Upmanyu, Graham Norton HRB 21284 (AG Nuernberg)