From patchwork Mon Feb 20 09:51:04 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Biener X-Patchwork-Id: 729873 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 3vRf5y5sXTz9s85 for ; Mon, 20 Feb 2017 20:51:18 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b="AsBpKxbv"; 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 :mime-version:in-reply-to:references:from:date:message-id :subject:to:cc:content-type; q=dns; s=default; b=jAg7W/4Gkxztg9T 5Z0A8ytStrBVEutV0mL2EikEKzDRSVsNclhnYtSAJN73t3GT6pur/CBDjrmOjtNg SNbyuzxfYMZkpl9pO5FIZEdGSR4tmaU0kKepfk3KZAa7V9xzavjOLbOtFg8Q9Euj On+1izyhs8a04deV9U178bxoajuA= 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 :mime-version:in-reply-to:references:from:date:message-id :subject:to:cc:content-type; s=default; bh=blzeo83JebmGOskCHwgUW gsjszc=; b=AsBpKxbvAB12YpVRT/hMFyLfVJs8Gv1VtACvX8Bpt8MOBXV/VJVPR kij8+4+p8hQ+MnsvLsbfT5MkpdALFapx/IctXVvYfr1KtKVQ6D89hVx7b5LAf0f2 aEz2Y7kdO7XyUBzB7Ed5K/YvmOqOxrUozTPQGL5Z+Kr6qQBxPcd4oY= Received: (qmail 14675 invoked by alias); 20 Feb 2017 09:51:11 -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 14660 invoked by uid 89); 20 Feb 2017 09:51:10 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-23.9 required=5.0 tests=AWL, BAYES_00, FREEMAIL_FROM, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, RCVD_IN_SORBS_SPAM, SPF_PASS autolearn=ham version=3.3.2 spammy=unwanted, discard X-HELO: mail-ot0-f196.google.com Received: from mail-ot0-f196.google.com (HELO mail-ot0-f196.google.com) (74.125.82.196) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 20 Feb 2017 09:51:06 +0000 Received: by mail-ot0-f196.google.com with SMTP id l26so10323702ota.3 for ; Mon, 20 Feb 2017 01:51:06 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=DvznGES68JLvgP90+IUH8LLVDrF9TwnHbZ/z24oFCYo=; b=iTr3ppqngZ/U4UG05RxEAbYkIGL7P4Wh4dKF3FDgdNOi4OYCI1wDVkkCc0nGzsIE6e BS8eR6qR5RfhFFs5N9SVAcheI5xWKo/4aa5+CRuwO2Ln51owQlpVAy2UaGOQ7P3f9W7b QQIAcy0FviGBAW+iTVSd3GYvoKX0wDcN6ptGq54RwHbgIJhBH+t7wU+Q4ewo3s7WSGOZ 1ESZPxte6GMLrfBazu+GDXGe55xaXiC8Ybvp+ckzbiK6jKfIka2x6N1lcIHVMrSEZqA8 z5PfuiP+LsXStWw5/ttdX/lmtOklqEAPsO0vMp0vlhnfhYuq+sYiUHocJ6eHPV0S032I 2Mlw== X-Gm-Message-State: AMke39lnNRQqegiXp5LxraQKCk9WCfn0WeiLYmaqvjovJvsB0ZmLPKZKVrBq+AXJe9W6dP4KHhNopuvWQukXCQ== X-Received: by 10.157.59.72 with SMTP id z66mr9846505otb.191.1487584264864; Mon, 20 Feb 2017 01:51:04 -0800 (PST) MIME-Version: 1.0 Received: by 10.157.40.120 with HTTP; Mon, 20 Feb 2017 01:51:04 -0800 (PST) In-Reply-To: <20170217135303.GB3892@redhat.com> References: <20170217135303.GB3892@redhat.com> From: Richard Biener Date: Mon, 20 Feb 2017 10:51:04 +0100 Message-ID: Subject: Re: [PATCH] Fix gimplify_expr ICE with Labels as Values (PR middle-end/79537) To: Marek Polacek Cc: GCC Patches X-IsSubscribed: yes On Fri, Feb 17, 2017 at 2:53 PM, Marek Polacek wrote: > We are crashing with a label as a value without accompanying goto. > The problem is that TREE_SIDE_EFFECTS and FORCED_LABEL use the same > ->base.side_effects_flag, so gimplify_expr is confused. We don't > ICE with 'goto *&&L;' becase then we take this path: > 11406 case GOTO_EXPR: > 11407 /* If the target is not LABEL, then it is a computed jump > 11408 and the target needs to be gimplified. */ > 11409 if (TREE_CODE (GOTO_DESTINATION (*expr_p)) != LABEL_DECL) > 11410 { > 11411 ret = gimplify_expr (&GOTO_DESTINATION (*expr_p), pre_p, > 11412 NULL, is_gimple_val, fb_rvalue); > and because of that fb_rvalue we won't go to the switch where the ICE > occured. Because '*&&L;' on its own is useless, I think we can simply > discard it, which is what the following does. > > Bootstrapped/regtested on x86_64-linux, ok for trunk and 6? I think I prefer (with a comment). Ideally we'd have TREE_NOT_CHECK (NON_TYPE_CHEC (NODE), LABEL_DECL) on TREE_SIDE_EFFECTS but that may have unwanted fallout at this point. Ok with the above change. Thanks, RIchard. > 2017-02-17 Marek Polacek > > PR middle-end/79537 > * gimplify.c (gimplify_expr): Handle unused *&&L;. > > * gcc.dg/comp-goto-4.c: New. > > diff --git gcc/gimplify.c gcc/gimplify.c > index 1b9c8d2..5524357 100644 > --- gcc/gimplify.c > +++ gcc/gimplify.c > @@ -12003,6 +12003,11 @@ gimplify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p, > gimple_test_f, fallback); > break; > > + case LABEL_DECL: > + /* We can get here with code such as "*&&L;", where L is > + a LABEL_DECL that is marked as FORCED_LABEL. Skip it. */ > + break; > + > default: > /* Anything else with side-effects must be converted to > a valid statement before we get here. */ > diff --git gcc/testsuite/gcc.dg/comp-goto-4.c gcc/testsuite/gcc.dg/comp-goto-4.c > index e69de29..51a6a86 100644 > --- gcc/testsuite/gcc.dg/comp-goto-4.c > +++ gcc/testsuite/gcc.dg/comp-goto-4.c > @@ -0,0 +1,21 @@ > +/* PR middle-end/79537 */ > +/* { dg-do compile } */ > +/* { dg-options "" } */ > +/* { dg-require-effective-target indirect_jumps } */ > +/* { dg-require-effective-target label_values } */ > + > +void > +f (void) > +{ > +L: > + *&&L; > +} > + > +void > +f2 (void) > +{ > + void *p; > +L: > + p = &&L; > + *p; /* { dg-warning "dereferencing 'void \\*' pointer" } */ > +} > > Marek Index: gcc/gimplify.c =================================================================== --- gcc/gimplify.c (revision 245594) +++ gcc/gimplify.c (working copy) @@ -11977,7 +11977,8 @@ gimplify_expr (tree *expr_p, gimple_seq { /* We aren't looking for a value, and we don't have a valid statement. If it doesn't have side-effects, throw it away. */ - if (!TREE_SIDE_EFFECTS (*expr_p)) + if (TREE_CODE (*expr_p) == LABEL_DECL + || !TREE_SIDE_EFFECTS (*expr_p)) *expr_p = NULL; else if (!TREE_THIS_VOLATILE (*expr_p)) {