From patchwork Mon Apr 4 10:34:20 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Sandiford X-Patchwork-Id: 891 Return-Path: Delivered-To: unknown Received: from imap.gmail.com (74.125.159.109) by localhost6.localdomain6 with IMAP4-SSL; 08 Jun 2011 14:47:07 -0000 Delivered-To: patches@linaro.org Received: by 10.204.151.92 with SMTP id b28cs57722bkw; Mon, 4 Apr 2011 03:34:24 -0700 (PDT) Received: by 10.216.62.130 with SMTP id y2mr2470257wec.20.1301913263484; Mon, 04 Apr 2011 03:34:23 -0700 (PDT) Received: from mail-ww0-f50.google.com (mail-ww0-f50.google.com [74.125.82.50]) by mx.google.com with ESMTPS id e51si9767871wej.197.2011.04.04.03.34.23 (version=TLSv1/SSLv3 cipher=OTHER); Mon, 04 Apr 2011 03:34:23 -0700 (PDT) Received-SPF: neutral (google.com: 74.125.82.50 is neither permitted nor denied by best guess record for domain of richard.sandiford@linaro.org) client-ip=74.125.82.50; Authentication-Results: mx.google.com; spf=neutral (google.com: 74.125.82.50 is neither permitted nor denied by best guess record for domain of richard.sandiford@linaro.org) smtp.mail=richard.sandiford@linaro.org Received: by wwc33 with SMTP id 33so6019734wwc.31 for ; Mon, 04 Apr 2011 03:34:23 -0700 (PDT) Received: by 10.227.202.15 with SMTP id fc15mr4225403wbb.214.1301913262967; Mon, 04 Apr 2011 03:34:22 -0700 (PDT) Received: from richards-thinkpad (gbibp9ph1--blueice2n1.emea.ibm.com [195.212.29.75]) by mx.google.com with ESMTPS id p5sm2835647wbg.11.2011.04.04.03.34.21 (version=TLSv1/SSLv3 cipher=OTHER); Mon, 04 Apr 2011 03:34:22 -0700 (PDT) From: Richard Sandiford To: gcc-patches@gcc.gnu.org Mail-Followup-To: gcc-patches@gcc.gnu.org, patches@linaro.org, richard.sandiford@linaro.org Cc: patches@linaro.org Subject: PR target/46329: Reject Neon structure constants Date: Mon, 04 Apr 2011 11:34:20 +0100 Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.1 (gnu/linux) MIME-Version: 1.0 This patch fixed PR target/46329, which is a problem that occurs when trying to reload: (set (reg:OI foo) (const_int 0)) There is no move alternative for moving constants directly into large numbers of VFPs, and it probably isn't going to be sensible to do that for all constants, even if proper support for large-int constants is implemented in future. It also isn't feasible to use the normal ARM constant pool, since the vldN and vstN instructions don't support the required addressing modes. At the moment, reload instead tries to load the constant through GPRs, having been told to do so by coproc_secondary_reload_class. That doesn't work either because there aren't enough (consecutive) GPRs to go around. Instead, this patch forces constants to the target-independent constant pool. Even if we do optimise the handling for "easy" constants like 0 in future, I think we'd still need this code for the more complicated cases. An alternative would have been to make preferred_reload_class return NO_REGS, but we should get better code by exposing the restriction earlier. The patch applies on top of: http://gcc.gnu.org/ml/gcc-patches/2011-04/msg00194.html http://gcc.gnu.org/ml/gcc-patches/2011-04/msg00195.html Tested on arm-linux-gnueabi. OK to install? Richard gcc/ PR target/46329 * config/arm/arm.c (arm_legitimate_constant_p_1): Return false for all Neon struct constants. gcc/testsuite/ 2011-04-04 Richard Earnshaw Richard Sandiford PR target/46329 * gcc.target/arm/pr46329.c: New test. Index: gcc/config/arm/arm.c =================================================================== --- gcc/config/arm/arm.c 2011-04-04 11:13:51.000000000 +0100 +++ gcc/config/arm/arm.c 2011-04-04 11:14:13.000000000 +0100 @@ -6566,8 +6566,14 @@ arm_tls_referenced_p (rtx x) When generating pic allow anything. */ static bool -arm_legitimate_constant_p_1 (enum machine_mode mode ATTRIBUTE_UNUSED, rtx x) +arm_legitimate_constant_p_1 (enum machine_mode mode, rtx x) { + /* At present, we have no support for Neon structure constants, so forbid + them here. It might be possible to handle simple cases like 0 and -1 + in future. */ + if (TARGET_NEON && VALID_NEON_STRUCT_MODE (mode)) + return false; + return flag_pic || !label_mentioned_p (x); } Index: gcc/testsuite/gcc.target/arm/pr46329.c =================================================================== --- /dev/null 2011-03-23 08:42:11.268792848 +0000 +++ gcc/testsuite/gcc.target/arm/pr46329.c 2011-04-04 11:14:18.000000000 +0100 @@ -0,0 +1,9 @@ +/* { dg-options "-O2" } */ +/* { dg-add-options arm_neon } */ + +int __attribute__ ((vector_size (32))) x; +void +foo (void) +{ + x <<= x; +}