From patchwork Fri Jan 4 13:00:46 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Jelinek X-Patchwork-Id: 209455 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]) by ozlabs.org (Postfix) with SMTP id F11DA2C007E for ; Sat, 5 Jan 2013 00:07:15 +1100 (EST) Comment: DKIM? See http://www.dkim.org DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=gcc.gnu.org; s=default; x=1357909638; h=Comment: DomainKey-Signature:Received:Received:Received:Received:Received: Received:Received:Received:Received:Date:From:To:Cc:Subject: Message-ID:Reply-To:MIME-Version:Content-Type: Content-Disposition:User-Agent:Mailing-List:Precedence:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:Sender: Delivered-To; bh=hCicmSd/9ljJLTVUuNUtg8RldKI=; b=hj5m0iEyo59DHNB qcsGKGgtT0Z31JaTSBdEL7hvdtTg1w5fS4FQDUl+I+CPbLxktYAXv80pCvGB7MQO sGUOmIbOF4XYE/+ZmV3Y1R5JINR0N0tx8rBTeZekgQROD+RNiIsX/F/6Fk+D/0s+ pvqBaRdXa9z/17BIdTw8MTVycxWU= Comment: DomainKeys? See http://antispam.yahoo.com/domainkeys DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=default; d=gcc.gnu.org; h=Received:Received:X-SWARE-Spam-Status:X-Spam-Check-By:Received:Received:Received:Received:Received:Received:Received:Date:From:To:Cc:Subject:Message-ID:Reply-To:MIME-Version:Content-Type:Content-Disposition:User-Agent:X-detected-operating-system:X-Received-From:X-IsSubscribed:Mailing-List:Precedence:List-Id:List-Unsubscribe:List-Archive:List-Post:List-Help:Sender:Delivered-To; b=kV5J2eY8gMFllYh4g0dXjri0U4ZOuCBJYx4aFl6c6GSV5mDrx607rMUKe9Yw9m lYZfTaovMJMG06olrxI18bVYF3QGAnJ0s6TnkaOH+1klyfVZa56tem/b2yyapn39 yDauDuXglO7jUyTO9glFvqdM930z7WxXf1c/CpAZKtwp0=; Received: (qmail 13263 invoked by alias); 4 Jan 2013 13:07:06 -0000 Received: (qmail 13249 invoked by uid 22791); 4 Jan 2013 13:07:05 -0000 X-SWARE-Spam-Status: No, hits=-6.3 required=5.0 tests=AWL, BAYES_00, KHOP_RCVD_UNTRUST, KHOP_SPAMHAUS_DROP, RCVD_IN_DNSWL_HI, RCVD_IN_HOSTKARMA_W X-Spam-Check-By: sourceware.org Received: from eggs.gnu.org (HELO eggs.gnu.org) (208.118.235.92) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 04 Jan 2013 13:06:54 +0000 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Tr6z6-0001Ff-3q for gcc-patches@gcc.gnu.org; Fri, 04 Jan 2013 08:06:53 -0500 Received: from mx1.redhat.com ([209.132.183.28]:21277) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Tr6tj-00082Y-At for gcc-patches@gcc.gnu.org; Fri, 04 Jan 2013 08:01:19 -0500 Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r04D0nZ1005939 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 4 Jan 2013 08:00:56 -0500 Received: from zalov.redhat.com (vpn1-5-3.ams2.redhat.com [10.36.5.3]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r04D0mhS032227 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Fri, 4 Jan 2013 08:00:49 -0500 Received: from zalov.cz (localhost [127.0.0.1]) by zalov.redhat.com (8.14.5/8.14.5) with ESMTP id r04D0l1L007373; Fri, 4 Jan 2013 14:00:47 +0100 Received: (from jakub@localhost) by zalov.cz (8.14.5/8.14.5/Submit) id r04D0kXb007372; Fri, 4 Jan 2013 14:00:46 +0100 Date: Fri, 4 Jan 2013 14:00:46 +0100 From: Jakub Jelinek To: Richard Biener Cc: gcc-patches@gcc.gnu.org Subject: [PATCH] Ensure gimplify_one_sizepos doesn't change something with INTEGER_TYPE into something with e.g. ENUMERAL_TYPE (PR middle-end/55851) Message-ID: <20130104130046.GO7269@tucnak.redhat.com> Reply-To: Jakub Jelinek MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 209.132.183.28 X-IsSubscribed: yes 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 Hi! As discussed in the PR, as all INTEGRAL_TYPE_P types with the same sign/precision are usually considered compatible (useless_type_conversion_p), during gimplify_one_sizepos the gimplifier can change e.g. an integer expression into e.g. VAR_DECL with ENUMERAL_TYPE, and when the gimplifier later on passes that to size_binop etc., it can trigger asserts because ENUMERAL_TYPE isn't considered sizetype-ish enough. The following patch (which I don't like too much admittedly) makes sure for constants we fold it back to INTEGER_TYPE constant, and for VAR_DECLs add an extra VAR_DECL in such a case. Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? Or do you prefer some other way? 2013-01-04 Jakub Jelinek PR middle-end/55851 * gimplify.c (gimplify_one_sizepos): Ensure gimplify_expr doesn't turn *expr_p from INTEGER_TYPE expression into e.g. ENUMERAL_TYPE expression. * gcc.c-torture/compile/pr55851.c: New test. Jakub --- gcc/gimplify.c.jj 2012-12-20 19:13:00.000000000 +0100 +++ gcc/gimplify.c 2013-01-03 16:16:07.288707387 +0100 @@ -8180,6 +8180,26 @@ gimplify_one_sizepos (tree *expr_p, gimp *expr_p = unshare_expr (expr); gimplify_expr (expr_p, stmt_p, NULL, is_gimple_val, fb_rvalue); + + /* Ensure we don't change an INTEGER_TYPE expression into e.g. ENUMERAL_TYPE + expression. */ + if (TREE_CODE (TREE_TYPE (*expr_p)) != TREE_CODE (TREE_TYPE (expr))) + { + gcc_checking_assert (useless_type_conversion_p (TREE_TYPE (expr), + TREE_TYPE (*expr_p))); + if (TREE_CODE (*expr_p) == INTEGER_CST) + *expr_p = fold_convert (TREE_TYPE (expr), *expr_p); + else + { + tree var = create_tmp_var (TREE_TYPE (expr), NULL); + tree mod = build2 (INIT_EXPR, TREE_TYPE (var), + var, unshare_expr (*expr_p)); + SET_EXPR_LOCATION (mod, EXPR_LOC_OR_HERE (*expr_p)); + gimplify_and_add (mod, stmt_p); + ggc_free (mod); + *expr_p = var; + } + } } /* Gimplify the body of statements of FNDECL and return a GIMPLE_BIND node --- gcc/testsuite/gcc.c-torture/compile/pr55851.c.jj 2013-01-03 16:20:19.085284806 +0100 +++ gcc/testsuite/gcc.c-torture/compile/pr55851.c 2013-01-03 16:19:27.698571718 +0100 @@ -0,0 +1,12 @@ +/* PR middle-end/55851 */ + +enum { A = 1UL, B = -1UL } var = A; +void foo (char *); + +void +test (void) +{ + char vla[1][var]; + vla[0][0] = 1; + foo (&vla[0][0]); +}