From patchwork Thu Mar 17 18:46:46 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Jelinek X-Patchwork-Id: 87412 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 27822B6FE5 for ; Fri, 18 Mar 2011 05:46:55 +1100 (EST) Received: (qmail 21426 invoked by alias); 17 Mar 2011 18:46:54 -0000 Received: (qmail 21415 invoked by uid 22791); 17 Mar 2011 18:46:54 -0000 X-SWARE-Spam-Status: No, hits=-6.4 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; Thu, 17 Mar 2011 18:46:50 +0000 Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id p2HIkmhf023973 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 17 Mar 2011 14:46:48 -0400 Received: from tyan-ft48-01.lab.bos.redhat.com (tyan-ft48-01.lab.bos.redhat.com [10.16.42.4]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id p2HIkl8a025179 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Thu, 17 Mar 2011 14:46:48 -0400 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 p2HIklw9022897 for ; Thu, 17 Mar 2011 19:46:47 +0100 Received: (from jakub@localhost) by tyan-ft48-01.lab.bos.redhat.com (8.14.4/8.14.4/Submit) id p2HIkkjs022895 for gcc-patches@gcc.gnu.org; Thu, 17 Mar 2011 19:46:46 +0100 Date: Thu, 17 Mar 2011 19:46:46 +0100 From: Jakub Jelinek To: gcc-patches@gcc.gnu.org Subject: [PATCH] Fix hppa-* --enable-checking=release bootstrap (PR bootstrap/48161) Message-ID: <20110317184646.GW30899@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! When expanding D.2070_29 = &MEM[(struct V *)0B].v[D.2034_30]{lb: 0 sz: 12}; expand_expr_addr_expr_1 is called with EXPAND_SUM, and result ends up being (const_int 0) (from the NULL address), while tmp (the offset) is a pseudo register. With EXPAND_SUM we want to ensure no insns are emitted, so just gen_rtx_PLUS directly. But having CONST_INT as the first argument and REG as second argument of commutative RTL is invalid. Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux and Dave tested it on hppa. Ok for trunk/4.6 (it is a P1 regression)? 2011-03-17 Jakub Jelinek PR bootstrap/48161 * expr.c (expand_expr_addr_expr_1): Swap PLUS operands if needed. * gcc.c-torture/compile/pr48161.c: New test. Jakub --- gcc/expr.c.jj 2011-03-14 14:12:15.000000000 +0100 +++ gcc/expr.c 2011-03-17 16:49:01.000000000 +0100 @@ -6971,7 +6971,12 @@ expand_expr_addr_expr_1 (tree exp, rtx t tmp = convert_memory_address_addr_space (tmode, tmp, as); if (modifier == EXPAND_SUM || modifier == EXPAND_INITIALIZER) - result = gen_rtx_PLUS (tmode, result, tmp); + { + if (swap_commutative_operands_p (result, tmp)) + result = gen_rtx_PLUS (tmode, tmp, result); + else + result = gen_rtx_PLUS (tmode, result, tmp); + } else { subtarget = bitpos ? NULL_RTX : target; --- gcc/testsuite/gcc.c-torture/compile/pr48161.c.jj 2011-03-09 16:32:56.855000001 +0100 +++ gcc/testsuite/gcc.c-torture/compile/pr48161.c 2011-03-17 17:20:34.000000000 +0100 @@ -0,0 +1,24 @@ +/* PR bootstrap/48161 */ + +struct T { int u; }; +struct G { int l; int t; int r; }; +struct V { struct G v[10]; }; +struct { struct V b; } *h; +void bar (void); + +struct G * +baz (struct V *x, unsigned y) +{ + return &x->v[y]; +} + +int +foo (struct T *x, struct T *y) +{ + if ((baz (&h->b, y->u)->t ? baz (&h->b, y->u)->t : 0) + - baz (h ? &h->b : 0, x->u)->r + - (baz (h ? &h->b : 0, x->u)->t > 0 ? 5 : 0)) + return 1; + bar (); + return 0; +}