From patchwork Thu Nov 16 18:06:26 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alex Coplan X-Patchwork-Id: 1864862 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=armh.onmicrosoft.com header.i=@armh.onmicrosoft.com header.a=rsa-sha256 header.s=selector2-armh-onmicrosoft-com header.b=TriwE+OP; dkim=pass (1024-bit key) header.d=armh.onmicrosoft.com header.i=@armh.onmicrosoft.com header.a=rsa-sha256 header.s=selector2-armh-onmicrosoft-com header.b=TriwE+OP; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=8.43.85.97; helo=server2.sourceware.org; envelope-from=gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=patchwork.ozlabs.org) Received: from server2.sourceware.org (server2.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4SWSfZ4sFtz1yRV for ; Fri, 17 Nov 2023 05:07:02 +1100 (AEDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 6BE523876890 for ; Thu, 16 Nov 2023 18:06:59 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from EUR05-DB8-obe.outbound.protection.outlook.com (mail-db8eur05on2045.outbound.protection.outlook.com [40.107.20.45]) by sourceware.org (Postfix) with ESMTPS id D1389383E70D for ; Thu, 16 Nov 2023 18:06:40 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org D1389383E70D 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 D1389383E70D Authentication-Results: server2.sourceware.org; arc=pass smtp.remote-ip=40.107.20.45 ARC-Seal: i=3; a=rsa-sha256; d=sourceware.org; s=key; t=1700158007; cv=pass; b=eoWPdi7K6KL49iHOBNJv690mIItLzte5qVPGB2M19S67Tg/KIVwO0cIzJsy2ZD4ORpFwyk7AdgNXCpBDyZfweFuX2hNjzwN43/3bdEdyybqyCIgCIuY/V1n1IjrKgz3CrcGzk8bLa5WzEwzCuGD0gxeSTfmagfbU3Dhrx3OiA2U= ARC-Message-Signature: i=3; a=rsa-sha256; d=sourceware.org; s=key; t=1700158007; c=relaxed/simple; bh=ccqm9EY/syG9wTvnamgh0cs0vSsfSbKwBmvn2DzHEEA=; h=DKIM-Signature:DKIM-Signature:Date:From:To:Subject:Message-ID: MIME-Version; b=OmygcvmesW0b4rfGlZcbwxNSwG/JaYmivdlebDgEMnjzVfbpdI2n3w1rvQtgbzJNBFL4nUgVGfTMWIHVQmeJ+AUz/QLMVOoRNsxAzwl1B/Zu/CeWNVuHS2j8xUTAHYH8V3NNrhgykFvXpii9Ts5HQVMkfNF5iS2NqaE10mmxxOU= ARC-Authentication-Results: i=3; server2.sourceware.org ARC-Seal: i=2; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=pass; b=b/kP6k86nExpbF7JLd5kMfN6bh109LIuwSj87y4anOyyguD8PuMlwzLHzJTMZyfrFf3y+5+iH84SWsPboWHFFfB5WCpovpioaBSM6c/MGbMIg326xAO5z7uhL7PmWPtD7naj27b9icx8i6whWMRNgsDAo/Zn/yjqnE6zndmleNJ48TzL/7qmWaPw/Eo24Pyqq8c1xPWWt1X5T9zseUTTXAR3juaQBBpjMIbqxZ19seN9MeY0tzpfP4v0MEzkbxUoypq0MZcaMVQ7ExI4ySv2/t2KrAY6aTPwW5Xx7rSTNMNsX7r3NYeR8JrLmKOx2UEvbiGkUe01niHLPC+fhh0MIQ== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; 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=kltjQmWGGn4ZLMqtDyWaZYMUThI1jvaFb4V34H5+mec=; b=bMtOEFtYjtlb9YEba/+moo2YVxdQC82u8riRDlzhrLxQCIGQIxcn+J6iG15K+63Q47e4kC53KSOBeIBzUF4+2YbBK14boKkEM7gMjNceCurIgU8bglMeU9uM3avDYrrovzQDE8fmOdZ/3GESiocgS85AxmJf/0tLrR7AfmC70Rw38QXRZJrtElR/YwQ/kmoOgQWaOdHtDGqIFcXiyt4rJKV8/incmqKJDgFtC+7quXbZJZzwLOrX/9pwxdkvOPcUl71OODUETZyTZSK9GqW873NSW/LJlT26j8QwvwWj/rWPxNlT+nnhWyvxl2qeUFr35Zjodj8oFh6CU62QDM3CBg== ARC-Authentication-Results: i=2; mx.microsoft.com 1; spf=pass (sender ip is 63.35.35.123) smtp.rcpttodomain=gcc.gnu.org smtp.mailfrom=arm.com; dmarc=pass (p=none sp=none pct=100) action=none header.from=arm.com; dkim=pass (signature was verified) header.d=armh.onmicrosoft.com; arc=pass (0 oda=1 ltdi=1 spf=[1,1,smtp.mailfrom=arm.com] dkim=[1,1,header.d=arm.com] dmarc=[1,1,header.from=arm.com]) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; s=selector2-armh-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=kltjQmWGGn4ZLMqtDyWaZYMUThI1jvaFb4V34H5+mec=; b=TriwE+OP1ZbyoRsC1norghyacx9+P52x8kuC4YOMJSbpzsmwbR3Ff7rWUZaedvBh3aliNzB/OezLn+Fq4LWXFpUWVOCxdWMQMVsCMbCOe8Ot8b5dhSxSxGufBU3YVz4T/nLA+fbvdhcqw8ii6JZ7YxnaTu9baClPBxPDK0ukmn4= Received: from DU7PR01CA0040.eurprd01.prod.exchangelabs.com (2603:10a6:10:50e::23) by AS4PR08MB7781.eurprd08.prod.outlook.com (2603:10a6:20b:515::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7002.20; Thu, 16 Nov 2023 18:06:38 +0000 Received: from DB5PEPF00014B9F.eurprd02.prod.outlook.com (2603:10a6:10:50e:cafe::ea) by DU7PR01CA0040.outlook.office365.com (2603:10a6:10:50e::23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7002.23 via Frontend Transport; Thu, 16 Nov 2023 18:06:37 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 63.35.35.123) smtp.mailfrom=arm.com; dkim=pass (signature was verified) header.d=armh.onmicrosoft.com;dmarc=pass action=none header.from=arm.com; Received-SPF: Pass (protection.outlook.com: domain of arm.com designates 63.35.35.123 as permitted sender) receiver=protection.outlook.com; client-ip=63.35.35.123; helo=64aa7808-outbound-1.mta.getcheckrecipient.com; pr=C Received: from 64aa7808-outbound-1.mta.getcheckrecipient.com (63.35.35.123) by DB5PEPF00014B9F.mail.protection.outlook.com (10.167.8.169) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7002.20 via Frontend Transport; Thu, 16 Nov 2023 18:06:37 +0000 Received: ("Tessian outbound 26ee1d40577c:v228"); Thu, 16 Nov 2023 18:06:37 +0000 X-CheckRecipientChecked: true X-CR-MTA-CID: 0491455609b03488 X-CR-MTA-TID: 64aa7808 Received: from 00b76b9b7519.2 by 64aa7808-outbound-1.mta.getcheckrecipient.com id 208E7DCA-66BE-4D18-BFDB-9AC6A82C5244.1; Thu, 16 Nov 2023 18:06:31 +0000 Received: from EUR05-AM6-obe.outbound.protection.outlook.com by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id 00b76b9b7519.2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384); Thu, 16 Nov 2023 18:06:31 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=WahBdYdLXcbGxKeuOZLNOBpWvPRjKwGIRBh+sr6U1ZOEMoWFyaq0e1HP2pN8r6np8N2l2pbPDPjxXRHAhKQz+89gI6AvUc2O6aBzjqypgOeWOxm4sVLWCUrmiCnyoVgHAc5+l1Zz4leeOHm2Xj+Js8+yU6i230geGWL9IY9GfZqecL5wL1Gj12bkZMxWYjPQ00gPuJCW7QfbfCnvfrWZ5hCNXTPzBGdbpdLVVCx1K/mKeNrm2j3GF8lfFS8Yu3Rb8jT7VqrtppypOyEGzdTKGMu1KPNyQllpMwOsGGUnarPXkI4lv8Vnyh7dCXRgTdcyAf+502XkI5itro+14qOzjQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; 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=kltjQmWGGn4ZLMqtDyWaZYMUThI1jvaFb4V34H5+mec=; b=n7ZjPJH1s97FrYlXaNP8Vl8pyDgKjBrHYVkYF9QzFbkhi1OkW4FwOT8NrThcP5aT93atlQqfybrYTxHEBs9HS8yPYMiwyWy1gfmFCGglCycecCQdZjd00ZTlY433MWzaF47gFox5RcPaGdvbaxS1JVD0m06e0lXJXCSPllPzWkQ/8dz/eYWtA5h41tFGvVlownS7SU9gKz00TcGZdfafuyU/wXzYQqAj6DAaNwE5UqCyPKkUBFj9s3Wl/nVPywH8rLUF+lcam5Q1uc3ySEb/F90iwZof4FLJJo0RmN5basquytQnnTsLry66EChqYFc6Hjt+gnARF0/jWD1rnq+0qA== 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=armh.onmicrosoft.com; s=selector2-armh-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=kltjQmWGGn4ZLMqtDyWaZYMUThI1jvaFb4V34H5+mec=; b=TriwE+OP1ZbyoRsC1norghyacx9+P52x8kuC4YOMJSbpzsmwbR3Ff7rWUZaedvBh3aliNzB/OezLn+Fq4LWXFpUWVOCxdWMQMVsCMbCOe8Ot8b5dhSxSxGufBU3YVz4T/nLA+fbvdhcqw8ii6JZ7YxnaTu9baClPBxPDK0ukmn4= Authentication-Results-Original: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com; Received: from PAWPR08MB8958.eurprd08.prod.outlook.com (2603:10a6:102:33e::15) by GV1PR08MB7378.eurprd08.prod.outlook.com (2603:10a6:150:22::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7002.21; Thu, 16 Nov 2023 18:06:29 +0000 Received: from PAWPR08MB8958.eurprd08.prod.outlook.com ([fe80::8512:cc10:24d4:1919]) by PAWPR08MB8958.eurprd08.prod.outlook.com ([fe80::8512:cc10:24d4:1919%5]) with mapi id 15.20.6977.029; Thu, 16 Nov 2023 18:06:29 +0000 Date: Thu, 16 Nov 2023 18:06:26 +0000 From: Alex Coplan To: gcc-patches@gcc.gnu.org Cc: Richard Sandiford , Kyrylo Tkachov Subject: [PATCH 01/11] rtl-ssa: Support for inserting new insns Message-ID: Content-Disposition: inline X-ClientProxiedBy: LO2P265CA0178.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:a::22) To PAWPR08MB8958.eurprd08.prod.outlook.com (2603:10a6:102:33e::15) MIME-Version: 1.0 X-MS-TrafficTypeDiagnostic: PAWPR08MB8958:EE_|GV1PR08MB7378:EE_|DB5PEPF00014B9F:EE_|AS4PR08MB7781:EE_ X-MS-Office365-Filtering-Correlation-Id: 7aed145c-45ee-483b-9e42-08dbe6cec6e9 x-checkrecipientrouted: true NoDisclaimer: true X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam-Untrusted: BCL:0; X-Microsoft-Antispam-Message-Info-Original: +n2VFyNwMYzbQt4ibWVKQif1wkyeKoczn6Cbkebs8Sksg4ptD9gAIKZiAFGI3JgmMDkiw8QgwG0jCn4SaHTPDVqjdpQLmUk7zLm2JzdOtsxlIYKV2h/zpP9LvqQrXeUS+A7CMgIBve52ukAeDYcJVBeFgm1lcsJp57hTqwga14dYuXAEYHW+num0kfqRpFCCURWy5o8D9tcj597FBZLkDGs0Q3/JKT4S0wQbwiBkVRhFfgU4JgluR8kc6JtqAYAAqBRfWvujQ/g3K9mMm/WqULlgtbZ96gpf01xOB3k6EWVrZvw2JXlEWqfW5bMtTQ4zP5Rfb65sgfGfbt+rCIIlvr4Z3xEZupDbccgnAjV5xh6ECHN4Wfub24AIBDT1ajsTJPqR9o2n2Df0+6bMWHTLmhEnZEid8x/gi16B/q+TPdEMN7M1MhKPJozE8bI/R0qkrjEH/WCA+ViN6a9mn+pg+xRHZ+VhEWp8AXz7GqaBo5kZxiz+vQGQOboZsrIU87osGiGg8PWqEiYp+RcFdFKvkvO44ECHiEt6ySqV3tWPk82Tj1aWe9s+zJrx1kY7/jWNKtfVMSDwRGxAIyd+/L4RYSq8+BOCMMIq1zC2iDMmeFc= X-Forefront-Antispam-Report-Untrusted: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:PAWPR08MB8958.eurprd08.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230031)(366004)(136003)(39860400002)(376002)(346002)(396003)(230922051799003)(1800799009)(64100799003)(186009)(451199024)(2906002)(41300700001)(316002)(66476007)(66556008)(54906003)(6916009)(36756003)(8936002)(8676002)(66946007)(4326008)(38100700002)(478600001)(966005)(235185007)(5660300002)(44832011)(6486002)(86362001)(83380400001)(26005)(6512007)(2616005)(6666004)(6506007)(44144004)(33964004)(2700100001); DIR:OUT; SFP:1101; X-MS-Exchange-Transport-CrossTenantHeadersStamped: GV1PR08MB7378 Original-Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com; X-EOPAttributedMessage: 0 X-MS-Exchange-Transport-CrossTenantHeadersStripped: DB5PEPF00014B9F.eurprd02.prod.outlook.com X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id-Prvs: f3b24202-0548-478e-9ef5-08dbe6cec1a4 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: CLk8+OuwU5jIZLo8F0TWRHDhQG5FERvUsQLhwQeZdcHAcSgs2QHkRpt8td0Q14wxGKUF5/eACtV/Xl/79a0lV4QCaVbcAlGKT5UargkXLYSE00AiZJGHV7nXRlHCdEu4X1jpKAjLLYW2eMnqbGwaU9foBAjKH0vELZ2t/dnMvHv3eN77KZsX3w2stsoaIsqg911DUzzevglJ8Lcbc5FOkuOuCx/Aygd8n4dAsJ/XWpJmdq1b6sN8JFMK3qeNwQrEML1kac0dBpMLz+ObDpnbM7+zTlONYnuwPgB/sF/T4n678H5aBx1XsIu0V8HTA4q8ZqsWAOEGJLjrCs+0r6AudFxMViQC2mk3rbRgA6yxOGX0QOI3OlejWX38KRP7X7Fx7LDfMlYF+yklJ7XnIfIJv3z7dsCP72J70Rqt+QKqXyCqWTzivEboVYUIEWHBAfQ6OKiEKu3PjPTa5OY1waqifz9HLndpdy6dgzLSeOhBhPE5npPqpp3HWX91w+Mj3N3zPmAKxywByK7K9LrgXyG08+UxCLzmZyNYYapGV3OhMvNeQGVNXHXUb4FgN9wtC+tzhatqEkEn5pRNS+qLiZ9muVLXRBobmmS6AN5TE19pdI4YrFUWtAVg81mGinYXTTZC9PTTGQTfUpwHHi6J8IN8PrMILBBJ4U0Jxm+a9WOcx5/fdohHQC2TU1Qy5W8wfgi1jKNvBYoZF64qYrNYRj633cxwqFekBnDxOyITuaPS+QSMT4PBDdi9iSGS1Lvg15R/ X-Forefront-Antispam-Report: CIP:63.35.35.123; CTRY:IE; LANG:en; SCL:1; SRV:; IPV:CAL; SFV:NSPM; H:64aa7808-outbound-1.mta.getcheckrecipient.com; PTR:ec2-63-35-35-123.eu-west-1.compute.amazonaws.com; CAT:NONE; SFS:(13230031)(4636009)(39860400002)(376002)(136003)(346002)(396003)(230922051799003)(82310400011)(64100799003)(451199024)(1800799009)(186009)(40470700004)(36840700001)(46966006)(6666004)(36860700001)(356005)(81166007)(47076005)(83380400001)(82740400003)(26005)(336012)(2616005)(44144004)(40480700001)(33964004)(6506007)(478600001)(6486002)(966005)(6512007)(316002)(54906003)(6916009)(70586007)(70206006)(44832011)(4326008)(8676002)(8936002)(86362001)(5660300002)(235185007)(40460700003)(2906002)(41300700001)(36756003)(2700100001); DIR:OUT; SFP:1101; X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 Nov 2023 18:06:37.7907 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 7aed145c-45ee-483b-9e42-08dbe6cec6e9 X-MS-Exchange-CrossTenant-Id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=f34e5979-57d9-4aaa-ad4d-b122a662184d; Ip=[63.35.35.123]; Helo=[64aa7808-outbound-1.mta.getcheckrecipient.com] X-MS-Exchange-CrossTenant-AuthSource: DB5PEPF00014B9F.eurprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS4PR08MB7781 X-Spam-Status: No, score=-12.0 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, FORGED_SPF_HELO, GIT_PATCH_0, KAM_DMARC_NONE, KAM_SHORT, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_HELO_PASS, SPF_NONE, TXREP, T_SCC_BODY_TEXT_LINE, UNPARSEABLE_RELAY 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+incoming=patchwork.ozlabs.org@gcc.gnu.org N.B. this is just a rebased (but otherwise unchanged) version of the same patch already posted here: https://gcc.gnu.org/pipermail/gcc-patches/2023-October/633348.html this is the only unreviewed dependency from the previous series, so it seemed easier just to re-post it (not least to appease the pre-commit CI). -- >8 -- The upcoming aarch64 load pair pass needs to form store pairs, and can re-order stores over loads when alias analysis determines this is safe. In the case that both mem defs have uses in the RTL-SSA IR, and both stores require re-ordering over their uses, we represent that as (tentative) deletion of the original store insns and creation of a new insn, to prevent requiring repeated re-parenting of uses during the pass. We then update all mem uses that require re-parenting in one go at the end of the pass. To support this, RTL-SSA needs to handle inserting new insns (rather than just changing existing ones), so this patch adds support for that. New insns (and new accesses) are temporaries, allocated above a temporary obstack_watermark, such that the user can easily back out of a change without awkward bookkeeping. Bootstrapped/regtested as a series on aarch64-linux-gnu, OK for trunk? gcc/ChangeLog: * rtl-ssa/accesses.cc (function_info::create_set): New. * rtl-ssa/accesses.h (access_info::is_temporary): New. * rtl-ssa/changes.cc (move_insn): Handle new (temporary) insns. (function_info::finalize_new_accesses): Handle new/temporary user-created accesses. (function_info::apply_changes_to_insn): Ensure m_is_temp flag on new insns gets cleared. (function_info::change_insns): Handle new/temporary insns. (function_info::create_insn): New. * rtl-ssa/changes.h (class insn_change): Make function_info a friend class. * rtl-ssa/functions.h (function_info): Declare new entry points: create_set, create_insn. Declare new change_alloc helper. * rtl-ssa/insns.cc (insn_info::print_full): Identify temporary insns in dump. * rtl-ssa/insns.h (insn_info): Add new m_is_temp flag and accompanying is_temporary accessor. * rtl-ssa/internals.inl (insn_info::insn_info): Initialize m_is_temp to false. * rtl-ssa/member-fns.inl (function_info::change_alloc): New. * rtl-ssa/movement.h (restrict_movement_for_defs_ignoring): Add handling for temporary defs. --- gcc/rtl-ssa/accesses.cc | 10 ++++++ gcc/rtl-ssa/accesses.h | 4 +++ gcc/rtl-ssa/changes.cc | 74 +++++++++++++++++++++++++++++++------- gcc/rtl-ssa/changes.h | 2 ++ gcc/rtl-ssa/functions.h | 14 ++++++++ gcc/rtl-ssa/insns.cc | 5 +++ gcc/rtl-ssa/insns.h | 7 +++- gcc/rtl-ssa/internals.inl | 1 + gcc/rtl-ssa/member-fns.inl | 12 +++++++ gcc/rtl-ssa/movement.h | 8 ++++- 10 files changed, 123 insertions(+), 14 deletions(-) diff --git a/gcc/rtl-ssa/accesses.cc b/gcc/rtl-ssa/accesses.cc index 510545a8bad..76d70fd8bd3 100644 --- a/gcc/rtl-ssa/accesses.cc +++ b/gcc/rtl-ssa/accesses.cc @@ -1456,6 +1456,16 @@ function_info::make_uses_available (obstack_watermark &watermark, return use_array (new_uses, num_uses); } +set_info * +function_info::create_set (obstack_watermark &watermark, + insn_info *insn, + resource_info resource) +{ + auto set = change_alloc (watermark, insn, resource); + set->m_is_temp = true; + return set; +} + // Return true if ACCESS1 can represent ACCESS2 and if ACCESS2 can // represent ACCESS1. static bool diff --git a/gcc/rtl-ssa/accesses.h b/gcc/rtl-ssa/accesses.h index fce31d46717..7e7a90ece97 100644 --- a/gcc/rtl-ssa/accesses.h +++ b/gcc/rtl-ssa/accesses.h @@ -204,6 +204,10 @@ public: // in the main instruction pattern. bool only_occurs_in_notes () const { return m_only_occurs_in_notes; } + // Return true if this is a temporary access, e.g. one created for + // an insn that is about to be inserted. + bool is_temporary () const { return m_is_temp; } + protected: access_info (resource_info, access_kind); diff --git a/gcc/rtl-ssa/changes.cc b/gcc/rtl-ssa/changes.cc index aab532b9f26..da2a61d701a 100644 --- a/gcc/rtl-ssa/changes.cc +++ b/gcc/rtl-ssa/changes.cc @@ -394,14 +394,20 @@ move_insn (insn_change &change, insn_info *after) // At the moment we don't support moving instructions between EBBs, // but this would be worth adding if it's useful. insn_info *insn = change.insn (); - gcc_assert (after->ebb () == insn->ebb ()); + bb_info *bb = after->bb (); basic_block cfg_bb = bb->cfg_bb (); - if (insn->bb () != bb) - // Force DF to mark the old block as dirty. - df_insn_delete (rtl); - ::remove_insn (rtl); + if (!insn->is_temporary ()) + { + gcc_assert (after->ebb () == insn->ebb ()); + + if (insn->bb () != bb) + // Force DF to mark the old block as dirty. + df_insn_delete (rtl); + ::remove_insn (rtl); + } + ::add_insn_after (rtl, after_rtl, cfg_bb); } @@ -439,10 +445,15 @@ function_info::finalize_new_accesses (insn_change &change, insn_info *pos) gcc_assert (def); if (def->m_is_temp) { - // At present, the only temporary instruction definitions we - // create are clobbers, such as those added during recog. - gcc_assert (is_a (def)); - def = allocate (change.insn (), ref.regno); + if (is_a (def)) + def = allocate (change.insn (), ref.regno); + else if (is_a (def)) + { + def->m_is_temp = false; + def = allocate (change.insn (), def->resource ()); + } + else + gcc_unreachable (); } else if (!def->m_has_been_superceded) { @@ -511,7 +522,9 @@ function_info::finalize_new_accesses (insn_change &change, insn_info *pos) unsigned int i = 0; for (use_info *use : change.new_uses) { - if (!use->m_has_been_superceded) + if (use->m_is_temp) + use->m_has_been_superceded = true; + else if (!use->m_has_been_superceded) { use = allocate_temp (insn, use->resource (), use->def ()); use->m_has_been_superceded = true; @@ -645,6 +658,8 @@ function_info::apply_changes_to_insn (insn_change &change) insn->set_accesses (builder.finish ().begin (), num_defs, num_uses); } + + insn->m_is_temp = false; } // Add a temporary placeholder instruction after AFTER. @@ -677,7 +692,8 @@ function_info::change_insns (array_slice changes) if (!change->is_deletion ()) { // Remove any notes that are no longer relevant. - update_notes (change->rtl ()); + if (!change->insn ()->m_is_temp) + update_notes (change->rtl ()); // Make sure that the placement of this instruction would still // leave room for previous instructions. @@ -686,6 +702,17 @@ function_info::change_insns (array_slice changes) // verify_insn_changes is supposed to make sure that this holds. gcc_unreachable (); min_insn = later_insn (min_insn, change->move_range.first); + + if (change->insn ()->m_is_temp) + { + change->m_insn = allocate (change->insn ()->bb (), + change->rtl (), + change->insn_uid ()); + + // Set the flag again so subsequent logic is aware. + // It will be cleared later on. + change->m_insn->m_is_temp = true; + } } } @@ -784,7 +811,8 @@ function_info::change_insns (array_slice changes) // Remove the placeholder first so that we have a wider range of // program points when inserting INSN. insn_info *after = placeholder->prev_any_insn (); - remove_insn (insn); + if (!insn->is_temporary ()) + remove_insn (insn); remove_insn (placeholder); insn->set_bb (after->bb ()); add_insn_after (insn, after); @@ -1105,6 +1133,28 @@ function_info::perform_pending_updates () return changed_cfg; } +insn_info * +function_info::create_insn (obstack_watermark &watermark, + rtx_code insn_code, + rtx pat) +{ + rtx_insn *rti = nullptr; + + // TODO: extend, move in to emit-rtl.cc. + switch (insn_code) + { + case INSN: + rti = make_insn_raw (pat); + break; + default: + gcc_unreachable (); + } + + auto insn = change_alloc (watermark, nullptr, rti, INSN_UID (rti)); + insn->m_is_temp = true; + return insn; +} + // Print a description of CHANGE to PP. void rtl_ssa::pp_insn_change (pretty_printer *pp, const insn_change &change) diff --git a/gcc/rtl-ssa/changes.h b/gcc/rtl-ssa/changes.h index d56e3a646e2..d91cf432afe 100644 --- a/gcc/rtl-ssa/changes.h +++ b/gcc/rtl-ssa/changes.h @@ -32,6 +32,8 @@ namespace rtl_ssa { // something that we might do. class insn_change { + friend class function_info; + public: enum delete_action { DELETE }; diff --git a/gcc/rtl-ssa/functions.h b/gcc/rtl-ssa/functions.h index ecb40fdaf57..4ffd3fa44e2 100644 --- a/gcc/rtl-ssa/functions.h +++ b/gcc/rtl-ssa/functions.h @@ -68,6 +68,16 @@ public: // Return the SSA information for CFG_BB. bb_info *bb (basic_block cfg_bb) const { return m_bbs[cfg_bb->index]; } + // Create a temporary def. + set_info *create_set (obstack_watermark &watermark, + insn_info *insn, + resource_info resource); + + // Create a temporary insn with code INSN_CODE and pattern PAT. + insn_info *create_insn (obstack_watermark &watermark, + rtx_code insn_code, + rtx pat); + // Return a list of all the instructions in the function, in reverse // postorder. The list includes both real and artificial instructions. // @@ -195,6 +205,10 @@ public: // Print the contents of the function to PP. void print (pretty_printer *pp) const; + // Allocate an object of type T above the obstack watermark WM. + template + T *change_alloc (obstack_watermark &wm, Ts... args); + private: class bb_phi_info; class build_info; diff --git a/gcc/rtl-ssa/insns.cc b/gcc/rtl-ssa/insns.cc index 5fde3f2bb4b..2fa48e0dacd 100644 --- a/gcc/rtl-ssa/insns.cc +++ b/gcc/rtl-ssa/insns.cc @@ -192,6 +192,11 @@ insn_info::print_full (pretty_printer *pp) const pp_newline_and_indent (pp, 0); pp_string (pp, "has volatile refs"); } + if (m_is_temp) + { + pp_newline_and_indent (pp, 0); + pp_string (pp, "temporary"); + } } pp_indentation (pp) -= 2; } diff --git a/gcc/rtl-ssa/insns.h b/gcc/rtl-ssa/insns.h index a604fe295cd..6d0506706ad 100644 --- a/gcc/rtl-ssa/insns.h +++ b/gcc/rtl-ssa/insns.h @@ -306,6 +306,8 @@ public: // Print a full description of the instruction. void print_full (pretty_printer *) const; + bool is_temporary () const { return m_is_temp; } + private: // The first-order way of representing the order between instructions // is to assign "program points", with higher point numbers coming @@ -414,8 +416,11 @@ private: unsigned int m_has_pre_post_modify : 1; unsigned int m_has_volatile_refs : 1; + // Indicates the insn is a temporary / new user-allocated insn. + unsigned int m_is_temp : 1; + // For future expansion. - unsigned int m_spare : 27; + unsigned int m_spare : 26; // The program point at which the instruction occurs. // diff --git a/gcc/rtl-ssa/internals.inl b/gcc/rtl-ssa/internals.inl index e49297c12b3..907c4504352 100644 --- a/gcc/rtl-ssa/internals.inl +++ b/gcc/rtl-ssa/internals.inl @@ -415,6 +415,7 @@ inline insn_info::insn_info (bb_info *bb, rtx_insn *rtl, int cost_or_uid) m_is_asm (false), m_has_pre_post_modify (false), m_has_volatile_refs (false), + m_is_temp (false), m_spare (0), m_point (0), m_cost_or_uid (cost_or_uid), diff --git a/gcc/rtl-ssa/member-fns.inl b/gcc/rtl-ssa/member-fns.inl index ce2db045b78..b8940ca5566 100644 --- a/gcc/rtl-ssa/member-fns.inl +++ b/gcc/rtl-ssa/member-fns.inl @@ -962,4 +962,16 @@ function_info::add_regno_clobber (obstack_watermark &watermark, return true; } +template +inline T * +function_info::change_alloc (obstack_watermark &wm, Ts... args) +{ + static_assert (std::is_trivially_destructible::value, + "destructor won't be called"); + static_assert (alignof (T) <= obstack_alignment, + "too much alignment required"); + void *addr = XOBNEW (wm, T); + return new (addr) T (std::forward (args)...); +} + } diff --git a/gcc/rtl-ssa/movement.h b/gcc/rtl-ssa/movement.h index ec076db406f..41226dd3666 100644 --- a/gcc/rtl-ssa/movement.h +++ b/gcc/rtl-ssa/movement.h @@ -182,6 +182,11 @@ restrict_movement_for_defs_ignoring (insn_range_info &move_range, { for (def_info *def : defs) { + // Skip fresh defs that are being inserted, as these shouldn't + // constrain movement. + if (def->is_temporary ()) + continue; + // If the definition is a clobber, we can move it with respect // to other clobbers. // @@ -247,7 +252,8 @@ restrict_movement_for_defs_ignoring (insn_range_info &move_range, // Make sure that we don't move stores between basic blocks, since we // don't have enough information to tell whether it's safe. - if (def_info *def = memory_access (defs)) + def_info *def = memory_access (defs); + if (def && !def->is_temporary ()) { move_range = move_later_than (move_range, def->bb ()->head_insn ()); move_range = move_earlier_than (move_range, def->bb ()->end_insn ());