From patchwork Thu Jan 16 18:22:15 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tejas Belagod X-Patchwork-Id: 311816 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 3963D2C007C for ; Fri, 17 Jan 2014 05:22:28 +1100 (EST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :message-id:date:from:mime-version:to:subject:references :in-reply-to:content-type; q=dns; s=default; b=I9uqNzwH5ilkIpVqy zUTlvG+naMpqzzQzmJ7UIvvbJN1LDSfWs9MHUwhvj2rhYBzH/EdGcs8Dgk9phAAx F/yyz29y79hCbbV5L4lsQJ4BXDo/DQ7WMRKq7s2CT3xX0tG+eAiBrL/CwneKHpuH 49/IBRj/pTQ1DiaviChuZ0IrJo= 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 :message-id:date:from:mime-version:to:subject:references :in-reply-to:content-type; s=default; bh=DHo4lbNrDF4qkEE6xfh0IPm 4Yyo=; b=CPl/CE+4Fcy2e+7DBWD2mlY/8zbKE17Cufj/nerWLFYalwctXSajY1N lRAZ95/bdPMDVhECsF4CyynA7SzCZGUtvdCsvJ+WgbZuya0GmdCxR2xbvGO/imw1 HEH72FyoMaWfy+JvTf38SIpswaT0HGRwUxiSHdEXcWvbfFTgYqW8= Received: (qmail 14374 invoked by alias); 16 Jan 2014 18:22:21 -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 14364 invoked by uid 89); 16 Jan 2014 18:22:20 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.4 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=ham version=3.3.2 X-HELO: service87.mimecast.com Received: from service87.mimecast.com (HELO service87.mimecast.com) (91.220.42.44) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 16 Jan 2014 18:22:19 +0000 Received: from cam-owa1.Emea.Arm.com (fw-tnat.cambridge.arm.com [217.140.96.21]) by service87.mimecast.com; Thu, 16 Jan 2014 18:22:16 +0000 Received: from [10.1.203.80] ([10.1.255.212]) by cam-owa1.Emea.Arm.com with Microsoft SMTPSVC(6.0.3790.3959); Thu, 16 Jan 2014 18:22:16 +0000 Message-ID: <52D82357.1030303@arm.com> Date: Thu, 16 Jan 2014 18:22:15 +0000 From: Tejas Belagod User-Agent: Thunderbird 2.0.0.18 (X11/20081120) MIME-Version: 1.0 To: "gcc-patches@gcc.gnu.org" Subject: Re: [Patch, AArch64] Relax CANNOT_CHANGE_MODE_CLASS. References: <5297290D.7090806@arm.com> <52A0A6AE.5080800@arm.com> In-Reply-To: <52A0A6AE.5080800@arm.com> X-MC-Unique: 114011618221604501 X-IsSubscribed: yes Tejas Belagod wrote: > Tejas Belagod wrote: >> Hi, >> >> Currently, CANNOT_CHANGE_MODE_CLASS is too restrictive wrt the mode-changes it >> allows on FPREGs - it allows none at the moment. In fact, there are many mode >> changes that are safe and can be allowed. For example, in a pattern like: >> >> (subreg:SF (reg:V4SF v0) 0) >> >> it is legal to reduce this to >> >> (reg:SF v0) >> >> The attached patch helps parts of rtlanal.c make such decisions(eg. >> simplify_subreg_regno). >> >> Tested on aarch64-none-elf and aarch64_be-none-elf. OK for trunk? >> >> Thanks, >> Tejas Belagod >> ARM. >> >> Changelog: >> >> 2013-11-28 Tejas Belagod >> >> gcc/ >> * config/aarch64/aarch64-protos.h (aarch64_cannot_change_mode_class): >> Declare. >> * config/aarch64/aarch64.c (aarch64_cannot_change_mode_class): New. >> * config/aarch64/aarch64.h (CANNOT_CHANGE_MODE_CLASS): Change to call >> backend function aarch64_cannot_change_mode_class. >> > > Hi, > > I'm testing a patch that is more general than the change presented here for > CANNOT_CHANGE_MODE_CLASS. This patch is now defunct. Ideally CANNOT_CHANGE_MODE_CLASS should be undefined, but that exposed a bug in LRA and subregs in general. Until http://gcc.gnu.org/ml/gcc/2013-12/msg00086.html and http://gcc.gnu.org/ml/gcc/2014-01/msg00087.html are resolved, we have to run with the attached patch. It is a slightly modified version of the initial patch. Tested on aarch64-none-elf and aarch64_be-none-elf. OK for trunk? Thanks, Tejas. 2014-01-16 Tejas Belagod gcc/ * config/aarch64/aarch64-protos.h (aarch64_cannot_change_mode_class_ptr): Declare. * config/aarch64/aarch64.c (aarch64_cannot_change_mode_class, aarch64_cannot_change_mode_class_ptr): New. * config/aarch64/aarch64.h (CANNOT_CHANGE_MODE_CLASS): Change to call backend hook aarch64_cannot_change_mode_class. diff --git a/gcc/config/aarch64/aarch64-protos.h b/gcc/config/aarch64/aarch64-protos.h index 489fd1c..3dcc7c3 100644 --- a/gcc/config/aarch64/aarch64-protos.h +++ b/gcc/config/aarch64/aarch64-protos.h @@ -160,6 +160,9 @@ struct tune_params HOST_WIDE_INT aarch64_initial_elimination_offset (unsigned, unsigned); bool aarch64_bitmask_imm (HOST_WIDE_INT val, enum machine_mode); +bool aarch64_cannot_change_mode_class (enum machine_mode, + enum machine_mode, + enum reg_class); enum aarch64_symbol_type aarch64_classify_symbolic_expression (rtx, enum aarch64_symbol_context); bool aarch64_constant_address_p (rtx); diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c index b1b4eef..6567a1b 100644 --- a/gcc/config/aarch64/aarch64.c +++ b/gcc/config/aarch64/aarch64.c @@ -8209,6 +8209,42 @@ aarch64_vectorize_vec_perm_const_ok (enum machine_mode vmode, return ret; } +/* Implement target hook CANNOT_CHANGE_MODE_CLASS. */ +bool +aarch64_cannot_change_mode_class (enum machine_mode from, + enum machine_mode to, + enum reg_class rclass) +{ + /* Full-reg subregs are allowed on general regs or any class if they are + the same size. */ + if (GET_MODE_SIZE (from) == GET_MODE_SIZE (to) + || !reg_classes_intersect_p (FP_REGS, rclass)) + return false; + + /* Limited combinations of subregs are safe on FPREGs. Particularly, + 1. Vector Mode to Scalar mode where 1 unit of the vector is accessed. + 2. Scalar to Scalar for integer modes or same size float modes. + 3. Vector to Vector modes. */ + if (GET_MODE_SIZE (from) > GET_MODE_SIZE (to)) + { + if (aarch64_vector_mode_supported_p (from) + && GET_MODE_SIZE (GET_MODE_INNER (from)) == GET_MODE_SIZE (to)) + return false; + + if (GET_MODE_NUNITS (from) == 1 + && GET_MODE_NUNITS (to) == 1 + && (GET_MODE_CLASS (from) == MODE_INT + || from == to)) + return false; + + if (aarch64_vector_mode_supported_p (from) + && aarch64_vector_mode_supported_p (to)) + return false; + } + + return true; +} + #undef TARGET_ADDRESS_COST #define TARGET_ADDRESS_COST aarch64_address_cost diff --git a/gcc/config/aarch64/aarch64.h b/gcc/config/aarch64/aarch64.h index cead022..b58fe04 100644 --- a/gcc/config/aarch64/aarch64.h +++ b/gcc/config/aarch64/aarch64.h @@ -818,13 +818,8 @@ do { \ extern void __aarch64_sync_cache_range (void *, void *); \ __aarch64_sync_cache_range (beg, end) -/* VFP registers may only be accessed in the mode they - were set. */ #define CANNOT_CHANGE_MODE_CLASS(FROM, TO, CLASS) \ - (GET_MODE_SIZE (FROM) != GET_MODE_SIZE (TO) \ - ? reg_classes_intersect_p (FP_REGS, (CLASS)) \ - : 0) - + aarch64_cannot_change_mode_class (FROM, TO, CLASS) #define SHIFT_COUNT_TRUNCATED !TARGET_SIMD