From patchwork Wed Nov 10 23:21:24 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Jelinek X-Patchwork-Id: 70727 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 30659B711E for ; Thu, 11 Nov 2010 10:21:35 +1100 (EST) Received: (qmail 13287 invoked by alias); 10 Nov 2010 23:21:32 -0000 Received: (qmail 13272 invoked by uid 22791); 10 Nov 2010 23:21:32 -0000 X-SWARE-Spam-Status: No, hits=-6.3 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_HI, SPF_HELO_PASS, T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 10 Nov 2010 23:21:27 +0000 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id oAANLQCg014270 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 10 Nov 2010 18:21:26 -0500 Received: from tyan-ft48-01.lab.bos.redhat.com (tyan-ft48-01.lab.bos.redhat.com [10.16.42.4]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id oAANLPnl028139 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Wed, 10 Nov 2010 18:21:25 -0500 Received: from tyan-ft48-01.lab.bos.redhat.com (localhost.localdomain [127.0.0.1]) by tyan-ft48-01.lab.bos.redhat.com (8.14.4/8.14.4) with ESMTP id oAANLOEO009802 for ; Thu, 11 Nov 2010 00:21:24 +0100 Received: (from jakub@localhost) by tyan-ft48-01.lab.bos.redhat.com (8.14.4/8.14.4/Submit) id oAANLOme009800 for gcc-patches@gcc.gnu.org; Thu, 11 Nov 2010 00:21:24 +0100 Date: Thu, 11 Nov 2010 00:21:24 +0100 From: Jakub Jelinek To: gcc-patches@gcc.gnu.org Subject: [PATCH] Fix expansion ICE with VOIDmode MEM (PR middle-end/46388) Message-ID: <20101110232124.GZ29412@tyan-ft48-01.lab.bos.redhat.com> Reply-To: Jakub Jelinek MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) 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! On IA-64 the attached testcase segfaults, because the DECL_EXTERNAL var u has incomplete type and during expansion we create VOIDmode MEM for it (that VAR_DECL is the get_inner_reference result, we of course have non-VOIDmode mode we are accessing it through in the MEM_REF). In some versions of the store_field code which happens to be used on this testcase on ia64 the VOIDmode MEM leads to ICEs. I think we just should avoid having VOIDmode MEM around whenever possible, the following patch fixes it by using the MEM_REF access mode instead (alternatively we could always use BLKmode for it). Bootstrapped/regtested on x86_64-linux and i686-linux, tested on the testcase with cross to ia64-linux. Ok for trunk? 2010-11-10 Jakub Jelinek PR middle-end/46388 * expr.c (expand_assignment): If to_rtx is a VOIDmode MEM, use mode1 mode for it. (expand_expr_real_1): Similarly for op0. * gcc.c-torture/compile/pr46388.c: New test. Jakub --- gcc/expr.c.jj 2010-11-09 13:58:30.000000000 +0100 +++ gcc/expr.c 2010-11-10 11:37:53.000000000 +0100 @@ -4260,10 +4260,11 @@ expand_assignment (tree to, tree from, b to_rtx = expand_normal (tem); /* If the bitfield is volatile, we want to access it in the - field's mode, not the computed mode. */ - if (volatilep - && GET_CODE (to_rtx) == MEM - && flag_strict_volatile_bitfields > 0) + field's mode, not the computed mode. + Similarly, if MEM has a VOIDmode (external with incomplete type). */ + if (MEM_P (to_rtx) + && ((volatilep && flag_strict_volatile_bitfields > 0) + || GET_MODE (to_rtx) == VOIDmode)) to_rtx = adjust_address (to_rtx, mode1, 0); if (offset != 0) @@ -9013,10 +9014,12 @@ expand_expr_real_1 (tree exp, rtx target /* If the bitfield is volatile, we want to access it in the - field's mode, not the computed mode. */ - if (volatilep - && GET_CODE (op0) == MEM - && flag_strict_volatile_bitfields > 0) + field's mode, not the computed mode. + Similarly, if MEM has a VOIDmode (external with incomplete + type). */ + if (MEM_P (op0) + && ((volatilep && flag_strict_volatile_bitfields > 0) + || GET_MODE (op0) == VOIDmode)) op0 = adjust_address (op0, mode1, 0); mode2 --- gcc/testsuite/gcc.c-torture/compile/pr46388.c.jj 2010-11-10 11:45:52.000000000 +0100 +++ gcc/testsuite/gcc.c-torture/compile/pr46388.c 2010-11-10 11:45:37.000000000 +0100 @@ -0,0 +1,14 @@ +/* PR middle-end/46388 */ + +struct S; +struct T +{ + struct S *t; +}; +extern struct S s, u; + +void +foo (void) +{ + ((struct T *) &u)->t = &s; +}