get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/1.1/patches/2228965/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 2228965,
    "url": "http://patchwork.ozlabs.org/api/1.1/patches/2228965/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/gcc/patch/20260427150502.5864-1-Pengfei.Li2@arm.com/",
    "project": {
        "id": 17,
        "url": "http://patchwork.ozlabs.org/api/1.1/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
    },
    "msgid": "<20260427150502.5864-1-Pengfei.Li2@arm.com>",
    "date": "2026-04-27T15:05:02",
    "name": "veclower: Add piecewise expansion for vector moves [PR107916]",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "5c56d96f3d881a79140883b9b8bd91cd8c35b4a3",
    "submitter": {
        "id": 90721,
        "url": "http://patchwork.ozlabs.org/api/1.1/people/90721/?format=api",
        "name": "Pengfei Li",
        "email": "Pengfei.Li2@arm.com"
    },
    "delegate": null,
    "mbox": "http://patchwork.ozlabs.org/project/gcc/patch/20260427150502.5864-1-Pengfei.Li2@arm.com/mbox/",
    "series": [
        {
            "id": 501671,
            "url": "http://patchwork.ozlabs.org/api/1.1/series/501671/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/gcc/list/?series=501671",
            "date": "2026-04-27T15:05:02",
            "name": "veclower: Add piecewise expansion for vector moves [PR107916]",
            "version": 1,
            "mbox": "http://patchwork.ozlabs.org/series/501671/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/2228965/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/2228965/checks/",
    "tags": {},
    "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=WqiMZT+6;\n\tdkim=pass (1024-bit key) header.d=arm.com header.i=@arm.com\n header.a=rsa-sha256 header.s=selector1 header.b=WqiMZT+6;\n\tdkim-atps=neutral",
            "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org\n (client-ip=2620:52:6:3111::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=WqiMZT+6;\n\tdkim=pass (1024-bit key) header.d=arm.com header.i=@arm.com\n header.a=rsa-sha256 header.s=selector1 header.b=WqiMZT+6",
            "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=52.101.70.13"
        ],
        "Received": [
            "from vm01.sourceware.org (vm01.sourceware.org\n [IPv6:2620:52:6:3111::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 4g46P12cvbz1xvV\n\tfor <incoming@patchwork.ozlabs.org>; Tue, 28 Apr 2026 01:07:15 +1000 (AEST)",
            "from vm01.sourceware.org (localhost [127.0.0.1])\n\tby sourceware.org (Postfix) with ESMTP id 806E54BAD148\n\tfor <incoming@patchwork.ozlabs.org>; Mon, 27 Apr 2026 15:07:12 +0000 (GMT)",
            "from AS8PR04CU009.outbound.protection.outlook.com\n (mail-westeuropeazon11011013.outbound.protection.outlook.com [52.101.70.13])\n by sourceware.org (Postfix) with ESMTPS id 136874BAD145\n for <gcc-patches@gcc.gnu.org>; Mon, 27 Apr 2026 15:06:36 +0000 (GMT)",
            "from AS4PR09CA0026.eurprd09.prod.outlook.com (2603:10a6:20b:5d4::9)\n by FRWPR08MB11636.eurprd08.prod.outlook.com (2603:10a6:d10:1b2::14)\n with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9846.26; Mon, 27 Apr\n 2026 15:06:27 +0000",
            "from AM3PEPF0000A795.eurprd04.prod.outlook.com\n (2603:10a6:20b:5d4:cafe::64) by AS4PR09CA0026.outlook.office365.com\n (2603:10a6:20b:5d4::9) with Microsoft SMTP Server (version=TLS1_3,\n cipher=TLS_AES_256_GCM_SHA384) id 15.20.9846.26 via Frontend Transport; Mon,\n 27 Apr 2026 15:06:26 +0000",
            "from outbound-uk1.az.dlp.m.darktrace.com (4.158.2.129) by\n AM3PEPF0000A795.mail.protection.outlook.com (10.167.16.100) with Microsoft\n SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9846.18\n via Frontend Transport; Mon, 27 Apr 2026 15:06:25 +0000",
            "from DB9PR02CA0013.eurprd02.prod.outlook.com (2603:10a6:10:1d9::18)\n by AS8PR08MB7863.eurprd08.prod.outlook.com (2603:10a6:20b:52b::15)\n with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9846.26; Mon, 27 Apr\n 2026 15:05:15 +0000",
            "from DU2PEPF0001E9C4.eurprd03.prod.outlook.com\n (2603:10a6:10:1d9:cafe::55) by DB9PR02CA0013.outlook.office365.com\n (2603:10a6:10:1d9::18) with Microsoft SMTP Server (version=TLS1_3,\n cipher=TLS_AES_256_GCM_SHA384) id 15.20.9846.26 via Frontend Transport; Mon,\n 27 Apr 2026 15:05:15 +0000",
            "from nebula.arm.com (172.205.89.229) by\n DU2PEPF0001E9C4.mail.protection.outlook.com (10.167.8.73) with Microsoft SMTP\n Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id\n 15.20.9846.18 via Frontend Transport; Mon, 27 Apr 2026 15:05:15 +0000",
            "from AZ-NEU-EXJ02.Arm.com (10.240.25.139) by AZ-NEU-EX03.Arm.com\n (10.240.25.137) with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.29; Mon, 27 Apr\n 2026 15:05:13 +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; Mon, 27 Apr\n 2026 15:05:13 +0000",
            "from ip-10-248-139-167.eu-west-1.compute.internal (10.248.139.167)\n by mail.arm.com (10.240.25.138) with Microsoft SMTP Server id 15.2.2562.29\n via Frontend Transport; Mon, 27 Apr 2026 15:05:13 +0000"
        ],
        "DKIM-Filter": [
            "OpenDKIM Filter v2.11.0 sourceware.org 806E54BAD148",
            "OpenDKIM Filter v2.11.0 sourceware.org 136874BAD145"
        ],
        "DMARC-Filter": "OpenDMARC Filter v1.4.2 sourceware.org 136874BAD145",
        "ARC-Filter": "OpenARC Filter v1.0.0 sourceware.org 136874BAD145",
        "ARC-Seal": [
            "i=3; a=rsa-sha256; d=sourceware.org; s=key; t=1777302397; cv=pass;\n b=ZAroHsNCyVZoeazZMIefLasAHSYfRJa2Nt+oxGL4RZG7T77EGZTXCzZUyvLqTfkvbHsknujVXsHVcEGJzgTsQXNCsk+1EjQlMMGtCr8E3zk6tDxPLnDQywxEUws40lYaRNEuZ0SAyhDZvV9m8bLF/JKbdw7uI9EskWtg+5U6F34=",
            "i=2; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=pass;\n b=pDtw9PaH58S5YA1XI43qsMRJAjlQ2y2UpRxvlXbNaNvk1sgBKxyWTqpGL6tU25wMOwYf32JKmp7eEg9NDOIe8NHc9jTSYK8MK52d0wbnR1ESY6r6U9BsgQ6Gr0wkEM9XBtkR7pdELyFmvp7Gjz/dETtYbcNcp8UpNMHO5Vn77MNTCvf4eMsin2Ma0CrrTWs1ExGwbDCMUQML/AMgN6pmmXh9yVQpPgKWNMpbTBDPTc4C5y65hEv2w6EgAne6QIGCzSXaSEjcUQGqxabW09bHpZxfUlPqoNxRoIMN+rNAmh3sk3am8o8MidTNKcZa3uvRVjJMU36ptr3uhvOsA0Os8w==",
            "i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none;\n b=h9XklMWS9Cz0VXvvwYAr0sVVX4hu0XdJLnRRsawMDr4ODWx3chDdfsTmjV6ImgkjhbcaxNQ5fgzRcpKFYZnhrS/Xx9v9TB0VrWnuikb1y5b0Q0ewzckP3cjur0Ugwc86Eq+xM+FMSOsgpU4lWU3fIqrZ5zza7u3v7wtzXG/J2BSKJrN3v/VdUG4PH8NTMy9LOtPjSc6jzXziCMxCaKEIUYmnCoOX2OiCLBrKK86Wl0ejjiJYWGBRBK/Lk6BdI7mWqM2Xa/DXGNHZJugZozYFnVnBJUqfDXJ+Si922/FMXyMMhzbfCpdR0faSvaMO4p9DdnfmjRkB5sQn+c9HklOPrQ=="
        ],
        "ARC-Message-Signature": [
            "i=3; a=rsa-sha256; d=sourceware.org; s=key;\n t=1777302397; c=relaxed/simple;\n bh=lW5FWMhks3wo4vvHpNQBuvwR1AYNgzR+kr/nzAAvrzA=;\n h=DKIM-Signature:DKIM-Signature:From:To:Subject:Date:Message-ID:\n MIME-Version;\n b=o3XG1doJ7nemDxn7YtwrULwcECimkKNGgq4coS4GZzJ818AC++BE6A12k1dKg5VYteu5PU6CS5kia9sc6OF2vBGin+XGvP1AQeiRphZyErTiOsZKWLTY/WlRX9E4cb9VSpcI/oloF1G67VoMuMXAaUrlSZgmptG1JaVh42H+Wbs=",
            "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=rF8DFYF+BVrIwcVCuMb7M6teSykF6l6hJfCSflKpqpE=;\n b=ftpRyje1H4yjNHSNpiAcPxbZQ01ZBpKx06T9eLmSVmAmJs3z+nLp6TpsAWjL9RsnyVb6znNAorDON+fA05hLOW+htu14T4z9Ms1i5gLQXEX///Vv26sANI3ijnc9vHbp12foI329Om6njjasGH6FrPnhpJIh5cMqwe3i5zq9KlEL9ASaB59qgwa/RFLsNxSRhZ8YCJRpWtyqMtecZmSnmnuk0m8oT1gyDyrgnvLc0Au+XMa3VdCyxDuI6OnGOCFLynXdwCQI/ik7VFd0YAklPCvQz7bPUfQdPJ5iPfE4yMMRlzZR6tMxsiJqWYsmoQtlsdrtdCxaJCKRg8k4B+5xHg==",
            "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=rF8DFYF+BVrIwcVCuMb7M6teSykF6l6hJfCSflKpqpE=;\n b=SDMYIrJiHGYvNEl/bx8tKo5nKUPcrJPpogb9OulnSp5ReGxoTQeN9Mwlx6gl7u+NnDHl3KQVTVFlE8MyXZHVNnEGY1yuXoKdbp5bPZ9antukVl9XFxz6ZpjARgHyx1w0cnPm+lLqCoXpFtbxA1TWDTLJA0pGI15Y6ckuJ0sOnVZHrASWvTKQtTi5NomD5vx9LfVeZwCvYS36edpYFhWEZZ9TnD4J+BdbcCcrq1QG0Yt+A56GwSubXczm3IDHcVhy0XXvl+zazYt2H9gxYHh8JZXp4rJ8JNMLggOjIOtJHzvYGfBYkIaDCypQJWn5MGvf2NeZ7PXslncRHe/iu5SRpQ=="
        ],
        "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=rF8DFYF+BVrIwcVCuMb7M6teSykF6l6hJfCSflKpqpE=;\n b=WqiMZT+6ffUPmnfGqzFfYmqNBLYXX+B9BV/eagTnHtoDGG2B34YHpmhZws/IfGCTCfIU/ve3FyRLZWFlE3q1ss3xRhCmnhAg/x+3SPlOMXmkibNz2ugKj0oVNFw4O0EpaYvOO7TvqkRN1B///Kw6xbn516PD5sOkM4+aFBnpAM8=",
            "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=rF8DFYF+BVrIwcVCuMb7M6teSykF6l6hJfCSflKpqpE=;\n b=WqiMZT+6ffUPmnfGqzFfYmqNBLYXX+B9BV/eagTnHtoDGG2B34YHpmhZws/IfGCTCfIU/ve3FyRLZWFlE3q1ss3xRhCmnhAg/x+3SPlOMXmkibNz2ugKj0oVNFw4O0EpaYvOO7TvqkRN1B///Kw6xbn516PD5sOkM4+aFBnpAM8="
        ],
        "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": "Pengfei Li <Pengfei.Li2@arm.com>",
        "To": "<gcc-patches@gcc.gnu.org>",
        "CC": "<rguenther@suse.de>, <andrew.pinski@oss.qualcomm.com>, <jakub@redhat.com>,\n <Tamar.Christina@arm.com>, Pengfei Li <Pengfei.Li2@arm.com>",
        "Subject": "[PATCH] veclower: Add piecewise expansion for vector moves [PR107916]",
        "Date": "Mon, 27 Apr 2026 15:05:02 +0000",
        "Message-ID": "<20260427150502.5864-1-Pengfei.Li2@arm.com>",
        "X-Mailer": "git-send-email 2.43.0",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Content-Type": "text/plain",
        "X-EOPAttributedMessage": "1",
        "X-MS-TrafficTypeDiagnostic": "\n DU2PEPF0001E9C4:EE_|AS8PR08MB7863:EE_|AM3PEPF0000A795:EE_|FRWPR08MB11636:EE_",
        "X-MS-Office365-Filtering-Correlation-Id": "04b68570-21db-40ad-a5fc-08dea46e8d6e",
        "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|36860700016|82310400026|1800799024|56012099003|18002099003|13003099007;",
        "X-Microsoft-Antispam-Message-Info-Original": "\n 0qJzsoKO5vubxooGaeVWwPkmDY7DklqRf5QxfgqYxp/IPHt33DTqoVwW6SNNDi9ADkBT+uIJKRS8wALO0b9pefCsrCYHM3/ZfKyGzRLaiEtjJphBxPWC07sHn+a0+uSzLeq4qGWnRkLNCIUmwoWh/pNou0L+06nupmZsfjNsBObM3e+mi2uS7Vi/koDuj4QmVG9V7gA7S8ONYdhK1GOvV9DqryHr28BoJSS6j0zDUbdabCBvP0ZgesLcrPazxKxQ2fBJv/SrW1noBGqIasYt32ugTRGUYtWptHENpmldRkhWc1ZVEmb5aB5mMK0SEHtXy3UHrED4TpL0OnFBHy5xa7dehuiqNoSiQfqWlpQYCI35m2pa0SwblnXgzYvDeodaSjR6yV1/jUYJT8thNb1hicN/VTMLyDNKVfm4BfJTpt0MMbAtaR5K85DwiZbkBeo+9VrHJqQumBAOwuVnQCn/Y0jsKFZ/OmDk6xNx69AyeJS3Ik93dmzT3T2wWYCLG4kbWFH9IPzGaktQP7CrQ8yiF4VY4kV4K1ALXK0OydwSP9jqsj1qKrNbNLGQ4JK00YX5xuxrhQkdhJ3+dq3S0W2xASaIgrbtNB4a5rHZFTge00XT6YEejJq1M+5DcZONFWGK2K3ExQDfGWdkX80zUyieGsOxmnK1JV3lVkXEFHJJVe7qzPZStcA/nZ+ORBMoWbH7f18UE4i0PY3E4KWgZWplH97WcxzsJSvvhGY5RAfBuWw=",
        "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;\n SFS:(13230040)(376014)(36860700016)(82310400026)(1800799024)(56012099003)(18002099003)(13003099007);\n DIR:OUT; SFP:1101;",
        "X-Exchange-RoutingPolicyChecked": "\n WoQPC45tOctgZBY7ohnRuQ2uJKm/xNe2s6qMQI5H5/HXbPNr3JbVxOIESLzB53wmWRpmIP6z0dzmKG9dPyVUA1aVIfdoBTaaSIoN9Vm/QWtrjhMtrVcvfgMintnS5y+VOA2OxeNqKLTw0EcM1JRhC1nHr1OMsHIryAtBcz+uLVtHF9FwSFYd1M+1zj62xpLxpZgxNfqpCpejsOPdDfroS5j2NWixjPCBQTbUraN7AfMj9Ftw0KGUVxRKTUpetebgzI0Zi8Inu2Zg+zCqEfRgq2EGZaH9WyFUfLmwlNKHrNqcPMSjTDRBmafU/4uR/RMgLaGl0Blobissai93mxZx3w==",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": [
            "AS8PR08MB7863",
            "FRWPR08MB11636"
        ],
        "X-MS-Exchange-Transport-CrossTenantHeadersStripped": "\n AM3PEPF0000A795.eurprd04.prod.outlook.com",
        "X-MS-PublicTrafficType": "Email",
        "X-MS-Office365-Filtering-Correlation-Id-Prvs": "\n c8e946b4-5db3-4cd2-b79d-08dea46e6349",
        "X-Microsoft-Antispam": "BCL:0;\n ARA:13230040|14060799003|36860700016|82310400026|35042699022|376014|1800799024|56012099003|18002099003|13003099007;",
        "X-Microsoft-Antispam-Message-Info": "\n 5Hhbq+sY6nRm+4hGE3fuSklpaBEo44Vasd9o2Sao1T+qyw5nNWyyYOnP1ufKFOAG/Gya6FYXc1EgDNtxyZDUuKqCsuCq/ELBdpUZbY2rEtHtS9cQMTz2ejArgPqHcvU1ZiIoX4rAfK8qa3Lv1zahf7rPXP/fzUFtBrh5i5X5pPZy86kBWDrO3qTYVrXtKbjkDtYZRDVzDZ9XQTP8Dt/htpww3PNUDMBMxMpDGYL7CV8B9DJrNWODY6/kgT1M5O4Bv+zjhqpBlRxpPP8Ecqy4Mw3+Jhn+dgmjxtv5n90Jp9bEnXO9KqOavorEs10s/Ti0h8QtmBgzN/+Si72ins99lPfIsuzFzwp3JGy3g6wW01XyE0OkgYaVR29UnJPqk0VcIEViABhnZbYQ5mE1CxSVXVmSL+RIFcFNTR0elXDN0GCUzHFSJuMQGzZh1EPqEN5EU4XCmCA3JiSEy5c+6yBwAUIeAgzFDg9Oiv4dAl8nkf+SpLRZHUKo9B1BoIB3P2PWhu1yv1FKgCJz2vJN+QtrS8lZFIPxx3IbH8Gm5AoEjumAYGuB7Cwcl+jdE6DJwa5ljj+WQ4JOWWCqVmGwidcipiAMn5oL6C2b5ejsFrbf2tvE+ouwwKMsyBOtW+rsjTnyJAk0Z0+BcLiEZ6elFRvhowVRfVOh/K5CxC031zlseiwGE/yAiSjs6xs4qjn832hL4qQ4QfMOeC4ve4Ud/EpnTlJ+A+kiin3IVtglNGFUzM4=",
        "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)(14060799003)(36860700016)(82310400026)(35042699022)(376014)(1800799024)(56012099003)(18002099003)(13003099007);\n DIR:OUT; SFP:1101;",
        "X-MS-Exchange-AntiSpam-MessageData-ChunkCount": "1",
        "X-MS-Exchange-AntiSpam-MessageData-0": "\n ybECyC73FL9ZAUfbAyYdiDpGQNVXiCFeArHYT+Tf78rmEzMDkelLMi5SG+vM8TLJ3mBc85yovxu/pP8/8vAZJgH4Th69aNTHSYSOn7MGiXPV7PT7be3Mko4EOVl2K3/ETrPzS78R2sAg124wDo4DOfN/Wy4gxKigQu5zxhI1pkLEItl0FW+w5j8QMbo8q5HvFxEAlT4JvCJkO8gTXXzX/HbSl0AGzCLi8hzEzu5yKRkCrx9rIhNgRZpuNZe0LjLzh5LOC5L3mEejlLZwHCEqCu1olYOeMPpwHPcB7CRA+mxTnff3oY6zBij2QaektG0ZzaxQd2wCa9zSvVktarsWTtMjVe8P3SKGGre1wpcGGzMb+Ju/CJihPYbgxEQqacCNr9iIISxGLKIPC8h2l8RP2Qeva0TQh+RzF6viIok9QQurRmtlSzFPhJ59IZRtFrW/",
        "X-OriginatorOrg": "arm.com",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "27 Apr 2026 15:06:25.8385 (UTC)",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n 04b68570-21db-40ad-a5fc-08dea46e8d6e",
        "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 AM3PEPF0000A795.eurprd04.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": "Current vector lowering already supports piecewise expansion for vector\noperations such as add and mul. But this is not done for vector moves.\nAs a result, if the vector mode is wider than the target can handle, the\nvector values may still be moved through the memory, introducing more\nloads and stores.\n\nThis patch extends piecewise expansion for vector loads from memory and\nvector copies represented by PHIs. The expansion is applied when the\noriginal vector mode is not supported by the target but there exists a\nnarrower mode that can be used to move the vector piecewise.\n\nThe first test case in this patch shows that expanding a vector PHI into\nPHI pieces can help eliminate vector loads and stores in the loop body.\nAdditionally, the second case shows that combining loads expansion with\nPHIs expansion helps keep subsequent subvector moves in registers, thus\nreducing more loads and stores. This patch intentionally does not add\npiecewise expansion for stores, since I have not yet found a motivating\ncase for that.\n\nThis patch is bootstrapped and regression-tested on x86_64-linux-gnu,\narm-linux-gnueabihf and aarch64-linux-gnu.\n\ngcc/ChangeLog:\n\n\t* tree-vect-generic.cc (make_ssa_name_for_piece): New helper to\n\tname new SSA names representing vector pieces.\n\t(type_for_widest_vector_mode): Extend to search for the widest\n\tvector mode available for vector piecewise moves.\n\t(get_piecewise_move_type): New function to find an alternative\n\ttype for vector piecewise move.\n\t(expand_vector_load): New function to expand vector loads.\n\t(expand_vector_operations_1): Handle vector PHI expansions.\n\t(maybe_build_phi_pieces_ctor): Helper function for building PHI\n\tconstructors in vector PHI expansions.\n\t(replace_vector_phi): Implement vector PHI replacement.\n\t(expand_vector_operations): Handle vector load expansions.\n\ngcc/testsuite/ChangeLog:\n\n\t* gcc.target/aarch64/vect-lower-1.c: New test.\n\t* gcc.target/aarch64/vect-lower-2.c: New test.\n---\n .../gcc.target/aarch64/vect-lower-1.c         |  17 ++\n .../gcc.target/aarch64/vect-lower-2.c         |  29 +++\n gcc/tree-vect-generic.cc                      | 220 +++++++++++++++++-\n 3 files changed, 262 insertions(+), 4 deletions(-)\n create mode 100644 gcc/testsuite/gcc.target/aarch64/vect-lower-1.c\n create mode 100644 gcc/testsuite/gcc.target/aarch64/vect-lower-2.c",
    "diff": "diff --git a/gcc/testsuite/gcc.target/aarch64/vect-lower-1.c b/gcc/testsuite/gcc.target/aarch64/vect-lower-1.c\nnew file mode 100644\nindex 00000000000..29913aa900b\n--- /dev/null\n+++ b/gcc/testsuite/gcc.target/aarch64/vect-lower-1.c\n@@ -0,0 +1,17 @@\n+/* Test vector lowering for PHIs.  */\n+/* { dg-options \"-O3\" } */\n+\n+typedef float __attribute__((vector_size(32))) TYPE;\n+\n+void foo(TYPE *a, TYPE *b, unsigned n) {\n+  TYPE x = *a;\n+  TYPE y = *b;\n+  for (int i = 0; i < n; i++) {\n+    y = x;\n+    x = x * 2.0;\n+  }\n+  *a = x;\n+  *b = y;\n+}\n+\n+/* { dg-final { scan-assembler-times {\\tmov\\tv[0-9]+\\.16b, v[0-9]+\\.16b} 2 } } */\ndiff --git a/gcc/testsuite/gcc.target/aarch64/vect-lower-2.c b/gcc/testsuite/gcc.target/aarch64/vect-lower-2.c\nnew file mode 100644\nindex 00000000000..54383625af1\n--- /dev/null\n+++ b/gcc/testsuite/gcc.target/aarch64/vect-lower-2.c\n@@ -0,0 +1,29 @@\n+/* Test vector lowering for PHIs and loads.  */\n+/* { dg-options \"-O3\" } */\n+\n+typedef float __attribute__((vector_size(16))) V128;\n+typedef float __attribute__((vector_size(32))) V256;\n+\n+typedef struct {\n+  V256 v;\n+} TYPE;\n+\n+inline V256 reorder(V256 v) {\n+  V128 d[2], temp;\n+  __builtin_memcpy(&d, &v, sizeof(v));\n+  temp = d[0];\n+  d[0] = d[1];\n+  d[1] = temp;\n+  __builtin_memcpy(&v, &d, sizeof(v));\n+  return v;\n+}\n+\n+void process(TYPE *p, unsigned int n) {\n+  TYPE x = *p;\n+  for (unsigned int i = 0; i < n; i++) {\n+    x.v = reorder(x.v);\n+  }\n+  *p = x;\n+}\n+\n+/* { dg-final { scan-assembler-times {\\tmov\\tv[0-9]+\\.16b, v[0-9]+\\.16b} 3 } } */\ndiff --git a/gcc/tree-vect-generic.cc b/gcc/tree-vect-generic.cc\nindex 77066bbb2e1..94941c346ad 100644\n--- a/gcc/tree-vect-generic.cc\n+++ b/gcc/tree-vect-generic.cc\n@@ -125,6 +125,22 @@ build_word_mode_vector_type (int nunits)\n   return vector_last_type;\n }\n \n+/* Helper to name a new SSA that represents piece N of the original vector VEC.\n+   The new name is the original vector's name plus a \"$N\" suffix.  */\n+\n+static inline tree\n+make_ssa_name_for_piece (tree inner_type, tree vec, unsigned int n)\n+{\n+  if (TREE_CODE (vec) != SSA_NAME\n+      || SSA_NAME_VAR (vec) == NULL_TREE)\n+    return make_ssa_name (inner_type);\n+\n+  char *tmp = xasprintf (\"%s$%u\", get_name (SSA_NAME_VAR (vec)), n);\n+  tree ssa_name = make_temp_ssa_name (inner_type, NULL, tmp);\n+  free (tmp);\n+  return ssa_name;\n+}\n+\n typedef tree (*elem_op_func) (gimple_stmt_iterator *,\n \t\t\t      tree, tree, tree, tree, tree, enum tree_code,\n \t\t\t      tree);\n@@ -1463,7 +1479,9 @@ optimize_vector_constructor (gimple_stmt_iterator *gsi)\n /* Return a type for the widest vector mode with the same element type as\n    type ORIGINAL_VECTOR_TYPE, with at most the same number of elements as type\n    ORIGINAL_VECTOR_TYPE and that is supported by the target for an operation\n-   with optab OP, or return NULL_TREE if none is found.  */\n+   with optab OP, or return NULL_TREE if none is found.  If we are searching\n+   for an alternative mode for vector move, the number of units of the original\n+   mode must be a multiple of that of the alternative mode.  */\n \n static tree\n type_for_widest_vector_mode (tree original_vector_type, optab op)\n@@ -1492,9 +1510,13 @@ type_for_widest_vector_mode (tree original_vector_type, optab op)\n   FOR_EACH_MODE_FROM (mode, mode)\n     if (GET_MODE_INNER (mode) == inner_mode\n \t&& maybe_gt (GET_MODE_NUNITS (mode), best_nunits)\n-\t&& can_implement_p (op, mode)\n-\t&& known_le (GET_MODE_NUNITS (mode),\n-\t\t     TYPE_VECTOR_SUBPARTS (original_vector_type)))\n+\t&& (op == mov_optab\n+\t    ? targetm.vector_mode_supported_p (mode)\n+\t      && multiple_p (TYPE_VECTOR_SUBPARTS (original_vector_type),\n+\t\t\t     GET_MODE_NUNITS (mode))\n+\t    : can_implement_p (op, mode)\n+\t      && known_le (GET_MODE_NUNITS (mode),\n+\t\t\t   TYPE_VECTOR_SUBPARTS (original_vector_type))))\n       best_mode = mode, best_nunits = GET_MODE_NUNITS (mode);\n \n   if (best_mode == VOIDmode)\n@@ -1819,6 +1841,29 @@ get_compute_type (optab op, tree type)\n   return TREE_TYPE (type);\n }\n \n+/* Return an alternative type for vector piecewise move, or NULL_TREE if none\n+   exists.  If given TYPE is not supported by the target, search for the widest\n+   supported vector type with which the vector can be moved piecewise.  */\n+\n+static tree\n+get_piecewise_move_type (tree type)\n+{\n+  /* Only search for alternative types for original VLS types that are not\n+     supported by the target.  */\n+  if (!VECTOR_TYPE_P (type)\n+      || !TYPE_VECTOR_SUBPARTS (type).is_constant ()\n+      || targetm.vector_mode_supported_p (TYPE_MODE (type)))\n+    return NULL_TREE;\n+\n+  /* Ignore vector mask types with scalar modes.  */\n+  if (VECTOR_BOOLEAN_TYPE_P (type)\n+      && !VECTOR_MODE_P (TYPE_MODE (type))\n+      && TYPE_MODE (type) != BLKmode)\n+    return NULL_TREE;\n+\n+  return type_for_widest_vector_mode (type, mov_optab);\n+}\n+\n static tree\n do_cond (gimple_stmt_iterator *gsi, tree inner_type, tree a, tree b,\n \t tree bitpos, tree bitsize, enum tree_code code,\n@@ -2179,6 +2224,58 @@ expand_vector_conversion (gimple_stmt_iterator *gsi)\n   gsi_replace (gsi, g, false);\n }\n \n+/* Expand a vector load statement of the original form:\n+\n+     V = *p;\n+\n+   into multiple piecewise loads with BIT_FIELD_REF, combine the results using\n+   a CONSTRUCTOR, and assign it to the original vector, as below:\n+\n+     V1 = BIT_FIELD_REF <*p, bitsize, bitpos1>;\n+     V2 = BIT_FIELD_REF <*p, bitsize, bitpos2>;\n+     ...\n+     Vn = BIT_FIELD_REF <*p, bitsize, bitposN>;\n+     V = { V1, V2, ... Vn };\n+\n+   This expansion is applied when the original vector mode is not supported by\n+   the target but we can find an alternative mode for piecewise loads.  */\n+\n+static void\n+expand_vector_load (gimple_stmt_iterator *gsi)\n+{\n+  gassign *stmt = as_a <gassign *> (gsi_stmt (*gsi));\n+  tree lhs = gimple_assign_lhs (stmt);\n+  tree type = TREE_TYPE (lhs);\n+  tree inner_type = get_piecewise_move_type (type);\n+  if (inner_type == NULL_TREE)\n+    return;\n+\n+  tree mem_ref = gimple_assign_rhs1 (stmt);\n+  tree part_width = TYPE_SIZE (inner_type);\n+  unsigned int nunits = nunits_for_known_piecewise_op (type);\n+  unsigned int delta = nunits_for_known_piecewise_op (inner_type);\n+  gcc_assert (multiple_p (nunits, delta));\n+  unsigned int nparts = nunits / delta;\n+\n+  vec<constructor_elt, va_gc> *v;\n+  vec_alloc (v, nparts);\n+  tree index = bitsize_int (0);\n+  for (unsigned int n = 0; n < nparts;\n+       n++, index = int_const_binop (PLUS_EXPR, index, part_width))\n+    {\n+      tree bfr = build3 (BIT_FIELD_REF, inner_type, unshare_expr (mem_ref),\n+\t\t\t part_width, index);\n+      tree new_lhs = make_ssa_name_for_piece (inner_type, lhs, n);\n+      constructor_elt ce = {NULL_TREE, new_lhs};\n+      v->quick_push (ce);\n+      gimple *g = gimple_build_assign (new_lhs, bfr);\n+      gsi_insert_before (gsi, g, GSI_SAME_STMT);\n+    }\n+  tree ctor = build_constructor (type, v);\n+  gimple_assign_set_rhs_from_tree (gsi, ctor);\n+  update_stmt (gsi_stmt (*gsi));\n+}\n+\n /* Process one statement.  If we identify a vector operation, expand it.  */\n \n static void\n@@ -2233,6 +2330,14 @@ expand_vector_operations_1 (gimple_stmt_iterator *gsi)\n       return;\n     }\n \n+  if (code == MEM_REF\n+      && TREE_CODE (lhs) == SSA_NAME\n+      && VECTOR_TYPE_P (TREE_TYPE (lhs)))\n+    {\n+      expand_vector_load (gsi);\n+      return;\n+    }\n+\n   if (rhs_class != GIMPLE_UNARY_RHS && rhs_class != GIMPLE_BINARY_RHS)\n     return;\n \n@@ -2451,6 +2556,91 @@ expand_vector_operations_1 (gimple_stmt_iterator *gsi)\n   gimple_assign_set_rhs_from_tree (gsi, new_rhs);\n   update_stmt (gsi_stmt (*gsi));\n }\n+\n+/* Check whether the given PHI should be expanded into pieces.  Return a gimple\n+   assign statement whose RHS is a CONSTRUCTOR node containing new SSA names if\n+   expansion is needed, or NULL otherwise.  */\n+\n+static gimple *\n+maybe_build_phi_pieces_ctor (gphi *phi)\n+{\n+  tree result = gimple_phi_result (phi);\n+  tree type = TREE_TYPE (result);\n+  tree inner_type = get_piecewise_move_type (type);\n+  if (inner_type == NULL_TREE)\n+    return NULL;\n+\n+  /* Expanding a PHI requires inserting new statements.  But in some corner\n+     cases, it's not safe to insert new statements at current basic block's\n+     incoming edge.  */\n+  for (unsigned int i = 0; i < gimple_phi_num_args (phi); i++)\n+    if (gimple_phi_arg_edge (phi, i)->flags & EDGE_ABNORMAL)\n+      return NULL;\n+\n+  vec<constructor_elt, va_gc> *v;\n+  tree part_width = TYPE_SIZE (inner_type);\n+  unsigned int nunits = nunits_for_known_piecewise_op (type);\n+  unsigned int delta = nunits_for_known_piecewise_op (inner_type);\n+  gcc_assert (multiple_p (nunits, delta));\n+  unsigned int nparts = nunits / delta;\n+\n+  /* Now create a CONSTRUCTOR node containing new SSA names that represent the\n+     pieces of the original PHI result.  */\n+  vec_alloc (v, nparts);\n+  tree index = bitsize_int (0);\n+  for (unsigned int n = 0; n < nparts;\n+       n++, index = int_const_binop (PLUS_EXPR, index, part_width))\n+    {\n+      tree result_part = make_ssa_name_for_piece (inner_type, result, n);\n+      constructor_elt ce = {NULL_TREE, result_part};\n+      v->quick_push (ce);\n+    }\n+  return gimple_build_assign (result, build_constructor (type, v));\n+}\n+\n+/* Do actual PHI node replacements.  This removes the original PHI in the end\n+   and returns whether new basic blocks are created during this step.  */\n+\n+static bool\n+replace_vector_phi (gphi *old_phi)\n+{\n+  gimple_stmt_iterator gsi;\n+  bool cfg_changed = false;\n+  basic_block bb = gimple_bb (old_phi);\n+  gimple *assign = SSA_NAME_DEF_STMT (gimple_phi_result (old_phi));\n+  gcc_assert (is_a <gassign *> (assign));\n+  tree ctor = gimple_assign_rhs1 (assign);\n+\n+  /* Create new PHI pieces based on the constructor values.  */\n+  unsigned int nth;\n+  tree new_def;\n+  FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (ctor), nth, new_def)\n+    {\n+      gphi *new_phi = create_phi_node (new_def, bb);\n+      tree inner_type = TREE_TYPE (new_def);\n+      tree part_width = TYPE_SIZE (inner_type);\n+      tree index = int_const_binop (MULT_EXPR, part_width, bitsize_int (nth));\n+\n+      /* Set all arguments for each new PHI piece.  */\n+      for (unsigned int i = 0; i < gimple_phi_num_args (old_phi); i++)\n+\t{\n+\t  edge e = gimple_phi_arg_edge (old_phi, i);\n+\t  tree old_arg = gimple_phi_arg_def_from_edge (old_phi, e);\n+\t  tree bfr = build3 (BIT_FIELD_REF, inner_type, old_arg,\n+\t\t\t     part_width, index);\n+\t  tree new_arg = make_ssa_name_for_piece (inner_type, old_arg, nth);\n+\t  gimple *g = gimple_build_assign (new_arg, bfr);\n+\t  if (gsi_insert_on_edge_immediate (e, g) != NULL)\n+\t    cfg_changed = true;\n+\t  SET_PHI_ARG_DEF (new_phi, i, new_arg);\n+\t}\n+    }\n+\n+  /* Remove the original PHI node.  */\n+  gsi = gsi_for_phi (old_phi);\n+  remove_phi_node (&gsi, false);\n+  return cfg_changed;\n+}\n \f\n /* Use this to lower vector operations introduced by the vectorizer,\n    if it may need the bit-twiddling tricks implemented in this file.  */\n@@ -2458,12 +2648,29 @@ expand_vector_operations_1 (gimple_stmt_iterator *gsi)\n static unsigned int\n expand_vector_operations (void)\n {\n+  gphi_iterator gpi;\n   gimple_stmt_iterator gsi;\n   basic_block bb;\n   bool cfg_changed = false;\n+  auto_vec<gphi *> worklist;\n \n   FOR_EACH_BB_FN (bb, cfun)\n     {\n+      /* Step 1 of PHI expansion: Collect PHI nodes that need to be expanded\n+\t into a worklist.  For each of them, insert a new statement that\n+\t assigns a constructor of new PHI results to current PHI result.  */\n+      gsi = gsi_after_labels (bb);\n+      for (gpi = gsi_start_phis (bb); !gsi_end_p (gpi); gsi_next (&gpi))\n+\t{\n+\t  gphi *phi = gpi.phi ();\n+\t  gimple *ctor_stmt = maybe_build_phi_pieces_ctor (phi);\n+\t  if (ctor_stmt != NULL)\n+\t    {\n+\t      worklist.safe_push (phi);\n+\t      gsi_insert_before (&gsi, ctor_stmt, GSI_LAST_NEW_STMT);\n+\t    }\n+\t}\n+\n       for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))\n \t{\n \t  expand_vector_operations_1 (&gsi);\n@@ -2485,6 +2692,11 @@ expand_vector_operations (void)\n \t}\n     }\n \n+  /* Step 2 of PHI expansion: Do actual replacements for PHIs in the worklist.\n+     This removes the original PHIs in the end.  */\n+  for (unsigned int i = 0; i < worklist.length (); i++)\n+    cfg_changed |= replace_vector_phi (worklist[i]);\n+\n   return cfg_changed ? TODO_cleanup_cfg : 0;\n }\n \n",
    "prefixes": []
}