From patchwork Mon Jan 2 14:47:43 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Georg-Johann Lay X-Patchwork-Id: 89513 Delivered-To: patch@linaro.org Received: by 10.140.20.101 with SMTP id 92csp7619588qgi; Mon, 2 Jan 2017 06:48:27 -0800 (PST) X-Received: by 10.84.217.80 with SMTP id e16mr117794346plj.120.1483368507594; Mon, 02 Jan 2017 06:48:27 -0800 (PST) Return-Path: Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id l5si65858073pgk.200.2017.01.02.06.48.27 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 02 Jan 2017 06:48:27 -0800 (PST) Received-SPF: pass (google.com: domain of gcc-patches-return-445168-patch=linaro.org@gcc.gnu.org designates 209.132.180.131 as permitted sender) client-ip=209.132.180.131; Authentication-Results: mx.google.com; dkim=pass header.i=@gcc.gnu.org; spf=pass (google.com: domain of gcc-patches-return-445168-patch=linaro.org@gcc.gnu.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=gcc-patches-return-445168-patch=linaro.org@gcc.gnu.org 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=rQQwJKVOoX4htRXNEXYVGciBsTX+d7uW/nhfrYjwMfocgeUNiM 9hL3f4VMonbjKdrQjQPgb0dHn8tjIJpu/wJRBeTDfeqK+ocWd1ZIbED33mUdFsmY NSiLPUbEqQ/mX/ozI6q3tBU+4Avf/5+Q633jEPFv4O1RfVbst3hlHRuck= 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=wRWiSg4jq4BIsHBa3aollkG/RgU=; b=RNkdHGfAIeU+PZMnyVgp 3EIo6WpHkKmWLbnoa0sxHQqBwB0QI93n5fNN8f6PRUXcgLEqvWD5i10JjmmFl+sr u2MQ1BZCnbSePaEtoJ96+LqUyZVexH7bMDdDjaL3eyWqSb0cgwuET0IDnEmJUdHB jpKtrCwt/JQa2vxY2UNky5U= Received: (qmail 35665 invoked by alias); 2 Jan 2017 14:48:13 -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 35562 invoked by uid 89); 2 Jan 2017 14:48:02 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-0.1 required=5.0 tests=AWL, BAYES_40, KAM_ASCII_DIVIDERS, RCVD_IN_DNSWL_LOW autolearn=no version=3.3.2 spammy=MTO, mto, enhanced, H*RU:sk:mail.hi 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.221) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 02 Jan 2017 14:47:52 +0000 X-RZG-AUTH: :LXoWVUeid/7A29J/hMvvT3ol15ykJcYwR/bcHRirORRW3yMcVao= X-RZG-CLASS-ID: mo00 Received: from [192.168.0.123] (mail.hightec-rt.com [213.135.1.215]) by smtp.strato.de (RZmta 39.11 DYNA|AUTH) with ESMTPSA id C074d1t02ElmZB4 (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, 2 Jan 2017 15:47:48 +0100 (CET) To: gcc-patches Cc: Denis Chertykov , Segher Boessenkool , Dominik Vogt From: Georg-Johann Lay Subject: [patch,avr] PR78883: Implement CANNOT_CHANGE_MODE_CLASS. Message-ID: Date: Mon, 2 Jan 2017 15:47:43 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.6.0 MIME-Version: 1.0 X-IsSubscribed: yes This fixes PR78883 which is a problem in reload revealed by a change to combine.c. The fix is as proposed by Segher: implement CANNOT_CHANGE_MODE_CLASS. Ok for trunk? Johann gcc/ PR target/78883 * config/avr/avr.h (CANNOT_CHANGE_MODE_CLASS): New define. * config/avr/avr-protos.h (avr_cannot_change_mode_class): New proto. * config/avr/avr.c (avr_cannot_change_mode_class): New function. gcc/testsuite/ PR target/78883 * gcc.c-torture/compile/pr78883.c: New test. Index: config/avr/avr-protos.h =================================================================== --- config/avr/avr-protos.h (revision 244001) +++ config/avr/avr-protos.h (working copy) @@ -111,7 +111,7 @@ extern int _reg_unused_after (rtx_insn * extern int avr_jump_mode (rtx x, rtx_insn *insn); extern int test_hard_reg_class (enum reg_class rclass, rtx x); extern int jump_over_one_insn_p (rtx_insn *insn, rtx dest); - +extern int avr_cannot_change_mode_class (machine_mode, machine_mode, enum reg_class); extern int avr_hard_regno_mode_ok (int regno, machine_mode mode); extern void avr_final_prescan_insn (rtx_insn *insn, rtx *operand, int num_operands); Index: config/avr/avr.c =================================================================== --- config/avr/avr.c (revision 244001) +++ config/avr/avr.c (working copy) @@ -11833,6 +11833,21 @@ jump_over_one_insn_p (rtx_insn *insn, rt } +/* Worker function for `CANNOT_CHANGE_MODE_CLASS'. */ + +int +avr_cannot_change_mode_class (machine_mode from, machine_mode to, + enum reg_class /* rclass */) +{ + /* We cannot access a hard register in a wider mode, for example we + must not access (reg:QI 31) as (reg:HI 31). HARD_REGNO_MODE_OK + would avoid such hard regs, but reload would generate it anyway + from paradoxical subregs of mem, cf. PR78883. */ + + return GET_MODE_SIZE (to) > GET_MODE_SIZE (from); +} + + /* Worker function for `HARD_REGNO_MODE_OK'. */ /* Returns 1 if a value of mode MODE can be stored starting with hard register number REGNO. On the enhanced core, anything larger than Index: config/avr/avr.h =================================================================== --- config/avr/avr.h (revision 244001) +++ config/avr/avr.h (working copy) @@ -216,6 +216,9 @@ These two properties are reflected by bu #define MODES_TIEABLE_P(MODE1, MODE2) 1 +#define CANNOT_CHANGE_MODE_CLASS(MFROM, MTO, RCLASS) \ + avr_cannot_change_mode_class (MFROM, MTO, RCLASS) + enum reg_class { NO_REGS, R0_REG, /* r0 */ Index: testsuite/gcc.c-torture/compile/pr78883.c =================================================================== --- testsuite/gcc.c-torture/compile/pr78883.c (nonexistent) +++ testsuite/gcc.c-torture/compile/pr78883.c (working copy) @@ -0,0 +1,12 @@ +/* { dg-do compile } */ + +int foo (int *p) +{ + int i; + for (i = 0; i < 5; i++) + { + if (p[i] & 1) + return i; + } + return -1; +}