Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/2195025/?format=api
{ "id": 2195025, "url": "http://patchwork.ozlabs.org/api/patches/2195025/?format=api", "web_url": "http://patchwork.ozlabs.org/project/gcc/patch/20260210113104.60335-3-chris.bazley@arm.com/", "project": { "id": 17, "url": "http://patchwork.ozlabs.org/api/projects/17/?format=api", "name": "GNU Compiler Collection", "link_name": "gcc", "list_id": "gcc-patches.gcc.gnu.org", "list_email": "gcc-patches@gcc.gnu.org", "web_url": null, "scm_url": null, "webscm_url": null, "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<20260210113104.60335-3-chris.bazley@arm.com>", "list_archive_url": null, "date": "2026-02-10T11:30:55", "name": "[v9,02/11] Implement recording/getting of mask/length for BB SLP", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "beb7d1db314dbeb0b35b4f53a5d6ce3f5ad78865", "submitter": { "id": 89471, "url": "http://patchwork.ozlabs.org/api/people/89471/?format=api", "name": "Christopher Bazley", "email": "Chris.Bazley@arm.com" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/gcc/patch/20260210113104.60335-3-chris.bazley@arm.com/mbox/", "series": [ { "id": 491659, "url": "http://patchwork.ozlabs.org/api/series/491659/?format=api", "web_url": "http://patchwork.ozlabs.org/project/gcc/list/?series=491659", "date": "2026-02-10T11:30:56", "name": "Extend BB SLP vectorization to use predicated tails", "version": 9, "mbox": "http://patchwork.ozlabs.org/series/491659/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/2195025/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/2195025/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org>", "X-Original-To": [ "incoming@patchwork.ozlabs.org", "gcc-patches@gcc.gnu.org" ], "Delivered-To": [ "patchwork-incoming@legolas.ozlabs.org", "gcc-patches@gcc.gnu.org" ], "Authentication-Results": [ "legolas.ozlabs.org;\n\tdkim=pass (1024-bit key;\n unprotected) header.d=arm.com header.i=@arm.com header.a=rsa-sha256\n header.s=selector1 header.b=pud3bbyL;\n\tdkim=pass (1024-bit key) header.d=arm.com header.i=@arm.com\n header.a=rsa-sha256 header.s=selector1 header.b=pud3bbyL;\n\tdkim-atps=neutral", "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org\n (client-ip=38.145.34.32; helo=vm01.sourceware.org;\n envelope-from=gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org;\n receiver=patchwork.ozlabs.org)", "sourceware.org;\n\tdkim=pass (1024-bit key,\n unprotected) header.d=arm.com header.i=@arm.com header.a=rsa-sha256\n header.s=selector1 header.b=pud3bbyL;\n\tdkim=pass (1024-bit key) header.d=arm.com header.i=@arm.com\n header.a=rsa-sha256 header.s=selector1 header.b=pud3bbyL", "sourceware.org;\n dmarc=pass (p=none dis=none) header.from=arm.com", "sourceware.org; spf=pass smtp.mailfrom=arm.com", "server2.sourceware.org;\n arc=pass smtp.remote-ip=40.107.162.65" ], "Received": [ "from vm01.sourceware.org (vm01.sourceware.org [38.145.34.32])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4f9KM72RHcz1xtr\n\tfor <incoming@patchwork.ozlabs.org>; Tue, 10 Feb 2026 22:38:27 +1100 (AEDT)", "from vm01.sourceware.org (localhost [127.0.0.1])\n\tby sourceware.org (Postfix) with ESMTP id 0FBD44CF306B\n\tfor <incoming@patchwork.ozlabs.org>; Tue, 10 Feb 2026 11:38:25 +0000 (GMT)", "from PA4PR04CU001.outbound.protection.outlook.com\n (mail-francecentralazon11013065.outbound.protection.outlook.com\n [40.107.162.65])\n by sourceware.org (Postfix) with ESMTPS id A05A54CF308A\n for <gcc-patches@gcc.gnu.org>; Tue, 10 Feb 2026 11:33:01 +0000 (GMT)", "from DU2PR04CA0267.eurprd04.prod.outlook.com (2603:10a6:10:28e::32)\n by PA4PR08MB6320.eurprd08.prod.outlook.com (2603:10a6:102:e5::9) with\n Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9611.8; Tue, 10 Feb\n 2026 11:32:54 +0000", "from DB1PEPF000509F5.eurprd02.prod.outlook.com\n (2603:10a6:10:28e:cafe::8f) by DU2PR04CA0267.outlook.office365.com\n (2603:10a6:10:28e::32) with Microsoft SMTP Server (version=TLS1_3,\n cipher=TLS_AES_256_GCM_SHA384) id 15.20.9611.8 via Frontend Transport; Tue,\n 10 Feb 2026 11:32:53 +0000", "from outbound-uk1.az.dlp.m.darktrace.com (4.158.2.129) by\n DB1PEPF000509F5.mail.protection.outlook.com (10.167.242.151) with Microsoft\n SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9611.8\n via Frontend Transport; Tue, 10 Feb 2026 11:32:54 +0000", "from AS4P190CA0047.EURP190.PROD.OUTLOOK.COM (2603:10a6:20b:656::11)\n by PA6PR08MB10766.eurprd08.prod.outlook.com (2603:10a6:102:3cd::17)\n with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9587.18; Tue, 10 Feb\n 2026 11:31:52 +0000", "from AMS1EPF00000041.eurprd04.prod.outlook.com\n (2603:10a6:20b:656:cafe::c0) by AS4P190CA0047.outlook.office365.com\n (2603:10a6:20b:656::11) with Microsoft SMTP Server (version=TLS1_3,\n cipher=TLS_AES_256_GCM_SHA384) id 15.20.9611.8 via Frontend Transport; Tue,\n 10 Feb 2026 11:31:51 +0000", "from nebula.arm.com (172.205.89.229) by\n AMS1EPF00000041.mail.protection.outlook.com (10.167.16.38) with Microsoft\n SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id\n 15.20.9611.8 via Frontend Transport; Tue, 10 Feb 2026 11:31:52 +0000", "from AZ-NEU-EXJ02.Arm.com (10.240.25.139) by AZ-NEU-EX04.Arm.com\n (10.240.25.138) with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.29; Tue, 10 Feb\n 2026 11:31:51 +0000", "from AZ-NEU-EX04.Arm.com (10.240.25.138) by AZ-NEU-EXJ02.Arm.com\n (10.240.25.139) with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.29; Tue, 10 Feb\n 2026 11:31:50 +0000", "from ip-10-248-139-165.eu-west-1.compute.internal (10.248.139.165)\n by mail.arm.com (10.240.25.138) with Microsoft SMTP Server id 15.2.2562.29\n via Frontend Transport; Tue, 10 Feb 2026 11:31:50 +0000" ], "DKIM-Filter": [ "OpenDKIM Filter v2.11.0 sourceware.org 0FBD44CF306B", "OpenDKIM Filter v2.11.0 sourceware.org A05A54CF308A" ], "DMARC-Filter": "OpenDMARC Filter v1.4.2 sourceware.org A05A54CF308A", "ARC-Filter": "OpenARC Filter v1.0.0 sourceware.org A05A54CF308A", "ARC-Seal": [ "i=3; a=rsa-sha256; d=sourceware.org; s=key; t=1770723181; cv=pass;\n b=r2A+kAe6eKnfJl6yqgDSKeS+IL0p3YsiBhPRYjJH7jNJ0N60MBInUnBbfrzoHgHZ4Q+/pAdUeHgxXjRe0ep0S1r9XRW+OnMOTT8/fyOzYYxvjVZj9MvxUTp1Ap3lZwTzrzYI27aOBsoFpozRd+P0eK+6rliKUNJW7y0dt4WDPBQ=", "i=2; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=pass;\n b=AV8jzGE5kNoST7aM3PpJZbt2ZqtDR77Z1IxWGnNtW0gd1SNuTpH4MOyIxzwcyW4HzPXrFf4K7TA1AZ9lBidLgun9Vfc6H8PPL2umCMkcvxJx+sFh3jxHqP+J95lKQtQieMSRRbpqFf/mOXRqHg3zU1EzU1m/1f9v6a+lmwXyU1PkRx48RVMlFpJR9/gD+cAmLQcWoOmRi2q5nSaej4puVfurxyCiAjO3ybS1ZplUJJheiQ89YddGA6fLSToxe0TWB3222E/DBpnA1WsgdYbFX/O70Y/mRyOS4fsgkywAXRM5N6DLcc+t94lq+RxBcR1Rv2ne8yJDu7BA1YX9oM4SCw==", "i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none;\n b=f0RbuJthXJQQTOqzibWpg8CvkOMAb8nhjxpJ7y679VWf7UqUpFV57X66wAHm+/lvsUDjHviiEAcqnhNgUC2C2tZwisgiJxPTltHgFPSL06uQ6sb4LARe7hy4cCktvHotVWsXRWjKZ2f1g8v9JSzegksjgaf3fc1NR2yhL0XtY4hdD0CtCkSrQPPBoFDU8VOjoSy+TAFhSyCUej8vMFpquV8IZFKoVFEIL7TvvG3SC6B8zq3fr5p4oux6mQfO5Y4eJy+Nc0Ye23fFoZ9NKXpm/POAqOAefUWlM8msTHph0sxUA1Zi5ASUIJ74HzlrNpubdTMIDhd31/tDoPVmv3zBGw==" ], "ARC-Message-Signature": [ "i=3; a=rsa-sha256; d=sourceware.org; s=key;\n t=1770723181; c=relaxed/simple;\n bh=B88MQnHmdW87qIuUOb+z4vTG5Z4VcO3rKks/zDwZ2yg=;\n h=DKIM-Signature:DKIM-Signature:From:To:Subject:Date:Message-ID:\n MIME-Version;\n b=hbdN+avhp2yOdaMu6q9zufuQhBjflBQrZrIDbRwqmguDU4ctRGcGaONbJLdyqLWKcbDDsbIr3vq86q3vTsFsINX4r8ql8H/T06K3G1Jlhs4FWFOblsRA6gS+GDPEVKieIIuPtjvSSMxsCvJyM/AUDcNgyPvOPsgx7CrnQs8c6N0=", "i=2; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com;\n s=arcselector10001;\n 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;\n bh=1GZBtB2pvQapS1pK/T4TdK65OX9H2W25sUZ1vQyjLjw=;\n b=DsYRg2ArfIFuOkylS5/k/kH312n5gRQZ3PVbvjErACLXjDpFZUDTWjQVOJ9ofvVUXHHRJANB6LEtFem6Muwar668Xiny3NmjNCnNbCbhugY7cTlI8qH3I8MhpQpFubQhqsBJWoqQkc9KlyrHJ5I+6ggol/V2o7sow2j/z2s3+xWeZFnkHGaChMJYcEDEJkTiHCiggY8cSRpgoxMPPegUK2aQ7lHb3jVAUxFe19RY0lpkmCD6bA2iekZ3kp1rH4phpjxT/v2yy4AFx/4USlLtBeAf/Rn4jYv8/d4IXaueC2HgZTtNqpI4TKl7279berK52J1/WvpT1q8Jyl9CeK21xw==", "i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com;\n s=arcselector10001;\n 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;\n bh=1GZBtB2pvQapS1pK/T4TdK65OX9H2W25sUZ1vQyjLjw=;\n b=JM3xI2UMLx1Viw0B5MK611fTPBRpoKMW88xsgdp2fCaI/LxT9nBHLhYcmJVBKlASsVpGoABVpqsu0pUjwgUftQiuV4KIwNu6C+RZBJzL2expoO+NTG33PeOxAWmuB3QyqnmMnNLcCaXzVWdfjDh1rZRGJKKtljhsZ0Dghwbw/x9n8YR61cUtYRFesbY+0ovq4Pm4xXsuCkyT7CdqX7eix3H54ChwUowPPPs6EXoqQWZhhDztY39B59NgxGlUe4qb/8lbalEGM+COVLGi9sEoAk6M3dN1qGZL0TSJwEZWUODXSyoyHPf21dt2vZt/lX3XKaT5Hn7xJb0bd/fPuY8+/Q==" ], "ARC-Authentication-Results": [ "i=3; server2.sourceware.org", "i=2; mx.microsoft.com 1; spf=pass (sender ip is\n 4.158.2.129) smtp.rcpttodomain=gcc.gnu.org smtp.mailfrom=arm.com; dmarc=pass\n (p=none sp=none pct=100) action=none header.from=arm.com; dkim=pass\n (signature was verified) header.d=arm.com; arc=pass (0 oda=1 ltdi=1\n spf=[1,1,smtp.mailfrom=arm.com] dmarc=[1,1,header.from=arm.com])", "i=1; mx.microsoft.com 1; spf=pass (sender ip is\n 172.205.89.229) smtp.rcpttodomain=gcc.gnu.org smtp.mailfrom=arm.com;\n dmarc=pass (p=none sp=none pct=100) action=none header.from=arm.com;\n dkim=none (message not signed); arc=none (0)" ], "DKIM-Signature": [ "v=1; a=rsa-sha256; c=relaxed/relaxed; d=arm.com; s=selector1;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n bh=1GZBtB2pvQapS1pK/T4TdK65OX9H2W25sUZ1vQyjLjw=;\n b=pud3bbyL23lNRQYK1VaxDN/IwkSPRvuADIY2pp0DOI/NZNUUmzQK0+qnr5XjwW8UEKPP6Qc5ni3BGpywp1EBhRvVZFUQ+2sk85MyJIpsytfO905CJHRrSX0pM0w88cJS8JavWnzsRMzLQ5qUhAIz0AFu6QZZs4bu6HkBMp+XZHU=", "v=1; a=rsa-sha256; c=relaxed/relaxed; d=arm.com; s=selector1;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n bh=1GZBtB2pvQapS1pK/T4TdK65OX9H2W25sUZ1vQyjLjw=;\n b=pud3bbyL23lNRQYK1VaxDN/IwkSPRvuADIY2pp0DOI/NZNUUmzQK0+qnr5XjwW8UEKPP6Qc5ni3BGpywp1EBhRvVZFUQ+2sk85MyJIpsytfO905CJHRrSX0pM0w88cJS8JavWnzsRMzLQ5qUhAIz0AFu6QZZs4bu6HkBMp+XZHU=" ], "X-MS-Exchange-Authentication-Results": [ "spf=pass (sender IP is 4.158.2.129)\n smtp.mailfrom=arm.com; dkim=pass (signature was verified)\n header.d=arm.com;dmarc=pass action=none header.from=arm.com;", "spf=pass (sender IP is 172.205.89.229)\n smtp.mailfrom=arm.com; dkim=none (message not signed)\n header.d=none;dmarc=pass action=none header.from=arm.com;" ], "Received-SPF": [ "Pass (protection.outlook.com: domain of arm.com designates\n 4.158.2.129 as permitted sender) receiver=protection.outlook.com;\n client-ip=4.158.2.129; helo=outbound-uk1.az.dlp.m.darktrace.com; pr=C", "Pass (protection.outlook.com: domain of arm.com designates\n 172.205.89.229 as permitted sender) receiver=protection.outlook.com;\n client-ip=172.205.89.229; helo=nebula.arm.com; pr=C" ], "From": "Christopher Bazley <chris.bazley@arm.com>", "To": "<gcc-patches@gcc.gnu.org>", "CC": "<rguenther@suse.de>, <Tamar.Christina@arm.com>,\n <rdsandiford@googlemail.com>, Christopher Bazley <chris.bazley@arm.com>", "Subject": "[PATCH v9 02/11] Implement recording/getting of mask/length for BB\n SLP", "Date": "Tue, 10 Feb 2026 11:30:55 +0000", "Message-ID": "<20260210113104.60335-3-chris.bazley@arm.com>", "X-Mailer": "git-send-email 2.43.0", "In-Reply-To": "<20260210113104.60335-1-chris.bazley@arm.com>", "References": "<20260210113104.60335-1-chris.bazley@arm.com>", "MIME-Version": "1.0", "Content-Transfer-Encoding": "8bit", "Content-Type": "text/plain", "X-EOPAttributedMessage": "1", "X-MS-TrafficTypeDiagnostic": "\n AMS1EPF00000041:EE_|PA6PR08MB10766:EE_|DB1PEPF000509F5:EE_|PA4PR08MB6320:EE_", "X-MS-Office365-Filtering-Correlation-Id": "de185e75-765d-4f13-ec4c-08de689821eb", "x-checkrecipientrouted": "true", "NoDisclaimer": "true", "X-MS-Exchange-SenderADCheck": "1", "X-MS-Exchange-AntiSpam-Relay": "0", "X-Microsoft-Antispam-Untrusted": "BCL:0;\n ARA:13230040|376014|36860700013|82310400026|1800799024;", "X-Microsoft-Antispam-Message-Info-Original": "\n sflDd7HOPX+mbO3DqtRmyIpMF/XkG9aRy0hdF+PPlVDsN3QQ7C6tjXfiaEV5jLClfNZSS0e1dCsgijsIC2/woYyQPwHMLIksEcLh9R4AINS2Q3i7LREh25R1J82eCc4eXq9Cg6vYrTZzkgs5R742N9zlO0+MvoCd6Lm0z9dIUj7seykwj9D58Gv76DBYF1249vAY8ct6jbF4Fw1kcCN5SDUHJdO5GkkYbQblQhQ64R4ftl1DI4AsMEkg6hVFa14le3d/BbRmL649krSku36zGjn5Qd2ZzN1JKF5OdkZF8zU3DG3VPS+zEPa/BAp/GHZxwK+9dseQH0q3tniwbUiKHxT178rJTnFYehWfT2C+SSqxHG9FgPo7M72i7up1v5hj/KSe62IbaPuKMa4Q/7SJ/iacz7OjiFrCBrU1DI8JmBBGP7dP5q3chFKU73SDNduSALDhxQlor7QBiwYURAgrfzTr4zOXg6q77jHTjM5ljvQQpu06BkSA2m26Y7LznIvW+rClSJVPOWjI06t/tnsnf3tDiTZQ5Gt6VKBhOCBTb2QAOezDiiXoB9BFlO869Sfuo/r6YBoheIziIy5SWPhWeF7oFPIQsHZml9r2MaBMSjHsp3asRqJ8V8Iio3BsFYsVUDJWtMvLckd/Ej/e+WEfFeOi4rm+ZK9S/77cllCXhjBrlIRBxcMVpM+wWWtjAR7fm+HZjffDKIbX0ih1/lr8Hv4SopX9cpdUIQ93vlPiNnDmhWiN3WNFFoyzKnjSOAgghWzOXRnJB5qL3UOQwntHe6CGKGArlSuz8JweXz77b5hU+anlut+EObHXaG/jOTes0SK9VM1KOvHLSUKxnzxi/jE1VVwq0BBgt8Az8bff43i0qPyAu9DOoGyBvYXx6HP85y0EGOkjE7UbSZMx3G0VMV6K9tHnJlfEK2QMC9ztj9Acf7s4x88oOqgeOQB5rpEp2a5tObLARqOT7kjDFY16a++Sb6OB858pddZ7xhFm1aLgLXbNAuxUbVg1P395HHkmFVvZQRSLL+5VdCoA9L0pzlcBtLS4oSsUlCdOSQpp26q5ZwTUEeVCl+OarRZ6aVfJeb1LxYs9ijlEpPF0hFifoERk/VuSRsvWUagdFI6KTW0PPqaRbCFMtjobyP0wYHXeapN9mMDJlihPk/zCBz0C7H+JCyNLjnSHoJ5kj6YgCAxnT11jijBZHJWWWonDuv/Y7V8Ki3vGSL1RFkpDB7zPnjZZAriIUC+xf+cmtt0V69sn4XPg8qztLuXsAAzV6iN8Q5+RuBgl10KVftYx7o/uYrC/S9qPVt82ludhvV/uVfWQPxS6AEX8/V4hdnIcyJLL0cO4lT+URoSSZIF+ZArwDnMjPEWfwcqWBNCMtWqWkAuzwOG51INslDfqtQlAF6nMrKv5hp/wgTpsTpTpVe6An0h5Tsx4NHlzeW0texw3mx+Qmgtgzlp1PXh90lEQH9ijOSPmCM6ucK7tKpWsD8bgIp8WqHLHxukUoP6u2WyJZN31kK4PiSHa6n9nlY/rkfm4qZr2tzYUdLkooYppOd+Y+43GEpKFvIsTH/MV1SNLlSkBQ0mOk7nKVz3ExbJ1INxBT/WB93bQCDp3rKtKNpfA/+GGYAINes2tcnMW9F7Xpx+j1dWJmilEsMf0kfXtZUWKEOAqd0Ij5fIfxuLQ8l4URw==", "X-Forefront-Antispam-Report-Untrusted": "CIP:172.205.89.229; CTRY:IE; LANG:en;\n SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:nebula.arm.com; PTR:InfoDomainNonexistent;\n CAT:NONE; SFS:(13230040)(376014)(36860700013)(82310400026)(1800799024);\n DIR:OUT; SFP:1101;", "X-MS-Exchange-Transport-CrossTenantHeadersStamped": [ "PA6PR08MB10766", "PA4PR08MB6320" ], "X-MS-Exchange-Transport-CrossTenantHeadersStripped": "\n DB1PEPF000509F5.eurprd02.prod.outlook.com", "X-MS-PublicTrafficType": "Email", "X-MS-Office365-Filtering-Correlation-Id-Prvs": "\n aa52e36b-6ecf-4124-69b4-08de6897fcb6", "X-Microsoft-Antispam": "BCL:0;\n ARA:13230040|35042699022|376014|82310400026|1800799024|14060799003|36860700013;", "X-Microsoft-Antispam-Message-Info": "\n D2aVgsIbs0j6HaMu6eP6ac+etJLwsdZ+wEk+jIm5hcG8+lOydb3sWNUtzgAPfWi1IF1ivexhx5BF8usRkuVkGBdx7gaePCpmg0b0Qn+l9i9RXCO93tuNlgVNFQyBZ1uVhTSKup9+wTD3DF4+h1qPSpYATbiDks7X0/Yx2FvaD1t8ziI3XTgcdJXOzaoaSjhm+iWWjDCpoYyoq+9ccoPWpJNNJVm1Bbnjkl5RO/3UnsQai7EBDnKENhPZ00MT7BUgNA+47cpC3wV0ikJdTWbfUmr1YsjOSRBJXreGiDDFqfgm8vZNYRtPzZ6dLL80u8/oEpuF6sdddl8Zy/81NjlVu8iSlBRGfd9V3jH4e3Hr7XwREbWL9L5LkT+zfa5ZxBsuwc0z2tk8q8N3gQOn3lyFu7hIffB07TnJuyYZ50qrG2o7PnUmfLwXtCHHExP7ltiXFwdaMFeqwBiUYLtCPS9UTIOlY8lwcEWqD+73FYvUR0gUOLuAgdL9A54EKssZSB1uNgoBMRaiGjOxYE+RZMdTtKB0JVKqbaDG/MZhT+hW/vr+L1eKF1wNIwmjmr23Xun9Zpsd4RYUpEHukmCLlU63aQBKtMRTPdZwxyZjwA0m6NHx2n3e2oHAn+3Gu06qhVgjAERBmjn9g0RsO+QxX9vAG4+fhJlQ8j0CSp8c86+T/8FT99BePcdWzzSU8C4zXyyiDgc4M0d6CiK3B4DlyGrnwJ6Tk162zZJfMIUsLwXI+xm+ZNgsW65kyNFfpU99NF4EDKZI+bH+Ahh5Fm+reYMsd688VhwjjF7giT8XN2n8HoaIcl4cWFIK4RwCB5BNHWPNmQfhtxQcxB2P0PlfPSCoD68k32OsM03joJSwH+R2+iWpmiiC2Ivy947Dkrv9pYCTPOLHnxtCYTXCY+0+OOg2iI/oQTDDvIz7voCk2pbaFDA8NwGUwLT/Gm0o/BriPVCd+X+gIFTREvDp9L6VeadC3mHiH9xDCy3EYkDiUKsmqfjj/XC8YjlSNp3XV+oPnNPRIaiBZM1iu4v/rQanqvY0FT+e4FlGz+Nc2g0zfrcccfr9FC2fMuWet6jBsR2R7BaYOVw/4+aHUNGQ87E6F66L94Lzu28Os+DhxdtPaObeFaxD8RlGhDcZDLMlbaqNsBo7WCda8vcsgdR0EGq6Qnw/I0ODPuubyuHnz6tq6iKVQIWgYl3x/R/It8FwLHehZVyzLhGp+ERUAxbXpzbKDY0/RJm9h6CdG+AVxwAZECZw3vACzv8qfTQ56o73cPmdT68LFPV0i1YyU/7ei1utamzGgFe5PyM+ryEnKl6vPo7Ofi63iTET4wJ5BUE7tYYe+LXMKmZ564SMlFYwNOPZHUEWfT66r8RmjOxixnU745YajLoAdWLFPSJMpwG6ElbWrYritCtDtL5gisHVQrPrcA9Pqrli5AR/I/Pi6glbnAb5j+I8qO1QzIUnSMnDxgZmD/2/ZInHKoOkzk26oin72Dcet/Pwaf/wq0PE5UknEIZ04M6bXnggM1uP19wJZkmG+T3o8dwe4KnQvWD/5S3q1fEZRg9OikPieHiyhYHRedmcsUcZDSyVsG+G7epx77ZZ1PdbBW6sdqxG4pWbOKBLS7R9RIEuGk3/0Py8TFL8GOZlDUegM2KvHIFhDp2KAe6fFOosvOndQqXEQUMpu3WSoSw3vA==", "X-Forefront-Antispam-Report": "CIP:4.158.2.129; CTRY:GB; LANG:en; SCL:1; SRV:;\n IPV:NLI; SFV:NSPM; H:outbound-uk1.az.dlp.m.darktrace.com;\n PTR:InfoDomainNonexistent; CAT:NONE;\n SFS:(13230040)(35042699022)(376014)(82310400026)(1800799024)(14060799003)(36860700013);\n DIR:OUT; SFP:1101;", "X-MS-Exchange-AntiSpam-MessageData-ChunkCount": "1", "X-MS-Exchange-AntiSpam-MessageData-0": "\n OTZ46U5ofTe7vmT5pEdJcKflmuG+g5gOhmVMcc+lnWGbR01YfwHRXLg15uW4Rba7ienU2aB5UbXRGlMNB51QC0jBLJR1X9zlHTNfxMDCkLTuxrLqIhIvbfFVqYdv0wCKNUmxvL9LsZ77EB2YXALZFMHEPOsKjczsgu+wnvRjQkJw6b/0gV7k6dFSz0ig4t5iKenIrJ51+VvjPJKujnMdiO7h810dboy3RAyroJ81C40KnJhXrAgCU+OOHKka+iLA5f5gNDn/Ln/6BlE2eRiJELkMOIiefWQAc2+t6v+Cqm/5ExPCI0KSqHjsVtE2owN5aIOI+eLv69Z3i/1ROFT9dquRXgNvJQgXBDr0HTgTHUt5kHLdkNT3MOyC5C37v7AqYJPCTyvBqqtGVzjgzmCdK32QTuhtBcc++UCIRlN7BHWCBjz9gY5LsQZhqmlU66+E", "X-OriginatorOrg": "arm.com", "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "10 Feb 2026 11:32:54.5527 (UTC)", "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n de185e75-765d-4f13-ec4c-08de689821eb", "X-MS-Exchange-CrossTenant-Id": "f34e5979-57d9-4aaa-ad4d-b122a662184d", "X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp": "\n TenantId=f34e5979-57d9-4aaa-ad4d-b122a662184d; Ip=[4.158.2.129];\n Helo=[outbound-uk1.az.dlp.m.darktrace.com]", "X-MS-Exchange-CrossTenant-AuthSource": "\n DB1PEPF000509F5.eurprd02.prod.outlook.com", "X-MS-Exchange-CrossTenant-AuthAs": "Anonymous", "X-MS-Exchange-CrossTenant-FromEntityHeader": "HybridOnPrem", "X-BeenThere": "gcc-patches@gcc.gnu.org", "X-Mailman-Version": "2.1.30", "Precedence": "list", "List-Id": "Gcc-patches mailing list <gcc-patches.gcc.gnu.org>", "List-Unsubscribe": "<https://gcc.gnu.org/mailman/options/gcc-patches>,\n <mailto:gcc-patches-request@gcc.gnu.org?subject=unsubscribe>", "List-Archive": "<https://gcc.gnu.org/pipermail/gcc-patches/>", "List-Post": "<mailto:gcc-patches@gcc.gnu.org>", "List-Help": "<mailto:gcc-patches-request@gcc.gnu.org?subject=help>", "List-Subscribe": "<https://gcc.gnu.org/mailman/listinfo/gcc-patches>,\n <mailto:gcc-patches-request@gcc.gnu.org?subject=subscribe>", "Errors-To": "gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org" }, "content": "Add two new fields to SLP tree nodes, which are accessed as\nSLP_TREE_CAN_USE_PARTIAL_VECTORS_P and SLP_TREE_PARTIAL_VECTORS_STYLE.\n\nSLP_TREE_CAN_USE_PARTIAL_VECTORS_P is analogous to the existing\npredicate LOOP_VINFO_CAN_USE_PARTIAL_VECTORS_P. It is initialized to\ntrue. This flag just records whether the target could vectorize a\nnode using a partial vector; it does not say anything about\nwhether the vector actually is partial, or how the target would support\nuse of a partial vector. Some kinds of node require mask/length for\npartial vectors; others don't. In the latter case (e.g., for add\noperations), SLP_TREE_CAN_USE_PARTIAL_VECTORS_P will remain true.\n\nSLP_TREE_PARTIAL_VECTORS_STYLE is analogous to the existing field\nLOOP_VINFO_PARTIAL_VECTORS_STYLE. Both are initialized to 'none'.\nThe vect_partial_vectors_avx512 enumerator is not used for BB SLP.\nUnlike loop vectorization, a different style of partial vectors can be\nchosen for each node during analysis of that node.\n\nImplement the recently-introduced wrapper functions,\nvect_record_(len|mask), for BB SLP by setting\nSLP_TREE_PARTIAL_VECTORS_STYLE to indicate that a mask or length should\nbe used for a given SLP node. The passed-in vec_info is ignored.\n\nImplement the vect_fully_(masked|with_length)_p wrapper functions for\nBB SLP by checking the SLP_TREE_PARTIAL_VECTORS_STYLE. This should be\nsufficient because at most one of vect_record_(len|mask) and\nvect_cannot_use_partial_vectors are expected to be called for any\ngiven SLP node. SLP_TREE_CAN_USE_PARTIAL_VECTORS_P should be true if\nthe style is not 'none', but its value isn't used beyond the analysis\nphase.\n\nThe implementations of vect_get_mask and vect_get_len for BB SLP are\nnon-trivial (albeit simpler than for loop vectorization), therefore they\nare delegated to SLP-specific functions defined in tree-vect-slp.cc.\n\nImplement the vect_cannot_use_partial_vectors wrapper function by\nsetting the SLP_TREE_CAN_USE_PARTIAL_VECTORS_P flag to false.\nTo prevent regressions, vect_can_use_partial_vectors_p still returns\nfalse for BB SLP regardless (for now). This prevents vect_record_mask\nor vect_record_len from being called.\n\ngcc/ChangeLog:\n\n\t* tree-vect-slp.cc (_slp_tree::_slp_tree): initialize new\n\tpartial_vector_style, can_use_partial_vectors and\n\tnum_partial_vectors members.\n\t(vect_slp_analyze_node_operations): Account for worst-case\n\tprologue costs of per-node partial-vector mask or length\n\tmaterialisation.\n\t(vect_slp_record_bb_style): Set the partial vector style of an\n\tSLP node, checking that the style does not flip-flop between mask\n\tand length.\n\t(vect_slp_record_bb_mask): Use vect_slp_record_bb_style to set\n\tthe partial vector style of the SLP tree node to\n\tvect_partial_vectors_while_ult.\n\t(vect_slp_get_bb_mask): New function to materialize a mask for\n\tbasic block SLP vectorization.\n\t(vect_slp_record_bb_len): Use vect_slp_record_bb_style to set\n\tthe partial vector style of the SLP tree node to\n\tvect_partial_vectors_len.\n\t(vect_slp_get_bb_len): New function to materialize a length for\n\tbasic block SLP vectorization.\n\t* tree-vect-stmts.cc (vectorizable_internal_function):\n\t(vect_record_mask): Handle the basic block SLP use case by\n\tdelegating to vect_slp_record_bb_mask.\n\t(vect_get_mask): Handle the basic block SLP use case by\n\tdelegating to vect_slp_get_bb_mask.\n\t(vect_record_len): Handle the basic block SLP use case by\n\tdelegating to vect_slp_record_bb_len.\n\t(vect_get_len): Handle the basic block SLP use case by\n\tdelegating to vect_slp_get_bb_len.\n\t(vect_gen_while_ssa_name): New function containing code\n\trefactored out of vect_gen_while for reuse by\n\tvect_slp_get_bb_mask.\n\t(vect_gen_while): Use vect_gen_while_ssa_name instead of custom\n\tcode for some of the implementation.\n\t* tree-vectorizer.h (enum vect_partial_vector_style): Move this\n\tdefinition earlier to allow reuse by struct _slp_tree.\n\t(struct _slp_tree): Add a partial_vector_style member to record\n\twhether to use a length or mask for the SLP tree node, if\n\tpartial vectors are required and supported.\n\tAdd a can_use_partial_vectors member to record whether partial\n\tvectors are supported for the SLP tree node.\n\tAdd a num_partial_vectors member for costing.\n\t(SLP_TREE_PARTIAL_VECTORS_STYLE): New member accessor macro.\n\t(SLP_TREE_CAN_USE_PARTIAL_VECTORS_P): New member accessor macro.\n\t(SLP_TREE_NUM_PARTIAL_VECTORS): New member accessor macro.\n\t(vect_gen_while_ssa_name): Declaration of a new function.\n\t(vect_slp_get_bb_mask): As above.\n\t(vect_slp_get_bb_len): As above.\n\t(vect_cannot_use_partial_vectors): Handle the basic block SLP\n\tuse-case by setting SLP_TREE_CAN_USE_PARTIAL_VECTORS_P to\n\tfalse.\n\t(vect_fully_with_length_p): Handle the basic block SLP use\n\tcase by checking whether the SLP_TREE_PARTIAL_VECTORS_STYLE is\n\tvect_partial_vectors_len.\n\t(vect_fully_masked_p): Handle the basic block SLP use case by\n\tchecking whether the SLP_TREE_PARTIAL_VECTORS_STYLE is\n\tvect_partial_vectors_while_ult.\n\n---\n gcc/tree-vect-slp.cc | 181 +++++++++++++++++++++++++++++++++++++++++\n gcc/tree-vect-stmts.cc | 51 +++++++-----\n gcc/tree-vectorizer.h | 51 ++++++++----\n 3 files changed, 245 insertions(+), 38 deletions(-)", "diff": "diff --git a/gcc/tree-vect-slp.cc b/gcc/tree-vect-slp.cc\nindex c481efc749f..106eba2d981 100644\n--- a/gcc/tree-vect-slp.cc\n+++ b/gcc/tree-vect-slp.cc\n@@ -124,6 +124,9 @@ _slp_tree::_slp_tree ()\n SLP_TREE_GS_BASE (this) = NULL_TREE;\n this->ldst_lanes = false;\n this->avoid_stlf_fail = false;\n+ SLP_TREE_PARTIAL_VECTORS_STYLE (this) = vect_partial_vectors_none;\n+ SLP_TREE_CAN_USE_PARTIAL_VECTORS_P (this) = true;\n+ SLP_TREE_NUM_PARTIAL_VECTORS (this) = 0;\n SLP_TREE_VECTYPE (this) = NULL_TREE;\n SLP_TREE_REPRESENTATIVE (this) = NULL;\n this->cycle_info.id = -1;\n@@ -8864,6 +8867,40 @@ vect_slp_analyze_node_operations (vec_info *vinfo, slp_tree node,\n \t vect_prologue_cost_for_slp (vinfo, child, cost_vec);\n \t}\n \n+ if (res)\n+ {\n+ /* Take care of special costs for partial vectors.\n+\t Costing each partial vector is excessive for many SLP instances,\n+\t because it is common to materialise identical masks/lengths for related\n+\t operations (e.g., for vector loads and stores of the same length).\n+\t Masks/lengths can also be shared between SLP subgraphs or eliminated by\n+\t pattern-based lowering during instruction selection. However, it's\n+\t simpler and safer to use the worst-case cost; if this ends up being the\n+\t tie-breaker between vectorizing or not, then it's probably better not\n+\t to vectorize. */\n+ const int num_partial_vectors = SLP_TREE_NUM_PARTIAL_VECTORS (node);\n+\n+ if (SLP_TREE_PARTIAL_VECTORS_STYLE (node)\n+\t == vect_partial_vectors_while_ult)\n+\t{\n+\t gcc_assert (num_partial_vectors > 0);\n+\t record_stmt_cost (cost_vec, num_partial_vectors, vector_stmt, NULL,\n+\t\t\t NULL, NULL_TREE, 0, vect_prologue);\n+\t}\n+ else if (SLP_TREE_PARTIAL_VECTORS_STYLE (node)\n+\t == vect_partial_vectors_len)\n+\t{\n+\t /* Need to set up a length in the prologue. */\n+\t gcc_assert (num_partial_vectors > 0);\n+\t record_stmt_cost (cost_vec, num_partial_vectors, scalar_stmt, NULL,\n+\t\t\t NULL, NULL_TREE, 0, vect_prologue);\n+\t}\n+ else\n+\t{\n+\t gcc_assert (num_partial_vectors == 0);\n+\t}\n+ }\n+\n /* If this node or any of its children can't be vectorized, try pruning\n the tree here rather than felling the whole thing. */\n if (!res && vect_slp_convert_to_external (vinfo, node, node_instance))\n@@ -12532,3 +12569,147 @@ vect_schedule_slp (vec_info *vinfo, const vec<slp_instance> &slp_instances)\n }\n }\n }\n+\n+/* Record that a specific partial vector style could be used to vectorize\n+ SLP_NODE if required. */\n+\n+static void\n+vect_slp_record_bb_style (slp_tree slp_node, vect_partial_vector_style style)\n+{\n+ gcc_assert (style != vect_partial_vectors_none);\n+ gcc_assert (style != vect_partial_vectors_avx512);\n+\n+ if (SLP_TREE_PARTIAL_VECTORS_STYLE (slp_node) == vect_partial_vectors_none)\n+ SLP_TREE_PARTIAL_VECTORS_STYLE (slp_node) = style;\n+ else\n+ gcc_assert (SLP_TREE_PARTIAL_VECTORS_STYLE (slp_node) == style);\n+}\n+\n+/* Record that a complete set of masks associated with SLP_NODE would need to\n+ contain a sequence of NVECTORS masks that each control a vector of type\n+ VECTYPE. If SCALAR_MASK is nonnull, the fully-masked loop would AND\n+ these vector masks with the vector version of SCALAR_MASK. */\n+void\n+vect_slp_record_bb_mask (slp_tree slp_node, unsigned int /* nvectors */,\n+\t\t\t tree /* vectype */, tree /* scalar_mask */)\n+{\n+ vect_slp_record_bb_style (slp_node, vect_partial_vectors_while_ult);\n+\n+ /* FORNOW: this often overestimates the number of masks for costing purposes\n+ because, after lowering, masks have often been eliminated, shared between\n+ SLP nodes, or even shared between SLP subgraphs. */\n+ SLP_TREE_NUM_PARTIAL_VECTORS(slp_node) ++;\n+}\n+\n+/* Materialize mask number INDEX for a group of scalar stmts in SLP_NODE that\n+ operate on NVECTORS vectors of type VECTYPE, where 0 <= INDEX < NVECTORS.\n+ Insert any set-up statements before GSI. */\n+\n+tree\n+vect_slp_get_bb_mask (slp_tree slp_node, gimple_stmt_iterator *gsi,\n+\t\t unsigned int nvectors, tree vectype, unsigned int index)\n+{\n+ gcc_assert (SLP_TREE_PARTIAL_VECTORS_STYLE (slp_node)\n+\t == vect_partial_vectors_while_ult);\n+ gcc_assert (nvectors >= 1);\n+ gcc_assert (index < nvectors);\n+\n+ const poly_uint64 nunits = TYPE_VECTOR_SUBPARTS (vectype);\n+ const unsigned int group_size = SLP_TREE_LANES (slp_node);\n+ unsigned int mask_size = group_size;\n+ const tree masktype = truth_type_for (vectype);\n+\n+ if (nunits.is_constant ())\n+ {\n+ /* Only the last vector can be a partial vector. */\n+ if (index + 1 < nvectors)\n+\treturn build_minus_one_cst (masktype);\n+\n+ /* Return a mask for a possibly-partial tail vector. */\n+ const unsigned int const_nunits = nunits.to_constant ();\n+ const unsigned int head_size = (nvectors - 1) * const_nunits;\n+ gcc_assert (head_size <= group_size);\n+ mask_size = group_size - head_size;\n+\n+ if (mask_size == const_nunits)\n+\treturn build_minus_one_cst (masktype);\n+ }\n+ else\n+ {\n+ /* Return a mask for a single variable-length vector. */\n+ gcc_assert (nvectors == 1);\n+ gcc_assert (known_le (mask_size, nunits));\n+ }\n+\n+ /* FORNOW: don't bother maintaining a set of mask constants to allow\n+ sharing between nodes belonging to the same instance of bb_vec_info\n+ or even within the same SLP subgraph. */\n+ gimple_seq stmts = NULL;\n+ const tree cmp_type = size_type_node;\n+ const tree start_index = build_zero_cst (cmp_type);\n+ const tree end_index = build_int_cst (cmp_type, mask_size);\n+ const tree mask = make_temp_ssa_name (masktype, NULL, \"slp_mask\");\n+ vect_gen_while_ssa_name (&stmts, masktype, start_index, end_index, mask);\n+ gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT);\n+ return mask;\n+}\n+\n+/* Record that a complete set of lengths associated with SLP_NODE would need to\n+ contain a sequence of NVECTORS lengths for controlling an operation on\n+ VECTYPE. The operation splits each element of VECTYPE into FACTOR separate\n+ subelements, measuring the length as a number of these subelements. */\n+\n+void\n+vect_slp_record_bb_len (slp_tree slp_node, unsigned int /* nvectors */,\n+\t\t\ttree /* vectype */, unsigned int /* factor */)\n+{\n+ vect_slp_record_bb_style (slp_node, vect_partial_vectors_len);\n+\n+ /* FORNOW: this probably overestimates the number of lengths for costing\n+ purposes because, after lowering, lengths might have been eliminated,\n+ shared between SLP nodes, or even shared between SLP subgraphs. */\n+ SLP_TREE_NUM_PARTIAL_VECTORS (slp_node)++;\n+}\n+\n+/* Materialize length number INDEX for a group of scalar stmts in SLP_NODE that\n+ operate on NVECTORS vectors of type VECTYPE, where 0 <= INDEX < NVECTORS.\n+ Return a value that contains FACTOR multiplied by the number of elements that\n+ should be processed. */\n+\n+tree\n+vect_slp_get_bb_len (slp_tree slp_node, unsigned int nvectors, tree vectype,\n+\t\t unsigned int index, unsigned int factor)\n+{\n+ gcc_checking_assert (SLP_TREE_PARTIAL_VECTORS_STYLE (slp_node)\n+\t\t == vect_partial_vectors_len);\n+ gcc_assert (nvectors >= 1);\n+ gcc_assert (index < nvectors);\n+\n+ const poly_uint64 nunits = TYPE_VECTOR_SUBPARTS (vectype);\n+ const unsigned int group_size = SLP_TREE_LANES (slp_node);\n+ HOST_WIDE_INT len = group_size;\n+\n+ if (nunits.is_constant ())\n+ {\n+ const unsigned int const_nunits = nunits.to_constant ();\n+\n+ /* Only the last vector can be a partial vector. */\n+ if (index + 1 < nvectors)\n+\tlen = const_nunits;\n+ else\n+\t{\n+\t /* Return a length for a possibly-partial tail vector. */\n+\t const unsigned int head_size = (nvectors - 1) * const_nunits;\n+\t gcc_assert (head_size <= group_size);\n+\t len = group_size - head_size;\n+\t}\n+ }\n+ else\n+ {\n+ /* Return a length for a single variable-length vector. */\n+ gcc_assert (nvectors == 1);\n+ gcc_assert (known_le (len, nunits));\n+ }\n+\n+ return size_int (len * factor);\n+}\ndiff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc\nindex 5df4fff0fc7..56ae35ff724 100644\n--- a/gcc/tree-vect-stmts.cc\n+++ b/gcc/tree-vect-stmts.cc\n@@ -1387,7 +1387,9 @@ vectorizable_internal_function (combined_fn cfn, tree fndecl,\n /* Record that a complete set of masks associated with VINFO would need to\n contain a sequence of NVECTORS masks that each control a vector of type\n VECTYPE. If SCALAR_MASK is nonnull, the fully-masked loop would AND\n- these vector masks with the vector version of SCALAR_MASK. */\n+ these vector masks with the vector version of SCALAR_MASK. Alternatively,\n+ if doing basic block vectorization, record that a mask could be used to\n+ vectorize SLP_NODE if required. */\n static void\n vect_record_mask (vec_info *vinfo, slp_tree slp_node, unsigned int nvectors,\n \t\t tree vectype, tree scalar_mask)\n@@ -1397,7 +1399,7 @@ vect_record_mask (vec_info *vinfo, slp_tree slp_node, unsigned int nvectors,\n vect_record_loop_mask (loop_vinfo, &LOOP_VINFO_MASKS (loop_vinfo), nvectors,\n \t\t\t vectype, scalar_mask);\n else\n- (void) slp_node; /* FORNOW */\n+ vect_slp_record_bb_mask (slp_node, nvectors, vectype, scalar_mask);\n }\n \n /* Given a complete set of masks associated with VINFO, extract mask number\n@@ -1415,16 +1417,15 @@ vect_get_mask (vec_info *vinfo, slp_tree slp_node, gimple_stmt_iterator *gsi,\n return vect_get_loop_mask (loop_vinfo, gsi, &LOOP_VINFO_MASKS (loop_vinfo),\n \t\t\t nvectors, vectype, index);\n else\n- {\n- (void) slp_node; /* FORNOW */\n- return NULL_TREE;\n- }\n+ return vect_slp_get_bb_mask (slp_node, gsi, nvectors, vectype, index);\n }\n \n /* Record that a complete set of lengths associated with VINFO would need to\n contain a sequence of NVECTORS lengths for controlling an operation on\n VECTYPE. The operation splits each element of VECTYPE into FACTOR separate\n- subelements, measuring the length as a number of these subelements. */\n+ subelements, measuring the length as a number of these subelements.\n+ Alternatively, if doing basic block vectorization, record that a length limit\n+ could be used to vectorize SLP_NODE if required. */\n static void\n vect_record_len (vec_info *vinfo, slp_tree slp_node, unsigned int nvectors,\n \t\t tree vectype, unsigned int factor)\n@@ -1434,7 +1435,7 @@ vect_record_len (vec_info *vinfo, slp_tree slp_node, unsigned int nvectors,\n vect_record_loop_len (loop_vinfo, &LOOP_VINFO_LENS (loop_vinfo), nvectors,\n \t\t\t vectype, factor);\n else\n- (void) slp_node; /* FORNOW */\n+ vect_slp_record_bb_len (slp_node, nvectors, vectype, factor);\n }\n \n /* Given a complete set of lengths associated with VINFO, extract length number\n@@ -1455,10 +1456,7 @@ vect_get_len (vec_info *vinfo, slp_tree slp_node, gimple_stmt_iterator *gsi,\n return vect_get_loop_len (loop_vinfo, gsi, &LOOP_VINFO_LENS (loop_vinfo),\n \t\t\t nvectors, vectype, index, factor);\n else\n- {\n- (void) slp_node; /* FORNOW */\n- return NULL_TREE;\n- }\n+ return vect_slp_get_bb_len (slp_node, nvectors, vectype, index, factor);\n }\n \n static tree permute_vec_elements (vec_info *, tree, tree, tree, stmt_vec_info,\n@@ -14667,24 +14665,35 @@ supportable_indirect_convert_operation (code_helper code,\n mask[I] is true iff J + START_INDEX < END_INDEX for all J <= I.\n Add the statements to SEQ. */\n \n+void\n+vect_gen_while_ssa_name (gimple_seq *seq, tree mask_type, tree start_index,\n+\t\t\t tree end_index, tree ssa_name)\n+{\n+ tree cmp_type = TREE_TYPE (start_index);\n+ gcc_checking_assert (direct_internal_fn_supported_p (IFN_WHILE_ULT, cmp_type,\n+\t\t\t\t\t\t mask_type,\n+\t\t\t\t\t\t OPTIMIZE_FOR_SPEED));\n+ gcall *call\n+ = gimple_build_call_internal (IFN_WHILE_ULT, 3, start_index, end_index,\n+\t\t\t\t build_zero_cst (mask_type));\n+ gimple_call_set_lhs (call, ssa_name);\n+ gimple_seq_add_stmt (seq, call);\n+}\n+\n+/* Like vect_gen_while_ssa_name except that it creates a new SSA_NAME node\n+ for type MASK_TYPE defined in the created GIMPLE_CALL statement. If NAME\n+ is not a null pointer then it is used for the SSA_NAME in dumps. */\n+\n tree\n vect_gen_while (gimple_seq *seq, tree mask_type, tree start_index,\n \t\ttree end_index, const char *name)\n {\n- tree cmp_type = TREE_TYPE (start_index);\n- gcc_checking_assert (direct_internal_fn_supported_p (IFN_WHILE_ULT,\n-\t\t\t\t\t\t cmp_type, mask_type,\n-\t\t\t\t\t\t OPTIMIZE_FOR_SPEED));\n- gcall *call = gimple_build_call_internal (IFN_WHILE_ULT, 3,\n-\t\t\t\t\t start_index, end_index,\n-\t\t\t\t\t build_zero_cst (mask_type));\n tree tmp;\n if (name)\n tmp = make_temp_ssa_name (mask_type, NULL, name);\n else\n tmp = make_ssa_name (mask_type);\n- gimple_call_set_lhs (call, tmp);\n- gimple_seq_add_stmt (seq, call);\n+ vect_gen_while_ssa_name (seq, mask_type, start_index, end_index, tmp);\n return tmp;\n }\n \ndiff --git a/gcc/tree-vectorizer.h b/gcc/tree-vectorizer.h\nindex 6fa931e78d2..01c3d45d0a2 100644\n--- a/gcc/tree-vectorizer.h\n+++ b/gcc/tree-vectorizer.h\n@@ -312,6 +312,13 @@ struct vect_load_store_data : vect_data {\n bool subchain_p; // VMAT_STRIDED_SLP and VMAT_GATHER_SCATTER\n };\n \n+enum vect_partial_vector_style {\n+ vect_partial_vectors_none,\n+ vect_partial_vectors_while_ult,\n+ vect_partial_vectors_avx512,\n+ vect_partial_vectors_len\n+};\n+\n /* A computation tree of an SLP instance. Each node corresponds to a group of\n stmts to be packed in a SIMD stmt. */\n struct _slp_tree {\n@@ -373,7 +380,16 @@ struct _slp_tree {\n /* For BB vect, flag to indicate this load node should be vectorized\n as to avoid STLF fails because of related stores. */\n bool avoid_stlf_fail;\n-\n+ /* The style used for implementing partial vectors if LANES is less than\n+ the minimum number of lanes implied by the VECTYPE. */\n+ vect_partial_vector_style partial_vector_style;\n+ /* Flag to indicate whether we still have the option of vectorizing this node\n+ using partial vectors (i.e. using lengths or masks to prevent use of\n+ inactive scalar lanes). */\n+ bool can_use_partial_vectors;\n+ /* Number of partial vectors, for costing purposes. Should be 0 unless a\n+ partial vector style has been set. */\n+ int num_partial_vectors;\n int vertex;\n \n /* The kind of operation as determined by analysis and optional\n@@ -471,6 +487,9 @@ public:\n #define SLP_TREE_GS_BASE(S)\t\t\t (S)->gs_base\n #define SLP_TREE_REDUC_IDX(S)\t\t\t (S)->cycle_info.reduc_idx\n #define SLP_TREE_PERMUTE_P(S)\t\t\t ((S)->code == VEC_PERM_EXPR)\n+#define SLP_TREE_PARTIAL_VECTORS_STYLE(S)\t (S)->partial_vector_style\n+#define SLP_TREE_CAN_USE_PARTIAL_VECTORS_P(S)\t (S)->can_use_partial_vectors\n+#define SLP_TREE_NUM_PARTIAL_VECTORS(S)\t\t (S)->num_partial_vectors\n \n inline vect_memory_access_type\n SLP_TREE_MEMORY_ACCESS_TYPE (slp_tree node)\n@@ -481,13 +500,6 @@ SLP_TREE_MEMORY_ACCESS_TYPE (slp_tree node)\n return VMAT_UNINITIALIZED;\n }\n \n-enum vect_partial_vector_style {\n- vect_partial_vectors_none,\n- vect_partial_vectors_while_ult,\n- vect_partial_vectors_avx512,\n- vect_partial_vectors_len\n-};\n-\n /* Key for map that records association between\n scalar conditions and corresponding loop mask, and\n is populated by vect_record_loop_mask. */\n@@ -2593,6 +2605,7 @@ extern tree vect_gen_perm_mask_checked (tree, const vec_perm_indices &);\n extern void optimize_mask_stores (class loop*);\n extern tree vect_gen_while (gimple_seq *, tree, tree, tree,\n \t\t\t const char * = nullptr);\n+extern void vect_gen_while_ssa_name (gimple_seq *, tree, tree, tree, tree);\n extern tree vect_gen_while_not (gimple_seq *, tree, tree, tree);\n extern opt_result vect_get_vector_types_for_stmt (vec_info *,\n \t\t\t\t\t\t stmt_vec_info, tree *,\n@@ -2777,6 +2790,14 @@ extern slp_tree vect_create_new_slp_node (unsigned, tree_code);\n extern void vect_free_slp_tree (slp_tree);\n extern bool compatible_calls_p (gcall *, gcall *, bool);\n extern int vect_slp_child_index_for_operand (const gimple *, int op, bool);\n+extern void vect_slp_record_bb_mask (slp_tree slp_node, unsigned int nvectors,\n+\t\t\t\t tree vectype, tree scalar_mask);\n+extern tree vect_slp_get_bb_mask (slp_tree, gimple_stmt_iterator *,\n+\t\t\t\t unsigned int, tree, unsigned int);\n+extern void vect_slp_record_bb_len (slp_tree slp_node, unsigned int nvectors,\n+\t\t\t\t tree vectype, unsigned int factor);\n+extern tree vect_slp_get_bb_len (slp_tree, unsigned int, tree, unsigned int,\n+\t\t\t\t unsigned int);\n extern tree prepare_vec_mask (vec_info *, tree, tree, tree,\n \t\t\t gimple_stmt_iterator *);\n extern tree vect_get_mask_load_else (int, tree);\n@@ -2941,7 +2962,7 @@ vect_cannot_use_partial_vectors (vec_info *vinfo, slp_tree slp_node)\n if (loop_vinfo)\n LOOP_VINFO_CAN_USE_PARTIAL_VECTORS_P (loop_vinfo) = false;\n else\n- (void) slp_node; /* FORNOW */\n+ SLP_TREE_CAN_USE_PARTIAL_VECTORS_P (slp_node) = false;\n }\n \n /* Return true if VINFO is vectorizer state for loop vectorization, we've\n@@ -2955,10 +2976,8 @@ vect_fully_with_length_p (vec_info *vinfo, slp_tree slp_node)\n if (loop_vec_info loop_vinfo = dyn_cast<loop_vec_info> (vinfo))\n return LOOP_VINFO_FULLY_WITH_LENGTH_P (loop_vinfo);\n else\n- {\n- (void) slp_node; /* FORNOW */\n- return false;\n- }\n+ return SLP_TREE_PARTIAL_VECTORS_STYLE (slp_node)\n+\t == vect_partial_vectors_len;\n }\n \n /* Return true if VINFO is vectorizer state for loop vectorization, we've\n@@ -2972,10 +2991,8 @@ vect_fully_masked_p (vec_info *vinfo, slp_tree slp_node)\n if (loop_vec_info loop_vinfo = dyn_cast<loop_vec_info> (vinfo))\n return LOOP_VINFO_FULLY_MASKED_P (loop_vinfo);\n else\n- {\n- (void) slp_node; /* FORNOW */\n- return false;\n- }\n+ return SLP_TREE_PARTIAL_VECTORS_STYLE (slp_node)\n+\t == vect_partial_vectors_while_ult;\n }\n \n /* If STMT_INFO describes a reduction, return the vect_reduction_type\n", "prefixes": [ "v9", "02/11" ] }