From patchwork Wed Jan 8 11:48:05 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Carlotti X-Patchwork-Id: 104342 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id DC0A23858D39 for ; Wed, 8 Jan 2025 11:49:04 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org DC0A23858D39 Authentication-Results: sourceware.org; dkim=pass (1024-bit key, unprotected) header.d=arm.com header.i=@arm.com header.a=rsa-sha256 header.s=selector1 header.b=Yzz/Uj/i X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from EUR05-AM6-obe.outbound.protection.outlook.com (mail-am6eur05on2061b.outbound.protection.outlook.com [IPv6:2a01:111:f403:2612::61b]) by sourceware.org (Postfix) with ESMTPS id 0EEFF3858D28 for ; Wed, 8 Jan 2025 11:48:14 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 0EEFF3858D28 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=arm.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 0EEFF3858D28 Authentication-Results: server2.sourceware.org; arc=pass smtp.remote-ip=2a01:111:f403:2612::61b ARC-Seal: i=2; a=rsa-sha256; d=sourceware.org; s=key; t=1736336894; cv=pass; b=ZXUQr4uLRmGIta4HoDaYwRzd9VYpai/C41mNe/R64vjXTuF7pVWboXVAwd+l4TAibBcd7vtHLN0pJ1cKTzMOAqMPpXtBbMTrWrMWGwrTLQL0DfgpTGleua9kM12oLMuGwLPai2jXRxbmuobTT89Wv8L4QWnRILnY9wvTlSp0wxk= ARC-Message-Signature: i=2; a=rsa-sha256; d=sourceware.org; s=key; t=1736336894; c=relaxed/simple; bh=weU5yQYWu5a/rY/bGS/sMfUFKdvPBMr1rPgY55C68TA=; h=DKIM-Signature:Date:From:To:Subject:Message-ID:MIME-Version; b=xZgLehd6kdAvdC629gRDAY9dKMVG48xWvGT62YubLaIv9QjRaJOnYuqWS5dOX/o/TXCSrw6/rxan8FZ7dGt12/wSPNr27FYT3xbntcZFLi/ohrAGoD+QzkxSj1V35qKfW/WwPZnhckeJLDBt1ZdA8r57CXatvo019chBrZfwXTo= ARC-Authentication-Results: i=2; server2.sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 0EEFF3858D28 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=brlppDXlm0N3DQXs9Ymn/ckn+8casACEA7YENBCyvKDWxysdRoRCXmPLxy8aQM4PT0tai25qMrYllfXO+8X41Mqo5O6sig5lDjrKevJE5heW3ek2087lZsobSZspanB5bwjPCdajS/4/hpxDg8Ko283mWxRLTBDpM9kUjongqBn70SBRjsPYsQq4H8usE2uPt6ArmNs7bL34aJ72P9KggggGwELxP6dU/Abic5XlLYIP4cNnrETLo4G3ZYR0F/Gj511O61u33BTIvnUZCf8Dt03tX4RNSEB8VDWyNTFyqz1JEYZCVQBmmrAk6bGJYPwfKe0V0m+vaW7k8sp+M6e7GA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=nNE2g2Wdl0DnLlgH5FyBou8Rw+AFYGVY/ofn1smmMdY=; b=PkpvuOopMjVv24526I6va6lHnpIf07z6H8OoQGhH75efwhf0MCbclNA7DVWInIkwwMQo4hWW0P1fsr0/JSvUX3O0bbnEDdgPHmO77luGbceSneBC/6XsKKS1az+PSDe7LBd31ZubmNw4pHX6WDNFu8KajeRsjjR4+I4qUED3LcBO/TjgC5uT+s9YojdV251PkVP5VBqDKRx/gnDCeDoEH9VMsbp6H5UyNm1CzwT2XXBXh6GcAEca31GVLDOOoi5tOCkJBUD5jJZvkWCM5us/viTJvP4ER8TShlO/sRvi/f5GqHTW2OlmnSYmDWROsci3D1AE2tWoAkuMBMKkYwHtkw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=arm.com; dmarc=pass action=none header.from=arm.com; dkim=pass header.d=arm.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=arm.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=nNE2g2Wdl0DnLlgH5FyBou8Rw+AFYGVY/ofn1smmMdY=; b=Yzz/Uj/iKtRFNk1c2hfdI6/pIfPCVVwBxdm1gVIl0jRO5NN9yvw3OAzYMk5xsSdjEGwyf19XuOJJK75CtLqibdnLeGMhJDOag75EIRIr0yNxiDPcJEppmYi00o5K3vSxOeUr1xGE/aHJTailSXw6YzBKEBiLuDNS14+l35PIkL8= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com; Received: from DU0PR08MB8255.eurprd08.prod.outlook.com (2603:10a6:10:411::9) by GV1PR08MB10597.eurprd08.prod.outlook.com (2603:10a6:150:166::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8335.11; Wed, 8 Jan 2025 11:48:08 +0000 Received: from DU0PR08MB8255.eurprd08.prod.outlook.com ([fe80::cbc8:c020:6a1b:d27a]) by DU0PR08MB8255.eurprd08.prod.outlook.com ([fe80::cbc8:c020:6a1b:d27a%3]) with mapi id 15.20.8335.011; Wed, 8 Jan 2025 11:48:08 +0000 Date: Wed, 8 Jan 2025 11:48:05 +0000 From: Andrew Carlotti To: gcc-patches@gcc.gnu.org Cc: Yangyu Chen , Jeff Law , Kito Cheng , Richard Sandiford , Alfie Richards Subject: [PATCH] Disable a broken multiversioning optimisation Message-ID: <2df8081a-db6f-acb3-2882-329de3223dbb@e124511.cambridge.arm.com> Content-Disposition: inline X-ClientProxiedBy: LO4P123CA0047.GBRP123.PROD.OUTLOOK.COM (2603:10a6:600:152::16) To DU0PR08MB8255.eurprd08.prod.outlook.com (2603:10a6:10:411::9) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DU0PR08MB8255:EE_|GV1PR08MB10597:EE_ X-MS-Office365-Filtering-Correlation-Id: 65a683d5-5fdb-4c36-6f65-08dd2fda51ee x-checkrecipientrouted: true NoDisclaimer: true X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|376014|366016; X-Microsoft-Antispam-Message-Info: zFvMV4Ea1HEvRuSY4aj3KRcGusPTXcjU1yBdKPJJsVNrAc0bdTfqp2JV1PDu+QREEHiN0zmNEGxDz2aNhnoSUSjRdwM6w8WHMDNG8PifT513JdwUGwyWCkgc3QFEWa3YkrNO/ulHKZMGvJqijQJA943XJDm7Ohw9rWGwK8K0iii6phb0WiDzHGYS3hINtBEpMZtErPBKxjDOnMntAqCzaj1cY39jLQwrMYnNedfWpFdMuFgjUx/WNU90vv8hVKWh+wYb4Rvz0Z8RX4Qx9PP14sfNv04BpYEjNWBfEt34XlfkYEVBMffqqBPZ2GklyJXWLHZfLjb+szXRwwcV6axKn6fn5z1eGE/HpUbHl0AAqWWaOQAkgn3CRMQ1agvRF07tkqxPSjnNa3tVs+l1tN6oVQNXsMhkDedlFhCO8R0B9icxsjSPDovbUPRPwc5Ry+fOhwGMn99hM+jOAHhY3rabdk0vezIteIZ9jEQZkCGZTr0kcs1GOsUMYifs9DwV9QVw+P4NjPbuGJeQXL9EU8Br1rLEr90BPiKIRslsmJ7wFh+CwxROJfUGs+APr5wNugQSwUPBumBB42V/bDcADMFPPbr2YrxArT/D5oj1ewcukg8YefKO4IDmo5+gAPUE6WB6T2gbbhgKhkO0oy5PXUJfC6TEfiW0ktqfW6XB2H2Nw4g1tz9RUGoKqbtcwzyGpapdeWoMlhDBuJgiLyzQXaBGAia+xrsU141/2YD/B6f5yvYorZ4FTkn21blMqvtJtXk8+JdbKPFSa0ucgiShlSdAirGlPbCCR49cvunpbUUA8qTqiPsYTG0LJH0y/vvbIy2R05fVNanPO52OI1U56JhkYNbyQ2Dopqti+0edSl1fxCocaZ9QnyxmVDV6AHl/EGGicYfcdUsTYyS96pcvaK74m6+DaYYcde4qQvIp+3KeEYs0d1uKo1nrabOjTRYSfhOZ2qRYtHX8TtfoVhC/7HCQO2vI3uGJb6m0UrtaY3V//c726MaZKYUxM2CvOiUR+tvVX8fX4Gk2TJb4tupRQATk1ZsIK/5CaCm5IaDhoqUJqLz34uOnc4OgBVu2aP0fvM+L+7sCKqAI7u/+z6qpvmIK9MrcgoDOL0aee9VCHFmfm7jfD7fh0M7JSpmlFKOFc+8eDhTEDQAPhdoXZG/u7917rN6sMBcvASfdiiBrVyzxU0hn8d5BWNPJ3tebV3FovcC+9JpuU/tSXbAciy1OTuQPm1BVfXNdQLKSZ6ldSHZfLbxuLCQlfFVDuDDk/S4dkPJ+qm4Sm+8zW3+6q+vUW8uwZeS5Yk4UKviyp8kArmeEnVvU6mtY5QIzA2ds3QEZBpAcB5ztpCiTiv0ZNJcsN8yoJIJYxubbLb8L522cOllELIqT5u9si4CxAV0N/pL+wfTN X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:DU0PR08MB8255.eurprd08.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230040)(1800799024)(376014)(366016); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: 7sXeIeW8IXD1dFBe7mznAX+xLYs1h+R5QsoNB5/nbeXV87MEvCVZtKIGSv0ltzVrUA8AnjjnvoimLl41zWjVGUsF0xj1ZbmErpSosHrPkSaawx8KFpkOgk10XTl07un9x4nl+4ltnmSx2dkM0OfkdfB9bJYtNeNP18MqBEgXIhs1SwGnJVMbFcB72NQ3FYkyBl5vgVoHbU837iKJKCg7gOd8uQA+ZbnCBG7ZdyrLaPQx/lvwXJnCu9F2hjV5uoYP8P3UbqIDmbnDjR4lfrCYQnt+UTcS6FIU0bQOkTNm0KT9DpmgUPz2+uqc3TAknkGA/hXXhbB+0yuS9mLhsFgTYXUfUH3vVwUhzZ6Dmh8DxSAgm8M0sFHDKk944j+nyCfTKVySnOfTfDy0OUfj1vLLnJgVzlBF1I0hDh9C99NFj3zm0QEVIVAitqe+W+a81Dci1gQaS3Pb+RmdSwRW8ue2BiA6b6GeOigbctF2GGD5+lEjY8ZQDGJRXTEo6kD54kxZrDJHaOCcEADga/Hn6/i1IwVZ8LGkmxIUx9A3qL3yldKkRElxvZej0Mf09e5xCrV16PCvZkEqElGvVXtFRJXBPJkAq/H4bxjDfW4iD+yHFiYq5uoNISBHIjuT+KPbJ9yDCb8zZfY7vQpD+nfN/pPX2ZryH6FF40TbEOk38wNQO9TIt9472ESq1AZD1GAJ/5wPh3skMu3jz5Wl1kVGIrF9oVkZ1ibYGpVph+JwlMC+Un8Chy0PgLndAOYmkFpibbL1nrQbhz4mty66TFAJoSZSocXe2LmJIK0T6WOlQtSFi3wPTVyCDd4QuFczoFR1Msv09G9CK6x1vsi16KjN4mT15jkh2DorxaxzWqAu7NGxUx5yOAn7cOXIlQeKYjNRwyIDRmM/NbA1RaiGTY9OBxXWjbo46baAlGkFFP559GQwEhmNGrC2eGV+aMTfXpxx+NTtmOIkIKLXTksXZPmAQDbZzAbLwypxqe6xmB5iguwCYD5TyhpxEn0Z2Ceb2XrTQrFf8MOLNS+NjBRjqc1wiCreI/rjn8YqQkErcEIlaGILVRSvd8b2FHepWpbUZV0LJackj7HJQ1AIBgDgGP5beU7MfH9/rgdqL+u3IpwSondYcg/R6EOxr1fSVmb1JupXbPdL40oIy6usIBEINt6GQSneZTemyLp3rTayKk5t06b1WzorhwV49c+vYWal48h7PE6QQedni3SZGVh0wl6y+WTdI7Qq7Y0Nm+S3h8pHzgCmbiwFURN7b5WgQXk7e/9K5D6XCCatOGqkl2J2EtYlyejSbDOio/DBizjUh3TXSL6lXNDO1M40RD147WIpiGXLyAW5E46/5aU13PNCHWubviHLX/5HjjgZ/PXLULCiAMTlVXRpuWiOiWbEMH1bv82jd9KeKI4DQmFh9S8Xr/p1hOxlDlQLZ/koSYDm7asfIs6qiLJD2k1eiNAWEH6oyuyvKXmImviTHO5HepB9cnhRBCk4Z4/g2Sid3IQLXCZ4aM/9p6bRo0UI3DYCxnEVC59QlVstPYErJvA6gCHmdUeAoWnVDzgNZZvdklvcCQ8Qnu1jVj3nmzLBN/V9useeJJquNq5mn/EUFkWPSJO3eUi5jxww5g== X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-Network-Message-Id: 65a683d5-5fdb-4c36-6f65-08dd2fda51ee X-MS-Exchange-CrossTenant-AuthSource: DU0PR08MB8255.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 08 Jan 2025 11:48:08.1939 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: aFfPvXFR908vFU3RHyJlVpiga9UU82aVSBlgV6be3h8XjnJFAcTb/J8FOC/8gw8xCT5t3m9QI68EU19aFMY++w== X-MS-Exchange-Transport-CrossTenantHeadersStamped: GV1PR08MB10597 X-Spam-Status: No, score=-11.8 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FORGED_SPF_HELO, GIT_PATCH_0, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_HELO_PASS, SPF_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gcc-patches-bounces~patchwork=sourceware.org@gcc.gnu.org This patch skips redirect_to_specific clone for aarch64 and riscv, because the optimisation has two flaws: 1. It checks the value of the "target" attribute, even on targets that don't use this attribute for multiversioning. 2. The algorithm used is too aggressive, and will eliminate the indirection in some cases where the runtime choice of callee version can't be determined statically at compile time. A correct would need to verify that: - if the current caller version were selected at runtime, then the chosen callee version would be eligible for selection. - if any higher priority callee version were selected at runtime, then a higher priority caller version would have been eligble for selection (and hence the current caller version wouldn't have been selected). The current checks only verify a more restrictive version of the first condition, and don't check the second condition at all. Fixing the optimisation properly would require implementing target hooks to check for implications between version attributes, which is too complicated for this stage. However, I would like to see this hook implemented in the future, since it could also help deduplicate other multiversioning code. Since this behaviour has existed for x86 and powerpc for a while, I think it's best to preserve the existing behaviour on those targets, unless any maintainer for those targets disagrees. ---- There was a previous patch by Yangyu Chen [1] which addressed flaw 1 but overlooked flaw 2. I pointed out flaw 2 at the time; as far as I can tell, there haven't been any further patches proposed for this issue (apologies if I missed something; I've not checked the mailing lists particularly thoroughly). I'm currently bootstrap and regression testing this on aarch64. Assuming thes tests pass, is this ok for master and backport to gcc-14? [1] https://gcc.gnu.org/pipermail/gcc-patches/2024-November/667527.html gcc/ChangeLog: * multiple_target.cc (redirect_to_specific_clone): Assert that "target" attribute is used for FMV before checking it. (ipa_target_clone): Skip redirect_to_specific_clone on some targets. gcc/testsuite/ChangeLog: * g++.target/aarch64/mv-pragma.C: New test. Reviewed-by: Yangyu Chen diff --git a/gcc/multiple_target.cc b/gcc/multiple_target.cc index 552b9626aa7173546d3b027a2b1a3d227ad25375..d8becf4d9a9626a4ab3688ab30431487a6db770f 100644 --- a/gcc/multiple_target.cc +++ b/gcc/multiple_target.cc @@ -442,7 +442,14 @@ expand_target_clones (struct cgraph_node *node, bool definition) /* When NODE is a target clone, consider all callees and redirect to a clone with equal target attributes. That prevents multiple - multi-versioning dispatches and a call-chain can be optimized. */ + multi-versioning dispatches and a call-chain can be optimized. + + This optimisation might pick the wrong version in some cases, since knowing + that we meet the target requirements for a matching callee version does not + tell us that we won't also meet the target requirements for a higher + priority callee version at runtime. Since this is longstanding behaviour + for x86 and powerpc, we preserve it for those targets, but skip the optimisation + for targets that use the "target_version" attribute for multi-versioning. */ static void redirect_to_specific_clone (cgraph_node *node) @@ -451,6 +458,7 @@ redirect_to_specific_clone (cgraph_node *node) if (fv == NULL) return; + gcc_assert (TARGET_HAS_FMV_TARGET_ATTRIBUTE); tree attr_target = lookup_attribute ("target", DECL_ATTRIBUTES (node->decl)); if (attr_target == NULL_TREE) return; @@ -503,8 +511,9 @@ ipa_target_clone (void) for (unsigned i = 0; i < to_dispatch.length (); i++) create_dispatcher_calls (to_dispatch[i]); - FOR_EACH_FUNCTION (node) - redirect_to_specific_clone (node); + if (TARGET_HAS_FMV_TARGET_ATTRIBUTE) + FOR_EACH_FUNCTION (node) + redirect_to_specific_clone (node); return 0; } diff --git a/gcc/testsuite/g++.target/aarch64/mv-pragma.C b/gcc/testsuite/g++.target/aarch64/mv-pragma.C new file mode 100644 index 0000000000000000000000000000000000000000..545d0735438d4774a2cb909f28584ddbf4f54d2a --- /dev/null +++ b/gcc/testsuite/g++.target/aarch64/mv-pragma.C @@ -0,0 +1,31 @@ +/* { dg-do compile } */ +/* { dg-require-ifunc "" } */ +/* { dg-options "-O0" } */ + +#pragma GCC target ("+sve") + +__attribute__((target_version("default"))) +int foo () +{ + return 1; +} + +__attribute__((target_version("sve2"))) +int foo () +{ + return 2; +} + +__attribute__((target_version("default"))) +int bar () +{ + return foo(); +} + +__attribute__((target_version("sha3"))) +int bar () +{ + return foo() + 5; +} + +/* { dg-final { scan-assembler-times "\n\tbl\t_Z3foov\n" 2 } } */