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: 710203 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 3tsg1M6LdCz9t10 for ; Tue, 3 Jan 2017 01:48:21 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b="VY+yhNgP"; 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=F7XzXZTvK3sTLLilLskbWdvtjglHGPfXeaUZ6d2R88o4CHn0l7 CLNZ7aVaNVxHn0jnanUgiG2yPvjL+YjXQcXlBjsm/b1f+S732rMA6GkH5LKWNBbU F7IuxsNrsD6jKZRhqqjyrU4D3J5dZZFmYcwCiD6YlV0EQXwyLd/gxxC2k= 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=VY+yhNgPYUwdd3Q4ker3 9JGZmBqDg5j/AM0onB2Pn6BbQ2ndvr+CKrfhLybX8H06m6npwQn5DqtcYlEFkhua 2SwiD5b5bTlUQ7icB//z5GP2QJDShpI2rzuD8r0A/AxzNfGbYTQI4NHqkF5INqIY 8E3ao/RU7hfvSLKhNSVOe/4= 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; +}