From patchwork Fri Dec 18 12:13:31 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Greenhalgh X-Patchwork-Id: 58654 Delivered-To: patch@linaro.org Received: by 10.112.89.199 with SMTP id bq7csp984532lbb; Fri, 18 Dec 2015 04:14:01 -0800 (PST) X-Received: by 10.66.159.38 with SMTP id wz6mr4749156pab.12.1450440840998; Fri, 18 Dec 2015 04:14:00 -0800 (PST) Return-Path: Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id gw4si23726453pac.129.2015.12.18.04.14.00 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 18 Dec 2015 04:14:00 -0800 (PST) Received-SPF: pass (google.com: domain of gcc-patches-return-417693-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; spf=pass (google.com: domain of gcc-patches-return-417693-patch=linaro.org@gcc.gnu.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=gcc-patches-return-417693-patch=linaro.org@gcc.gnu.org; dkim=pass header.i=@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:from :to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-type; q=dns; s=default; b=i0blCu51oqqHx+fu nlZ0+kqu1CDfDe906tlZBHpo9qByj7Msuaeaezty/TY2NalCUPaGWzvFOGbAKIQ3 jh3eQQi3YFokxgjAJNLNniGebXdsGGm1SpBk/8uykU5O+LRzGo2TLpN1fYYOAsP7 fXfvDThxMgL9x8hMsIHoeNv/DPE= 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:from :to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-type; s=default; bh=XXlIC288jkm/oeA35QsPu5 L2tm0=; b=UYctyWCub/PdpH+4anWMJVeYKxbB8k6cGuiNPSpvfdxUBy4VOfcvdU KGWCop6tfDGkBwvCmL0O33NzwVUp6xYVY1WRMhqhsWGNeG+rUwBb3TcM9h5eBE8f M0Zx0KpTdEvulecE+wAMAERuMCwbyr0K/roJPSOlsd1ce7pMBbaAY= Received: (qmail 62895 invoked by alias); 18 Dec 2015 12:13:49 -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 62867 invoked by uid 89); 18 Dec 2015 12:13:47 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.8 required=5.0 tests=AWL, BAYES_00, SPF_PASS autolearn=ham version=3.3.2 spammy=alphabetical, Hx-spam-relays-external:sk:HE1PR08, HX-Microsoft-Antispam-PRVS:sk:HE1PR08, H*RU:sk:HE1PR08 X-HELO: eu-smtp-delivery-143.mimecast.com Received: from eu-smtp-delivery-143.mimecast.com (HELO eu-smtp-delivery-143.mimecast.com) (146.101.78.143) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 18 Dec 2015 12:13:45 +0000 Received: from EUR01-DB5-obe.outbound.protection.outlook.com (mail-db5eur01lp0177.outbound.protection.outlook.com [213.199.154.177]) (Using TLS) by eu-smtp-1.mimecast.com with ESMTP id uk-mta-23-EHpOQgALQIePw9flcGUAeg-1; Fri, 18 Dec 2015 12:13:39 +0000 Received: from AM3PR08CA0066.eurprd08.prod.outlook.com (10.163.23.162) by HE1PR08MB0858.eurprd08.prod.outlook.com (10.164.53.20) with Microsoft SMTP Server (TLS) id 15.1.355.16; Fri, 18 Dec 2015 12:13:36 +0000 Received: from AM1FFO11FD045.protection.gbl (2a01:111:f400:7e00::169) by AM3PR08CA0066.outlook.office365.com (2a01:111:e400:8854::34) with Microsoft SMTP Server (TLS) id 15.1.361.13 via Frontend Transport; Fri, 18 Dec 2015 12:13:36 +0000 Received: from nebula.arm.com (217.140.96.140) by AM1FFO11FD045.mail.protection.outlook.com (10.174.65.208) with Microsoft SMTP Server (TLS) id 15.1.355.15 via Frontend Transport; Fri, 18 Dec 2015 12:13:36 +0000 Received: from e107456-lin.cambridge.arm.com (10.1.2.79) by mail.arm.com (10.1.106.66) with Microsoft SMTP Server id 14.3.266.1; Fri, 18 Dec 2015 12:13:34 +0000 From: James Greenhalgh To: CC: , , Subject: Backport: [Patch AArch64] Reinstate CANNOT_CHANGE_MODE_CLASS to fix pr67609 Date: Fri, 18 Dec 2015 12:13:31 +0000 Message-ID: <1450440811-2928-1-git-send-email-james.greenhalgh@arm.com> In-Reply-To: References: MIME-Version: 1.0 X-EOPAttributedMessage: 0 X-Microsoft-Exchange-Diagnostics: 1; AM1FFO11FD045; 1:99/XEYTRNSebdtgKe8K5ssfItAa0oY32Kc9CgROBX0nohSxeSGEaN+qoi7XkW9gQRdu2nBqg/V4E8WGKgtnkkA42n7mrnsQEhfexs/Zg/Oke77ahVALw/RXc68L3S96A1gvSoYJUrD1Bl9q37RTkol+AueJZCOdj3HWYASQTxFkrLAxhBZh2eSjwXMMKMEChjweixeMQwVcSmENiP/AUpTZwel/GYczD4dDuGnTxkh0dC9flUvXBGl1g2R5kT9U87fyp4tQIWC4YhghjUNlyj6voexsRdtOq+ZyrExC0srTYfZGE3ly/s6gx8x9X7wqbR79PUj0/o4CgJ7H7wBKtJA6eS8IcRTMjviIiPrVMzG4= X-Forefront-Antispam-Report: CIP:217.140.96.140; CTRY:GB; IPV:CAL; IPV:NLI; EFV:NLI; SFV:NSPM; SFS:(10009020)(979002)(6009001)(2980300002)(438002)(189002)(164054003)(377424004)(199003)(24454002)(6806005)(110136002)(86362001)(50986999)(229853001)(4610100001)(2476003)(2351001)(92566002)(2950100001)(512874002)(1096002)(77096005)(1220700001)(104016004)(11100500001)(5890100001)(76176999)(5008740100001)(26826002)(106466001)(4001150100001)(586003)(189998001)(19580405001)(450100001)(568964002)(87936001)(19580395003)(33646002)(5003600100002)(84326002)(50226001)(36756003)(969003)(989001)(999001)(1009001)(1019001); DIR:OUT; SFP:1101; SCL:1; SRVR:HE1PR08MB0858; H:nebula.arm.com; FPR:; SPF:Pass; PTR:fw-tnat.cambridge.arm.com; MX:1; A:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; HE1PR08MB0858; 2:sy+LsfZ7aKgQY/SKAR1meUyHpSTneffBx/jR//EJJpwJ0APFYsvcjdmHA6+y4v8Fx3wVbgmEJhz9aMRXnFXHatAe4TjDJYo/7+TBOsNCDdX0zeJWdg/W5XNdYfoAuz68ac9P+ExGCnIKFegDYVdvIw==; 3:Qbp0B97QhJSTWREo8IQZ6ryunQl6Eeubm525BGMjk3vf+PCMo8enJ4MXy407gQPCHbgarZCo7eAGwp0yt9olHzauGiC7uTTztLD9SGBe/epYTammJ/lBlLsKlQHX1bsJqHpq65CMe+5uhPEmJSwQVXYwf1wwdksbJBLJhlbURDaDkSbBg6qdiDu0dS5DKc69oF2qMqLdYuceMsJ9rMFYPJfqidioR5V5JZ1+51opKsT4DAGMdtjMp1MaV4ADE6lJE8qzZzgTA7bvMzCaKFZRdw==; 25:w4P9lcfJcSrlJbZ/uM1xRxK6mbFeR4LYmvkK7DdCoKzWKYUsfTLwppV4eVJDxo34pU+NrDq8TR4Dgavfap/SW3MpC6+T1t9hkpWbrEuw19H/ltkpTwWd+HGpHYtJ2PW1DeraLBvhcPokY5fkNI9PNkOoXF+6CtXX05BtCc3whElhflD8C7ssFHH6fSlC7PWECG9eAKy7gjmpk0uuFDP1nDlV++4gUBTWdhkydPPzSEWyG/qfYXGydwh8mPUwxEJT5nj91f4RNvtWN6KVuFWi/g==; 20:wog1HUZK0XYuiBD6RwaDXvQrJJc3N3C30+CjRKrDHXj8slz6rr+Jss5ozOCZgWJ/PP0eZsND1kX45IN2yNg2s8TS+/njazQW3YY2fvLZepI8Mh2pDan0W++8s9wZP7hi5hlhk68DVSgH7x553Vse/GEsnuP7Y9dozDh8Fcvnk6c= X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(8251501001); SRVR:HE1PR08MB0858; NoDisclaimer: True X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(180628864354917); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(601004)(2401047)(520078)(8121501046)(5005006)(3002001)(10201501046); SRVR:HE1PR08MB0858; BCL:0; PCL:0; RULEID:; SRVR:HE1PR08MB0858; X-Microsoft-Exchange-Diagnostics: 1; HE1PR08MB0858; 4:JWWmZk3Oq4q4b8cgSUdFVB/uz+kiH8g0O+xThZxK2s8olCnpWZk+F7wOdFGIRUEeTyhA6x/vtNQcVwelNzdANdBP+GybnOecc9rKpFhgoPdAIy9cx5yqcgeU/bf+YsxfT6WkzOGBuQOn1FA18VIDOeQsCzfzZ9Indr78nZVnsfHWPP6fc9H0tOlzndmUcbht/kXbTeGG+bYPsxk+hdZOpF8TLsY/A8KKwVoagbZjm5WG5/xDbNp5MvT4lbREWkHHAjh/ZjobBLZf+LuHh49F/QJHAw8Tvy8QOU6oR8I/ck6rT3msTnxJyGouiM7v+BFFTQ6EQhpIuxeTeu96PKLBplViVArkb8+wDU9e6Gr89oEsTawZmXnn7HA8B/bai7JfxTFAvdUqGkdiJKsuEfak7I+F6vNllC+9gAAePXJpoS/If4EKB1oB7bSxign/3OX3 X-Forefront-PRVS: 07943272E1 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; HE1PR08MB0858; 23:7FWBym3WYG9Qk5V1DIzXveRhSUTsJ8SLslweOr+of?= =?us-ascii?Q?9Y7D2qzDAvTKMVaDKvTw5Aldp+Z/xo40dBy6TGeV4tPG/VtzQER8irD3z5XR?= =?us-ascii?Q?3Zqm0TyQZ9F1SF/oipLBogBgLwow9VLvzTClVPR+2eXCggx1LbHyLI/wXXkR?= =?us-ascii?Q?HAgrrzVsBGqwYiJEIGxCJwpxLpVtEQxNgz3+IZInjzAFORS3lOUMnjw/gYLa?= =?us-ascii?Q?Et2d4f7mdW2Iz1ws1C3JSdKTgDBT8BxX5D9rgyx6mzS8aNdJQze5uO6EY3DL?= =?us-ascii?Q?aI79PTxQC8Rcv8+zlPwvNq7VV9LVmYEoeZKAAoShtmN1pkH5WSv9NITXLe7k?= =?us-ascii?Q?xhc6KtLWTYb93YwmMoLLJg6mYEf1fDXvdvIpmk0u6+L1uizE8rZhZLAdRLdG?= =?us-ascii?Q?mV4LUtKH09x84yuR85BAsM2EVva0VWlULEqISCLRdKGS7521cXkdPoBNuR/V?= =?us-ascii?Q?MRDK8w1P+glTpYkr4OK9ffiA4foYIdZakCY4Aky8U50w5YNzt6omDVOZTWT8?= =?us-ascii?Q?WoQTHIaScCY7uIEW2EjTER1RZ15sNhs0/l6ZtuC9XNl1RUP/VxDlDrRjUZqb?= =?us-ascii?Q?UOUE07GWV9TtuiemaFV3arrQ3D/QtGEz58E/OO1+9fuLEEsaNQG9+y9Yq185?= =?us-ascii?Q?qo5ltYVVVQUeaE6JRCaMpcagaAAe6fw7UkINtr0StbEo92M54kXPSvV/jwC0?= =?us-ascii?Q?W9u2FQy7kPlpAenODBNOE+W5U3naqCV4U6Bp+uX7Tv4bYn56MOoEkroV6G1c?= =?us-ascii?Q?ndvu2cQ/FyLN5QjyWxID3RsgtAnC4bLGAXTUYouiFFOuIGEt40zXBopxctAb?= =?us-ascii?Q?JgrXtMh4JGQzvv+IOTO6CP/Ll/nYqp4GqJz/0On5HRzp9UI93mrWo8NH7RhU?= =?us-ascii?Q?FAmZHHS6pON6iHkPwLhbAsym5OSvJuf8fWQpfPB2gkuej8KNDTOWbzgbdR+y?= =?us-ascii?Q?jCT/HqbAC2hQKwx7EQRldRx0dHDaYb5CXvBOJqamhIlelMH8PD2e4M347ex3?= =?us-ascii?Q?fKc+BAxR2mbIuhaBM6eydfZvjn3ZicSK1LYGlCJgqchq/MnnaDZLpIpbaGR4?= =?us-ascii?Q?iJSwacv0MsApPe0SKs6VwiNo0/6yz8YmgkhnIL2NK2tDaLUwfUmZupeVYY1Q?= =?us-ascii?Q?3COZvRdva09aDE24R0ikBcrKgTAh6I4ZIOlp7C284xo3XIBbYskPcuDumr/8?= =?us-ascii?Q?3X8lNYp5vpvPinCqQ+4CDwPwe5/nd26TK07g4OHpVe59/kZYfVLK1NoMQ=3D?= =?us-ascii?Q?=3D?= X-Microsoft-Exchange-Diagnostics: 1; HE1PR08MB0858; 5:BjvGL1MjUuiMkv/GmGK2YRhefD9mw5Zoy1jPIQXCeynvm4gYoQgeYsxPBSeizkfEJdoZxpyWmVkzmmO3uz7vWGvMaTa2dvHz71ioNduIOpNdEafodLPAfASiE+EvilLtV3N0tz/5YeHIw8MwAqssHA==; 24:cS5cnfko1EC9RJOuesjAuEfQXPeKZdE39z9xOsLniIa/a8KlcMo41/LpASXM81LZZUM1TGgFebJqt8ugRJchswG46/9QlBejIoGYIGzkZis=; 20:46Oj1OPGFhmkzn4jfI1F8Dq6Jf8S9P2QIxi82zMATj/epDOnIOT+j5Rv0mXsX5Vkmi3Qp5iwrNQnpzPis1kpu92RbVeBFEEqDIZx68RwxEaayN8wXPXK2XyjWkuMj9Ce7LstXPV0exhWM+z300gWQjhhgZ1MFfOOmgf7NyzbVxs= SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Dec 2015 12:13:36.6295 (UTC) X-MS-Exchange-CrossTenant-Id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=f34e5979-57d9-4aaa-ad4d-b122a662184d; Ip=[217.140.96.140]; Helo=[nebula.arm.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: HE1PR08MB0858 X-MC-Unique: EHpOQgALQIePw9flcGUAeg-1 X-IsSubscribed: yes On Mon, Dec 14, 2015 at 11:49:26AM +0000, Marcus Shawcroft wrote: > On 14 December 2015 at 11:01, James Greenhalgh wrote: > > On Wed, Dec 09, 2015 at 01:13:20PM +0000, Marcus Shawcroft wrote: > >> On 27 November 2015 at 13:01, James Greenhalgh wrote: > >> > >> > 2015-11-27 James Greenhalgh > >> > > >> > * config/aarch64/aarch64-protos.h > >> > (aarch64_cannot_change_mode_class): Bring back. > >> > * config/aarch64/aarch64.c > >> > (aarch64_cannot_change_mode_class): Likewise. > >> > * config/aarch64/aarch64.h (CANNOT_CHANGE_MODE_CLASS): Likewise. > >> > * config/aarch64/aarch64.md (aarch64_movdi_low): Use > >> > zero_extract rather than truncate. > >> > (aarch64_movdi_high): Likewise. > >> > > >> > 2015-11-27 James Greenhalgh > >> > > >> > * gcc.dg/torture/pr67609.c: New. > >> > > >> > >> + detailed dicussion. In all other cases, we want to be premissive > >> > >> s/premissive/permissive/ > >> > >> OK /Marcus > > > > Thanks. > > > > This has had a week or so to soak on trunk now, is it OK to backport to GCC > > 5 and 4.9? > > > > The patch applies as-good-as clean, with only a little bit to fix up in > > aarch64-protos.h to keep alphabetical order, and I've bootstrapped and tested > > the backports with no issue. > > OK /Marcus > Looking back at the patch just before I hit commit, the 4.9 backport was a little different (as we still have a CANNOT_CHANGE_MODE_CLASS there). We can drop the aarch64-protos.h and aarch64.h changes, and we need to change the sense of the new check, such that we can return true for the case added by this patch, and false for the limited number of other safe cases in 4.9. Bootstrapped on aarch64-none-linux-gnu. OK? Thanks, James --- gcc/ 2015-12-14 James Greenhalgh Backport from mainline. 2015-12-09 James Greenhalgh PR rtl-optimization/67609 * config/aarch64/aarch64.c (aarch64_cannot_change_mode_class): Don't permit word_mode subregs of full vector modes. * config/aarch64/aarch64.md (aarch64_movdi_low): Use zero_extract rather than truncate. (aarch64_movdi_high): Likewise. gcc/testsuite/ 2015-12-14 James Greenhalgh Backport from mainline. 2015-12-09 James Greenhalgh PR rtl-optimization/67609 * gcc.dg/torture/pr67609.c: New. diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c index 8153997..5ca38b6 100644 --- a/gcc/config/aarch64/aarch64.c +++ b/gcc/config/aarch64/aarch64.c @@ -8405,6 +8405,18 @@ aarch64_cannot_change_mode_class (enum machine_mode from, enum machine_mode to, enum reg_class rclass) { + /* We cannot allow word_mode subregs of full vector modes. + Otherwise the middle-end will assume it's ok to store to + (subreg:DI (reg:TI 100) 0) in order to modify only the low 64 bits + of the 128-bit register. However, after reload the subreg will + be dropped leaving a plain DImode store. See PR67609 for a more + detailed dicussion. In some other cases we can be permissive and + return false. */ + if (reg_classes_intersect_p (FP_REGS, rclass) + && GET_MODE_SIZE (to) == UNITS_PER_WORD + && GET_MODE_SIZE (from) > UNITS_PER_WORD) + return true; + /* 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) diff --git a/gcc/config/aarch64/aarch64.md b/gcc/config/aarch64/aarch64.md index 24bb029..d6c6b1e 100644 --- a/gcc/config/aarch64/aarch64.md +++ b/gcc/config/aarch64/aarch64.md @@ -3454,7 +3454,8 @@ (define_insn "aarch64_movdi_low" [(set (match_operand:DI 0 "register_operand" "=r") - (truncate:DI (match_operand:TX 1 "register_operand" "w")))] + (zero_extract:DI (match_operand:TX 1 "register_operand" "w") + (const_int 64) (const_int 0)))] "reload_completed || reload_in_progress" "fmov\\t%x0, %d1" [(set_attr "type" "f_mrc") @@ -3463,9 +3464,8 @@ (define_insn "aarch64_movdi_high" [(set (match_operand:DI 0 "register_operand" "=r") - (truncate:DI - (lshiftrt:TX (match_operand:TX 1 "register_operand" "w") - (const_int 64))))] + (zero_extract:DI (match_operand:TX 1 "register_operand" "w") + (const_int 64) (const_int 64)))] "reload_completed || reload_in_progress" "fmov\\t%x0, %1.d[1]" [(set_attr "type" "f_mrc") diff --git a/gcc/testsuite/gcc.dg/torture/pr67609.c b/gcc/testsuite/gcc.dg/torture/pr67609.c new file mode 100644 index 0000000..817857d --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr67609.c @@ -0,0 +1,33 @@ +/* { dg-do run } */ + +typedef union +{ + double v[2]; + double s __attribute__ ((vector_size (16))); +} data; + +data reg; + +void __attribute__ ((noinline)) +set_lower (double b) +{ + data stack_var; + double __attribute__ ((vector_size (16))) one = { 1.0, 1.0 }; + stack_var.s = reg.s; + stack_var.s += one; + stack_var.v[0] += b; + reg.s = stack_var.s; +} + +int +main (int argc, char ** argv) +{ + reg.v[0] = 1.0; + reg.v[1] = 1.0; + /* reg should contain { 1.0, 1.0 }. */ + set_lower (2.0); + /* reg should contain { 4.0, 2.0 }. */ + if ((int) reg.v[0] != 4 || (int) reg.v[1] != 2) + __builtin_abort (); + return 0; +}