From patchwork Wed Jun 15 09:11:30 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Georg-Johann Lay X-Patchwork-Id: 635768 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 3rV13y5gc8z9t1G for ; Wed, 15 Jun 2016 19:11:57 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b=tRysC88h; 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:to:cc :from:subject:message-id:date:mime-version:content-type; q=dns; s=default; b=h4LEEFNfUMbjbed9kJdm6++Zx+Uf3/dC+MzO0HiAnMpENDaGAU +j2laveCDzgDetVqBaVQ5KpfVmY2Eh8wLXszw+oQTYRAAU7nTZ5FyAEQUVk5Jcbl moV6Do5U2k5Kj7P7kG+bFG4BwhG4CIZV7GxtJEYrO2dsCMTQhbD9R3+Ts= 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:to:cc :from:subject:message-id:date:mime-version:content-type; s= default; bh=8QQNU4QO93f1so1BQL0qzYqyrhA=; b=tRysC88hehojjGNRle1C obkYElsvnWWcVq2yGl5uJcVdl0xaXlYT9e95HS/10Z23LKGg9fhMkDjrrB1mNOUJ DENuOcIM3PLLpDsVw9+KYRq8UUhO9sEGiqNSe+37Xuh6hgjpSQsYYZw09b6ABrGX DdXVwLy9QFLjYItGHyQKX8Y= Received: (qmail 102562 invoked by alias); 15 Jun 2016 09:11:49 -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 102549 invoked by uid 89); 15 Jun 2016 09:11:48 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.8 required=5.0 tests=BAYES_00, KAM_ASCII_DIVIDERS, RCVD_IN_DNSWL_LOW autolearn=no version=3.3.2 spammy=sd, sf, H*r:ip*192.168.0.123 X-HELO: mo4-p00-ob.smtp.rzone.de Received: from mo4-p00-ob.smtp.rzone.de (HELO mo4-p00-ob.smtp.rzone.de) (81.169.146.161) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-GCM-SHA384 encrypted) ESMTPS; Wed, 15 Jun 2016 09:11:38 +0000 X-RZG-AUTH: :LXoWVUeid/7A29J/hMvvT3ol15ykJcYwTPLBCxG2PQt7BpaBF2I= X-RZG-CLASS-ID: mo00 Received: from [192.168.0.123] (ip5f5871e3.dynamic.kabel-deutschland.de [95.88.113.227]) by smtp.strato.de (RZmta 38.5 DYNA|AUTH) with ESMTPSA id R074e1s5F9BU0QR (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA (curve secp521r1 with 521 ECDH bits, eq. 15360 bits RSA)) (Client did not present a certificate); Wed, 15 Jun 2016 11:11:30 +0200 (CEST) To: GCC Patches Cc: Denis Chertykov , Pitchumani Sivanupandi From: Georg-Johann Lay Subject: [patch,avr] ad PR71103: also handle QImode SUBREGs of CONST Message-ID: <57611BC2.507@gjlay.de> Date: Wed, 15 Jun 2016 11:11:30 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.8.0 MIME-Version: 1.0 X-IsSubscribed: yes This patch handles the cases when subreg:QI of a CONST or LABEL_REF is to be moved to a QImode register. The original patch only handled SYMBOL_REFs. OK for trunk and backport? Johann --- gcc/ PR target/71103 * config/avr/avr.md (movqi): Handle loading subreg:qi (const). gcc/testsuite/ PR target/71103 * gcc.target/avr/torture/pr71103-2.c: New test. Index: config/avr/avr.md =================================================================== --- config/avr/avr.md (revision 237472) +++ config/avr/avr.md (working copy) @@ -638,16 +638,24 @@ rtx dest = operands[0]; rtx src = avr_eval_addr_attrib (operands[1]); - if (SUBREG_P(src) && (GET_CODE(XEXP(src,0)) == SYMBOL_REF) && - can_create_pseudo_p()) - { - rtx symbol_ref = XEXP(src, 0); - XEXP (src, 0) = copy_to_mode_reg (GET_MODE(symbol_ref), symbol_ref); - } - if (avr_mem_flash_p (dest)) DONE; + if (QImode == mode + && SUBREG_P (src) + && CONSTANT_ADDRESS_P (SUBREG_REG (src))) + { + // store_bitfield may want to store a SYMBOL_REF or CONST in a + // structure that's represented as PSImode. As the upper 16 bits + // of PSImode cannot be expressed as an HImode subreg, the rhs is + // decomposed into QImode (word_mode) subregs of SYMBOL_REF, + // CONST or LABEL_REF; cf. PR71103. + + rtx const_addr = SUBREG_REG (src); + operands[1] = src = copy_rtx (src); + SUBREG_REG (src) = copy_to_mode_reg (GET_MODE (const_addr), const_addr); + } + /* One of the operands has to be in a register. */ if (!register_operand (dest, mode) && !reg_or_0_operand (src, mode)) Index: testsuite/gcc.target/avr/torture/pr71103-2.c =================================================================== --- testsuite/gcc.target/avr/torture/pr71103-2.c (nonexistent) +++ testsuite/gcc.target/avr/torture/pr71103-2.c (working copy) @@ -0,0 +1,118 @@ +/* Use -g0 so that this test case doesn't just fail because + of PR52472. */ + +/* { dg-do compile } */ +/* { dg-options "-std=gnu99 -g0" } */ + +struct S12 +{ + char c; + const char *p; +}; + +struct S12f +{ + char c; + struct S12f (*f)(void); +}; + +struct S12labl +{ + char c; + void **labl; +}; + +struct S121 +{ + char c; + const char *p; + char d; +}; + +const char str[5] = "abcd"; + +struct S12 test_S12_0 (void) +{ + struct S12 s; + s.c = 'A'; + s.p = str; + return s; +} + +struct S12 test_S12_4 (void) +{ + struct S12 s; + s.c = 'A'; + s.p = str + 4; + return s; +} + +struct S12f test_S12f (void) +{ + struct S12f s; + s.c = 'A'; + s.f = test_S12f; + return s; +} + +struct S121 test_S121 (void) +{ + struct S121 s; + s.c = 'c'; + s.p = str + 4; + s.d = 'd'; + return s; +} + +extern void use_S12lab (struct S12labl*); + +struct S12labl test_S12lab (void) +{ + struct S12labl s; +labl:; + s.c = 'A'; + s.labl = &&labl; + return s; +} + +#ifdef __MEMX + +struct S13 +{ + char c; + const __memx char *p; +}; + +const __memx char str_x[] = "abcd"; + +struct S13 test_S13_0 (void) +{ + struct S13 s; + s.c = 'A'; + s.p = str_x; + return s; +} + +struct S13 test_S13_4a (void) +{ + struct S13 s; + s.c = 'A'; + s.p = str_x + 4; + return s; +} + +#ifdef __FLASH1 + +const __flash1 char str_1[] = "abcd"; + +struct S13 test_13_4b (void) +{ + struct S13 s; + s.c = 'A'; + s.p = str_1 + 4; + return s; +} + +#endif /* have __flash1 */ +#endif /* have __memx */ +