From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 10018 invoked by alias); 20 Jun 2016 12:12:57 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 10008 invoked by uid 89); 20 Jun 2016 12:12:56 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.0 required=5.0 tests=AWL,BAYES_00,KAM_ASCII_DIVIDERS,RCVD_IN_DNSWL_LOW autolearn=no version=3.3.2 spammy=himode, HImode, sf, expressed 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.217) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-GCM-SHA384 encrypted) ESMTPS; Mon, 20 Jun 2016 12:12:46 +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.6 DYNA|AUTH) with ESMTPSA id 505267s5KCCfYbs (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); Mon, 20 Jun 2016 14:12:41 +0200 (CEST) To: GCC Patches Cc: Denis Chertykov , Pitchumani Sivanupandi From: Georg-Johann Lay Subject: [avr, 6, 5, 4.9, committed] Backported PR target/71103 Message-ID: <6168390c-f350-b524-7fbc-c40c07e11184@gjlay.de> Date: Mon, 20 Jun 2016 12:12:00 -0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.1.1 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------E927FD65556A52F0AB8B06D6" X-IsSubscribed: yes X-SW-Source: 2016-06/txt/msg01401.txt.bz2 This is a multi-part message in MIME format. --------------E927FD65556A52F0AB8B06D6 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Content-length: 464 Applied backports to: v6: https://gcc.gnu.org/r237591 v5: https://gcc.gnu.org/r237593 v4.9: https://gcc.gnu.org/r237594 Johann gcc/ Backport from 2016-06-20 trunk r237589, r236558. PR target/71103 * config/avr/avr.md (movqi): Handle loading subreg:qi (const, symbol_ref,label_ref). gcc/testsuite/ Backport from 2016-06-20 trunk r237589, r236558. PR target/71103 * gcc.target/avr/pr71103.c: New test. * gcc.target/avr/torture/pr71103-2.c: New test. --------------E927FD65556A52F0AB8B06D6 Content-Type: text/x-patch; name="pr71103-v6.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="pr71103-v6.diff" Content-length: 3507 Index: config/avr/avr.md =================================================================== --- config/avr/avr.md (revision 237589) +++ config/avr/avr.md (working copy) @@ -641,6 +641,21 @@ (define_expand "mov" 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/pr71103.c =================================================================== --- testsuite/gcc.target/avr/pr71103.c (nonexistent) +++ testsuite/gcc.target/avr/pr71103.c (working copy) @@ -0,0 +1,16 @@ +/* { dg-do compile } */ +/* { dg-options "-O1" } */ + +struct ResponseStruct{ + unsigned char responseLength; + char *response; +}; + +static char response[5]; +struct ResponseStruct something(){ + struct ResponseStruct returnValue; + returnValue.responseLength = 5; + returnValue.response = response; + return returnValue; +} + 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 */ + --------------E927FD65556A52F0AB8B06D6--