[CodeGen][NewPM] Port MachineCopyPropagation to NPM (#125202)
This commit is contained in:
parent
2f2ac3de69
commit
4313345f2e
35
llvm/include/llvm/CodeGen/MachineCopyPropagation.h
Normal file
35
llvm/include/llvm/CodeGen/MachineCopyPropagation.h
Normal file
@ -0,0 +1,35 @@
|
||||
//===- llvm/CodeGen/MachineCopyPropagation.h --------------------*- C++ -*-===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_CODEGEN_MACHINECOPYPROPAGATION_H
|
||||
#define LLVM_CODEGEN_MACHINECOPYPROPAGATION_H
|
||||
|
||||
#include "llvm/CodeGen/MachinePassManager.h"
|
||||
|
||||
namespace llvm {
|
||||
|
||||
class MachineCopyPropagationPass
|
||||
: public PassInfoMixin<MachineCopyPropagationPass> {
|
||||
bool UseCopyInstr;
|
||||
|
||||
public:
|
||||
MachineCopyPropagationPass(bool UseCopyInstr = false)
|
||||
: UseCopyInstr(UseCopyInstr) {}
|
||||
|
||||
PreservedAnalyses run(MachineFunction &MF,
|
||||
MachineFunctionAnalysisManager &MFAM);
|
||||
|
||||
MachineFunctionProperties getRequiredProperties() const {
|
||||
return MachineFunctionProperties().set(
|
||||
MachineFunctionProperties::Property::NoVRegs);
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace llvm
|
||||
|
||||
#endif // LLVM_CODEGEN_MACHINECOPYPROPAGATION_H
|
@ -192,7 +192,7 @@ void initializeMachineBranchProbabilityInfoWrapperPassPass(PassRegistry &);
|
||||
void initializeMachineCFGPrinterPass(PassRegistry &);
|
||||
void initializeMachineCSELegacyPass(PassRegistry &);
|
||||
void initializeMachineCombinerPass(PassRegistry &);
|
||||
void initializeMachineCopyPropagationPass(PassRegistry &);
|
||||
void initializeMachineCopyPropagationLegacyPass(PassRegistry &);
|
||||
void initializeMachineCycleInfoPrinterPassPass(PassRegistry &);
|
||||
void initializeMachineCycleInfoWrapperPassPass(PassRegistry &);
|
||||
void initializeMachineDominanceFrontierPass(PassRegistry &);
|
||||
|
@ -45,6 +45,7 @@
|
||||
#include "llvm/CodeGen/LowerEmuTLS.h"
|
||||
#include "llvm/CodeGen/MIRPrinter.h"
|
||||
#include "llvm/CodeGen/MachineCSE.h"
|
||||
#include "llvm/CodeGen/MachineCopyPropagation.h"
|
||||
#include "llvm/CodeGen/MachineFunctionAnalysis.h"
|
||||
#include "llvm/CodeGen/MachineLICM.h"
|
||||
#include "llvm/CodeGen/MachineModuleInfo.h"
|
||||
|
@ -140,6 +140,7 @@ MACHINE_FUNCTION_PASS("early-machinelicm", EarlyMachineLICMPass())
|
||||
MACHINE_FUNCTION_PASS("early-tailduplication", EarlyTailDuplicatePass())
|
||||
MACHINE_FUNCTION_PASS("finalize-isel", FinalizeISelPass())
|
||||
MACHINE_FUNCTION_PASS("localstackalloc", LocalStackSlotAllocationPass())
|
||||
MACHINE_FUNCTION_PASS("machine-cp", MachineCopyPropagationPass())
|
||||
MACHINE_FUNCTION_PASS("machine-cse", MachineCSEPass())
|
||||
MACHINE_FUNCTION_PASS("machinelicm", MachineLICMPass())
|
||||
MACHINE_FUNCTION_PASS("no-op-machine-function", NoOpMachineFunctionPass())
|
||||
@ -235,7 +236,6 @@ DUMMY_MACHINE_FUNCTION_PASS("legalizer", LegalizerPass)
|
||||
DUMMY_MACHINE_FUNCTION_PASS("livedebugvalues", LiveDebugValuesPass)
|
||||
DUMMY_MACHINE_FUNCTION_PASS("lrshrink", LiveRangeShrinkPass)
|
||||
DUMMY_MACHINE_FUNCTION_PASS("machine-combiner", MachineCombinerPass)
|
||||
DUMMY_MACHINE_FUNCTION_PASS("machine-cp", MachineCopyPropagationPass)
|
||||
DUMMY_MACHINE_FUNCTION_PASS("static-data-splitter", StaticDataSplitter)
|
||||
DUMMY_MACHINE_FUNCTION_PASS("machine-function-splitter", MachineFunctionSplitterPass)
|
||||
DUMMY_MACHINE_FUNCTION_PASS("machine-latecleanup", MachineLateInstrsCleanupPass)
|
||||
|
@ -77,7 +77,7 @@ void llvm::initializeCodeGen(PassRegistry &Registry) {
|
||||
initializeMachineCFGPrinterPass(Registry);
|
||||
initializeMachineCSELegacyPass(Registry);
|
||||
initializeMachineCombinerPass(Registry);
|
||||
initializeMachineCopyPropagationPass(Registry);
|
||||
initializeMachineCopyPropagationLegacyPass(Registry);
|
||||
initializeMachineCycleInfoPrinterPassPass(Registry);
|
||||
initializeMachineCycleInfoWrapperPassPass(Registry);
|
||||
initializeMachineDominatorTreeWrapperPassPass(Registry);
|
||||
|
@ -48,6 +48,7 @@
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "llvm/CodeGen/MachineCopyPropagation.h"
|
||||
#include "llvm/ADT/DenseMap.h"
|
||||
#include "llvm/ADT/STLExtras.h"
|
||||
#include "llvm/ADT/SetVector.h"
|
||||
@ -449,7 +450,7 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
class MachineCopyPropagation : public MachineFunctionPass {
|
||||
class MachineCopyPropagation {
|
||||
const TargetRegisterInfo *TRI = nullptr;
|
||||
const TargetInstrInfo *TII = nullptr;
|
||||
const MachineRegisterInfo *MRI = nullptr;
|
||||
@ -461,21 +462,9 @@ public:
|
||||
static char ID; // Pass identification, replacement for typeid
|
||||
|
||||
MachineCopyPropagation(bool CopyInstr = false)
|
||||
: MachineFunctionPass(ID), UseCopyInstr(CopyInstr || MCPUseCopyInstr) {
|
||||
initializeMachineCopyPropagationPass(*PassRegistry::getPassRegistry());
|
||||
}
|
||||
: UseCopyInstr(CopyInstr || MCPUseCopyInstr) {}
|
||||
|
||||
void getAnalysisUsage(AnalysisUsage &AU) const override {
|
||||
AU.setPreservesCFG();
|
||||
MachineFunctionPass::getAnalysisUsage(AU);
|
||||
}
|
||||
|
||||
bool runOnMachineFunction(MachineFunction &MF) override;
|
||||
|
||||
MachineFunctionProperties getRequiredProperties() const override {
|
||||
return MachineFunctionProperties().set(
|
||||
MachineFunctionProperties::Property::NoVRegs);
|
||||
}
|
||||
bool run(MachineFunction &MF);
|
||||
|
||||
private:
|
||||
typedef enum { DebugUse = false, RegularUse = true } DebugType;
|
||||
@ -510,13 +499,35 @@ private:
|
||||
bool Changed = false;
|
||||
};
|
||||
|
||||
class MachineCopyPropagationLegacy : public MachineFunctionPass {
|
||||
bool UseCopyInstr;
|
||||
|
||||
public:
|
||||
static char ID; // pass identification
|
||||
|
||||
MachineCopyPropagationLegacy(bool UseCopyInstr = false)
|
||||
: MachineFunctionPass(ID), UseCopyInstr(UseCopyInstr) {}
|
||||
|
||||
void getAnalysisUsage(AnalysisUsage &AU) const override {
|
||||
AU.setPreservesCFG();
|
||||
MachineFunctionPass::getAnalysisUsage(AU);
|
||||
}
|
||||
|
||||
bool runOnMachineFunction(MachineFunction &MF) override;
|
||||
|
||||
MachineFunctionProperties getRequiredProperties() const override {
|
||||
return MachineFunctionProperties().set(
|
||||
MachineFunctionProperties::Property::NoVRegs);
|
||||
}
|
||||
};
|
||||
|
||||
} // end anonymous namespace
|
||||
|
||||
char MachineCopyPropagation::ID = 0;
|
||||
char MachineCopyPropagationLegacy::ID = 0;
|
||||
|
||||
char &llvm::MachineCopyPropagationID = MachineCopyPropagation::ID;
|
||||
char &llvm::MachineCopyPropagationID = MachineCopyPropagationLegacy::ID;
|
||||
|
||||
INITIALIZE_PASS(MachineCopyPropagation, DEBUG_TYPE,
|
||||
INITIALIZE_PASS(MachineCopyPropagationLegacy, DEBUG_TYPE,
|
||||
"Machine Copy Propagation Pass", false, false)
|
||||
|
||||
void MachineCopyPropagation::ReadRegister(MCRegister Reg, MachineInstr &Reader,
|
||||
@ -1563,10 +1574,25 @@ void MachineCopyPropagation::EliminateSpillageCopies(MachineBasicBlock &MBB) {
|
||||
Tracker.clear();
|
||||
}
|
||||
|
||||
bool MachineCopyPropagation::runOnMachineFunction(MachineFunction &MF) {
|
||||
bool MachineCopyPropagationLegacy::runOnMachineFunction(MachineFunction &MF) {
|
||||
if (skipFunction(MF.getFunction()))
|
||||
return false;
|
||||
|
||||
return MachineCopyPropagation(UseCopyInstr).run(MF);
|
||||
}
|
||||
|
||||
PreservedAnalyses
|
||||
MachineCopyPropagationPass::run(MachineFunction &MF,
|
||||
MachineFunctionAnalysisManager &) {
|
||||
MFPropsModifier _(*this, MF);
|
||||
if (!MachineCopyPropagation(UseCopyInstr).run(MF))
|
||||
return PreservedAnalyses::all();
|
||||
auto PA = getMachineFunctionPassPreservedAnalyses();
|
||||
PA.preserveSet<CFGAnalyses>();
|
||||
return PA;
|
||||
}
|
||||
|
||||
bool MachineCopyPropagation::run(MachineFunction &MF) {
|
||||
bool isSpillageCopyElimEnabled = false;
|
||||
switch (EnableSpillageCopyElimination) {
|
||||
case cl::BOU_UNSET:
|
||||
@ -1599,5 +1625,5 @@ bool MachineCopyPropagation::runOnMachineFunction(MachineFunction &MF) {
|
||||
|
||||
MachineFunctionPass *
|
||||
llvm::createMachineCopyPropagationPass(bool UseCopyInstr = false) {
|
||||
return new MachineCopyPropagation(UseCopyInstr);
|
||||
return new MachineCopyPropagationLegacy(UseCopyInstr);
|
||||
}
|
||||
|
@ -110,6 +110,7 @@
|
||||
#include "llvm/CodeGen/MachineBlockFrequencyInfo.h"
|
||||
#include "llvm/CodeGen/MachineBranchProbabilityInfo.h"
|
||||
#include "llvm/CodeGen/MachineCSE.h"
|
||||
#include "llvm/CodeGen/MachineCopyPropagation.h"
|
||||
#include "llvm/CodeGen/MachineDominators.h"
|
||||
#include "llvm/CodeGen/MachineFunctionAnalysis.h"
|
||||
#include "llvm/CodeGen/MachineLICM.h"
|
||||
|
@ -1,6 +1,8 @@
|
||||
# Check that we can remove the redundant save of constant registers such as $wzr
|
||||
# RUN: llc -mtriple=aarch64-unknown-linux %s -verify-machineinstrs -start-before=machine-cp -o - | FileCheck %s --check-prefix ASM
|
||||
# RUN: llc -mtriple=aarch64-unknown-linux %s -verify-machineinstrs -run-pass=machine-cp -o - | FileCheck %s
|
||||
|
||||
# RUN: llc -mtriple=aarch64-unknown-linux %s -passes=machine-cp -o - | FileCheck %s
|
||||
--- |
|
||||
target triple = "aarch64-unknown-linux"
|
||||
declare i32 @bar(i32) nounwind
|
||||
|
@ -1,4 +1,5 @@
|
||||
# RUN: llc -o - %s -mtriple=amdgcn -mcpu=fiji -run-pass=machine-cp -verify-machineinstrs | FileCheck -check-prefix=GCN %s
|
||||
# RUN: llc -o - %s -mtriple=amdgcn -mcpu=fiji -passes=machine-cp | FileCheck -check-prefix=GCN %s
|
||||
|
||||
# GCN-LABEL: dead_copy
|
||||
# GCN: bb.0
|
||||
|
@ -7,7 +7,6 @@
|
||||
; RUN: llc -enable-new-pm -mtriple=amdgcn -mcpu=gfx1030 -stop-after=amdgpu-remove-incompatible-functions\
|
||||
; RUN: -pass-remarks=amdgpu-remove-incompatible-functions %s -o - 2>%t | FileCheck -check-prefixes=COMPATIBLE,REALTIME,MEMTIME %s
|
||||
; RUN: FileCheck -allow-empty --check-prefixes=WARN-REALTIME,WARN-MEMTIME %s < %t
|
||||
; RUN: llc -enable-new-pm -mtriple=amdgcn -mcpu=gfx1030 -verify-machineinstrs < %s
|
||||
|
||||
; RUN: llc -mtriple=amdgcn -mcpu=gfx1102 -stop-after=amdgpu-remove-incompatible-functions\
|
||||
; RUN: -pass-remarks=amdgpu-remove-incompatible-functions %s -o - 2>%t | FileCheck -check-prefixes=INCOMPATIBLE,NOREALTIME,NOMEMTIME %s
|
||||
@ -17,7 +16,6 @@
|
||||
; RUN: llc -enable-new-pm -mtriple=amdgcn -mcpu=gfx1102 -stop-after=amdgpu-remove-incompatible-functions\
|
||||
; RUN: -pass-remarks=amdgpu-remove-incompatible-functions %s -o - 2>%t | FileCheck -check-prefixes=INCOMPATIBLE,NOREALTIME,NOMEMTIME %s
|
||||
; RUN: FileCheck --check-prefixes=WARN-NOREALTIME,WARN-NOMEMTIME %s < %t
|
||||
; RUN: llc -enable-new-pm -mtriple=amdgcn -mcpu=gfx1102 -verify-machineinstrs < %s
|
||||
|
||||
; Note: This test checks the IR, but also has a run line to codegen the file just to check we
|
||||
; do not crash when trying to select those functions.
|
||||
|
@ -14,7 +14,6 @@
|
||||
|
||||
; RUN: llc -enable-new-pm -mtriple=amdgcn -mcpu=gfx1011 -mattr=-wavefrontsize32,+wavefrontsize64 -stop-after=amdgpu-remove-incompatible-functions\
|
||||
; RUN: -pass-remarks=amdgpu-remove-incompatible-functions < %s 2>%t | FileCheck -check-prefixes=GFX10 %s
|
||||
; RUN: llc -enable-new-pm -mtriple=amdgcn -mcpu=gfx1011 -mattr=-wavefrontsize32,+wavefrontsize64 -verify-machineinstrs < %s
|
||||
|
||||
; RUN: llc -mtriple=amdgcn -mcpu=gfx1100 -mattr=-wavefrontsize32,+wavefrontsize64 -stop-after=amdgpu-remove-incompatible-functions\
|
||||
; RUN: -pass-remarks=amdgpu-remove-incompatible-functions < %s 2>%t | FileCheck -check-prefixes=GFX11 %s
|
||||
@ -22,7 +21,6 @@
|
||||
|
||||
; RUN: llc -enable-new-pm -mtriple=amdgcn -mcpu=gfx1100 -mattr=-wavefrontsize32,+wavefrontsize64 -stop-after=amdgpu-remove-incompatible-functions\
|
||||
; RUN: -pass-remarks=amdgpu-remove-incompatible-functions < %s 2>%t | FileCheck -check-prefixes=GFX11 %s
|
||||
; RUN: llc -enable-new-pm -mtriple=amdgcn -mcpu=gfx1100 -mattr=-wavefrontsize32,+wavefrontsize64 -verify-machineinstrs < %s
|
||||
|
||||
; WARN-GFX906: removing function 'needs_wavefrontsize32': +wavefrontsize32 is not supported on the current target
|
||||
; WARN-GFX906-NOT: not supported
|
||||
|
@ -1,5 +1,7 @@
|
||||
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
|
||||
# RUN: llc -o - %s -mtriple=armv7s-- -run-pass=machine-cp | FileCheck %s
|
||||
|
||||
# RUN: llc -o - %s -mtriple=armv7s-- -passes=machine-cp | FileCheck %s
|
||||
---
|
||||
# Test that machine copy prop recognizes the implicit-def operands on a COPY
|
||||
# as clobbering the register.
|
||||
|
Loading…
x
Reference in New Issue
Block a user