From patchwork Mon Jun 20 12:12:41 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: 637954 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 3rY8rd0Vp8z9s9r for ; Mon, 20 Jun 2016 22:13:04 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b=WZyaRDzm; 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=qKmM/Y1HMziWnk3IdrE0SBWRIjRBPByjzDyebcJ8ge4jxfmHZi fDcmhri3Vu7tha5GUvcuz7mh1kJjl8xGy37SM9xtO+K68CgVWV+P43fKjPz1DP9R mQCLjbyrPaPO0S3qBofM7HMrwpx4lDRCKKlxCWjWqNObr48+VW3xxjkUM= 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=3wGt9AaJWKyrKZEDOUerTHSydcQ=; b=WZyaRDzmdy0zh7mvjmtD s+yl5yGZMHxXeRZhf9dqNPiMWGYQQGdR+X1XxVrHkXhDqDG/175cqy6XMQnZh30L 8/+vUqVktLcN+WCVrosGwx3yubU5DWovat9oYUdAAvZdl4On1a9HlM0G03FmrD/u fK/3fADJhL8fIlQ6pt0EyYo= 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-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 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 14:12:41 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.1.1 MIME-Version: 1.0 X-IsSubscribed: yes 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. 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 */ +