From patchwork Sat Nov 10 06:44:06 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "H.J. Lu" X-Patchwork-Id: 198174 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 C225B2C0082 for ; Sat, 10 Nov 2012 17:44:29 +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=1353134671; h=Comment: DomainKey-Signature:Received:Received:Received:Received:Received: Received:Received:Date:From:To:Subject:Message-ID: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=nsqexZOMEL/shMv/GSF4s8Wrebo=; b=aIU3lKBxqsHuxl0ruvwgxlLuZ5neTmFCrwunpKHLC0yp9Vti/pXIbb3ZMMureh /Pp6y1BsibPlMCNx7O9o9VAAVJQxfmYObeTcZlJUD+hBLLv2V9vgDg1sCydGPv+V VIqYBZSAoOg/LEEFfXcYeQcimHGjWOZEI6dRSzHpOT6iI= 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:Date:From:To:Subject:Message-ID:MIME-Version:Content-Type:Content-Disposition:User-Agent:X-IsSubscribed:Mailing-List:Precedence:List-Id:List-Unsubscribe:List-Archive:List-Post:List-Help:Sender:Delivered-To; b=qozYXYtmAezDS3d0y9EqUUJ7cYt6ak9lEHhfHfgPHRaJ/DNvpPF2SXRNhLGYx4 5KHU8BlUhxQ7BrtGzAG5f56FXhywlf7TkaopPpPhwHvwQvZqlgpJe6L1cJJcs1x1 0lr/ByAedbr56QCr2DIP7dJv9B2wZNrCqBojMmiUq6Veo=; Received: (qmail 13984 invoked by alias); 10 Nov 2012 06:44:24 -0000 Received: (qmail 13970 invoked by uid 22791); 10 Nov 2012 06:44:23 -0000 X-SWARE-Spam-Status: No, hits=-4.3 required=5.0 tests=AWL, BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, FREEMAIL_FROM, KHOP_RCVD_TRUST, RCVD_IN_DNSWL_LOW, RCVD_IN_HOSTKARMA_YE X-Spam-Check-By: sourceware.org Received: from mail-pa0-f47.google.com (HELO mail-pa0-f47.google.com) (209.85.220.47) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Sat, 10 Nov 2012 06:44:17 +0000 Received: by mail-pa0-f47.google.com with SMTP id fa11so3086074pad.20 for ; Fri, 09 Nov 2012 22:44:17 -0800 (PST) Received: by 10.68.189.163 with SMTP id gj3mr25616026pbc.110.1352529857048; Fri, 09 Nov 2012 22:44:17 -0800 (PST) Received: from gnu-tools-1.localdomain ([124.77.111.183]) by mx.google.com with ESMTPS id t7sm528556pax.14.2012.11.09.22.44.15 (version=TLSv1/SSLv3 cipher=OTHER); Fri, 09 Nov 2012 22:44:16 -0800 (PST) Received: by gnu-tools-1.localdomain (Postfix, from userid 1000) id 391441AACE7; Fri, 9 Nov 2012 22:44:06 -0800 (PST) Date: Fri, 9 Nov 2012 22:44:06 -0800 From: "H.J. Lu" To: gcc-patches@gcc.gnu.org Subject: PATCH: Handle ZERO_EXTEND offsettable address Message-ID: <20121110064405.GA22641@gmail.com> 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, In (insn 19 17 20 2 (set (reg:TI 85 [ *_15 ]) (mem:TI (zero_extend:DI (reg:SI 82)) [0 *_15+0 S16 A32])) x.i:29 61 {*movti_internal_rex64} (expr_list:REG_DEAD (reg:SI 82) (expr_list:REG_EQUIV (mem/c:TI (plus:DI (reg/f:DI 20 frame) (const_int -16 [0xfffffffffffffff0])) [0 sym+0 S16 A64]) we fail to see (mem:TI (zero_extend:DI (reg:SI 82))) is offsettable. This patch adds ZERO_EXTEND support to adjust_address_1 and offsettable_address_addr_space_p. Tested on Linux/x32. OK to install? Thanks. H.J. --- gcc/ 2012-11-10 H.J. Lu PR rtl-optimization/55247 PR middle-end/55259 * emit-rtl.c (adjust_address_1): Handle ZERO_EXTEND. * recog.c (offsettable_address_addr_space_p): Likewise. gcc/testsuite/ 2012-11-10 H.J. Lu PR rtl-optimization/55247 PR middle-end/55259 diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c index 95bbfa7..d7c454c 100644 --- a/gcc/emit-rtl.c +++ b/gcc/emit-rtl.c @@ -2109,6 +2109,12 @@ adjust_address_1 (rtx memref, enum machine_mode mode, HOST_WIDE_INT offset, addr = gen_rtx_LO_SUM (address_mode, XEXP (addr, 0), plus_constant (address_mode, XEXP (addr, 1), offset)); + else if (GET_CODE (addr) == ZERO_EXTEND) + { + addr = XEXP (addr, 0); + addr = plus_constant (GET_MODE (addr), addr, offset); + addr = gen_rtx_ZERO_EXTEND (address_mode, addr); + } else addr = plus_constant (address_mode, addr, offset); } diff --git a/gcc/recog.c b/gcc/recog.c index ee68e30..d3dd591 100644 --- a/gcc/recog.c +++ b/gcc/recog.c @@ -1934,15 +1934,21 @@ int offsettable_address_addr_space_p (int strictp, enum machine_mode mode, rtx y, addr_space_t as) { - enum rtx_code ycode = GET_CODE (y); + enum rtx_code ycode; rtx z; - rtx y1 = y; + rtx y1; rtx *y2; int (*addressp) (enum machine_mode, rtx, addr_space_t) = (strictp ? strict_memory_address_addr_space_p : memory_address_addr_space_p); unsigned int mode_sz = GET_MODE_SIZE (mode); + if (GET_CODE (y) == ZERO_EXTEND) + y = XEXP (y, 0); + + ycode = GET_CODE (y); + y1 = y; + if (CONSTANT_ADDRESS_P (y)) return 1; diff --git a/gcc/testsuite/gcc.target/i386/pr55247.c b/gcc/testsuite/gcc.target/i386/pr55247.c new file mode 100644 index 0000000..594139e --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr55247.c @@ -0,0 +1,35 @@ +/* { dg-do compile { target { ! { ia32 } } } } */ +/* { dg-require-effective-target maybe_x32 } */ +/* { dg-options "-O -mno-sse -mno-mmx -mx32 -maddress-mode=long" } */ + +typedef unsigned int uint32_t; +typedef uint32_t Elf32_Word; +typedef uint32_t Elf32_Addr; +typedef struct { + Elf32_Word st_name; + Elf32_Addr st_value; + Elf32_Word st_size; + unsigned char st_other; +} Elf32_Sym; +typedef struct { + Elf32_Word r_info; +} +Elf32_Rela; +typedef struct { + union { + Elf32_Addr d_ptr; + } + d_un; +} Elf32_Dyn; +struct link_map { + Elf32_Dyn *l_info[34]; +}; +extern void symbind32 (Elf32_Sym *); +void +_dl_profile_fixup (struct link_map *l, Elf32_Word reloc_arg) +{ + const Elf32_Sym *const symtab = (const void *) l->l_info[6]->d_un.d_ptr; + const Elf32_Rela *const reloc = (const void *) (l->l_info[23]->d_un.d_ptr + reloc_arg * sizeof (Elf32_Rela)); + Elf32_Sym sym = symtab[(reloc->r_info) >> 8]; + symbind32 (&sym); +}