[CodeGen][NPM] Port RemoveLoadsIntoFakeUses to NPM (#130068)
This commit is contained in:
30
llvm/include/llvm/CodeGen/RemoveLoadsIntoFakeUses.h
Normal file
30
llvm/include/llvm/CodeGen/RemoveLoadsIntoFakeUses.h
Normal file
@@ -0,0 +1,30 @@
|
||||
//===- llvm/CodeGen/RemoveLoadsIntoFakeUses.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_REMOVELOADSINTOFAKEUSES_H
|
||||
#define LLVM_CODEGEN_REMOVELOADSINTOFAKEUSES_H
|
||||
|
||||
#include "llvm/CodeGen/MachinePassManager.h"
|
||||
|
||||
namespace llvm {
|
||||
|
||||
class RemoveLoadsIntoFakeUsesPass
|
||||
: public PassInfoMixin<RemoveLoadsIntoFakeUsesPass> {
|
||||
public:
|
||||
PreservedAnalyses run(MachineFunction &MF,
|
||||
MachineFunctionAnalysisManager &MFAM);
|
||||
|
||||
MachineFunctionProperties getRequiredProperties() const {
|
||||
return MachineFunctionProperties().set(
|
||||
MachineFunctionProperties::Property::NoVRegs);
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace llvm
|
||||
|
||||
#endif // LLVM_CODEGEN_REMOVELOADSINTOFAKEUSES_H
|
||||
@@ -267,7 +267,7 @@ void initializeRegionOnlyViewerPass(PassRegistry &);
|
||||
void initializeRegionPrinterPass(PassRegistry &);
|
||||
void initializeRegionViewerPass(PassRegistry &);
|
||||
void initializeRegisterCoalescerLegacyPass(PassRegistry &);
|
||||
void initializeRemoveLoadsIntoFakeUsesPass(PassRegistry &);
|
||||
void initializeRemoveLoadsIntoFakeUsesLegacyPass(PassRegistry &);
|
||||
void initializeRemoveRedundantDebugValuesLegacyPass(PassRegistry &);
|
||||
void initializeRenameIndependentSubregsLegacyPass(PassRegistry &);
|
||||
void initializeReplaceWithVeclibLegacyPass(PassRegistry &);
|
||||
|
||||
@@ -74,6 +74,7 @@
|
||||
#include "llvm/CodeGen/RegUsageInfoPropagate.h"
|
||||
#include "llvm/CodeGen/RegisterCoalescerPass.h"
|
||||
#include "llvm/CodeGen/RegisterUsageInfo.h"
|
||||
#include "llvm/CodeGen/RemoveLoadsIntoFakeUses.h"
|
||||
#include "llvm/CodeGen/RemoveRedundantDebugValues.h"
|
||||
#include "llvm/CodeGen/RenameIndependentSubregs.h"
|
||||
#include "llvm/CodeGen/ReplaceWithVeclib.h"
|
||||
@@ -1003,6 +1004,7 @@ Error CodeGenPassBuilder<Derived, TargetMachineT>::addMachinePasses(
|
||||
|
||||
addPass(FuncletLayoutPass());
|
||||
|
||||
addPass(RemoveLoadsIntoFakeUsesPass());
|
||||
addPass(StackMapLivenessPass());
|
||||
addPass(LiveDebugValuesPass(
|
||||
getTM<TargetMachine>().Options.ShouldEmitDebugEntryValues()));
|
||||
|
||||
@@ -182,6 +182,7 @@ MACHINE_FUNCTION_PASS("reg-usage-collector", RegUsageInfoCollectorPass())
|
||||
MACHINE_FUNCTION_PASS("reg-usage-propagation", RegUsageInfoPropagationPass())
|
||||
MACHINE_FUNCTION_PASS("register-coalescer", RegisterCoalescerPass())
|
||||
MACHINE_FUNCTION_PASS("rename-independent-subregs", RenameIndependentSubregsPass())
|
||||
MACHINE_FUNCTION_PASS("remove-loads-into-fake-uses", RemoveLoadsIntoFakeUsesPass())
|
||||
MACHINE_FUNCTION_PASS("remove-redundant-debug-values", RemoveRedundantDebugValuesPass())
|
||||
MACHINE_FUNCTION_PASS("require-all-machine-function-properties",
|
||||
RequireAllMachineFunctionPropertiesPass())
|
||||
@@ -311,7 +312,6 @@ DUMMY_MACHINE_FUNCTION_PASS("ra-pbqp", RAPBQPPass)
|
||||
DUMMY_MACHINE_FUNCTION_PASS("regalloc", RegAllocPass)
|
||||
DUMMY_MACHINE_FUNCTION_PASS("regallocscoringpass", RegAllocScoringPass)
|
||||
DUMMY_MACHINE_FUNCTION_PASS("regbankselect", RegBankSelectPass)
|
||||
DUMMY_MACHINE_FUNCTION_PASS("remove-loads-into-fake-uses", RemoveLoadsIntoFakeUsesPass)
|
||||
DUMMY_MACHINE_FUNCTION_PASS("reset-machine-function", ResetMachineFunctionPass)
|
||||
DUMMY_MACHINE_FUNCTION_PASS("shrink-wrap", ShrinkWrapPass)
|
||||
DUMMY_MACHINE_FUNCTION_PASS("stack-frame-layout", StackFrameLayoutAnalysisPass)
|
||||
|
||||
@@ -117,7 +117,7 @@ void llvm::initializeCodeGen(PassRegistry &Registry) {
|
||||
initializeRegUsageInfoCollectorLegacyPass(Registry);
|
||||
initializeRegUsageInfoPropagationLegacyPass(Registry);
|
||||
initializeRegisterCoalescerLegacyPass(Registry);
|
||||
initializeRemoveLoadsIntoFakeUsesPass(Registry);
|
||||
initializeRemoveLoadsIntoFakeUsesLegacyPass(Registry);
|
||||
initializeRemoveRedundantDebugValuesLegacyPass(Registry);
|
||||
initializeRenameIndependentSubregsLegacyPass(Registry);
|
||||
initializeSafeStackLegacyPassPass(Registry);
|
||||
|
||||
@@ -22,11 +22,13 @@
|
||||
///
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "llvm/CodeGen/RemoveLoadsIntoFakeUses.h"
|
||||
#include "llvm/ADT/PostOrderIterator.h"
|
||||
#include "llvm/ADT/Statistic.h"
|
||||
#include "llvm/CodeGen/LiveRegUnits.h"
|
||||
#include "llvm/CodeGen/MachineFunction.h"
|
||||
#include "llvm/CodeGen/MachineFunctionPass.h"
|
||||
#include "llvm/CodeGen/MachinePassManager.h"
|
||||
#include "llvm/CodeGen/MachineRegisterInfo.h"
|
||||
#include "llvm/CodeGen/TargetSubtargetInfo.h"
|
||||
#include "llvm/IR/Function.h"
|
||||
@@ -41,12 +43,13 @@ using namespace llvm;
|
||||
STATISTIC(NumLoadsDeleted, "Number of dead load instructions deleted");
|
||||
STATISTIC(NumFakeUsesDeleted, "Number of FAKE_USE instructions deleted");
|
||||
|
||||
class RemoveLoadsIntoFakeUses : public MachineFunctionPass {
|
||||
class RemoveLoadsIntoFakeUsesLegacy : public MachineFunctionPass {
|
||||
public:
|
||||
static char ID;
|
||||
|
||||
RemoveLoadsIntoFakeUses() : MachineFunctionPass(ID) {
|
||||
initializeRemoveLoadsIntoFakeUsesPass(*PassRegistry::getPassRegistry());
|
||||
RemoveLoadsIntoFakeUsesLegacy() : MachineFunctionPass(ID) {
|
||||
initializeRemoveLoadsIntoFakeUsesLegacyPass(
|
||||
*PassRegistry::getPassRegistry());
|
||||
}
|
||||
|
||||
void getAnalysisUsage(AnalysisUsage &AU) const override {
|
||||
@@ -66,21 +69,45 @@ public:
|
||||
bool runOnMachineFunction(MachineFunction &MF) override;
|
||||
};
|
||||
|
||||
char RemoveLoadsIntoFakeUses::ID = 0;
|
||||
char &llvm::RemoveLoadsIntoFakeUsesID = RemoveLoadsIntoFakeUses::ID;
|
||||
struct RemoveLoadsIntoFakeUses {
|
||||
bool run(MachineFunction &MF);
|
||||
};
|
||||
|
||||
INITIALIZE_PASS_BEGIN(RemoveLoadsIntoFakeUses, DEBUG_TYPE,
|
||||
char RemoveLoadsIntoFakeUsesLegacy::ID = 0;
|
||||
char &llvm::RemoveLoadsIntoFakeUsesID = RemoveLoadsIntoFakeUsesLegacy::ID;
|
||||
|
||||
INITIALIZE_PASS_BEGIN(RemoveLoadsIntoFakeUsesLegacy, DEBUG_TYPE,
|
||||
"Remove Loads Into Fake Uses", false, false)
|
||||
INITIALIZE_PASS_END(RemoveLoadsIntoFakeUses, DEBUG_TYPE,
|
||||
INITIALIZE_PASS_END(RemoveLoadsIntoFakeUsesLegacy, DEBUG_TYPE,
|
||||
"Remove Loads Into Fake Uses", false, false)
|
||||
|
||||
bool RemoveLoadsIntoFakeUses::runOnMachineFunction(MachineFunction &MF) {
|
||||
bool RemoveLoadsIntoFakeUsesLegacy::runOnMachineFunction(MachineFunction &MF) {
|
||||
if (skipFunction(MF.getFunction()))
|
||||
return false;
|
||||
|
||||
return RemoveLoadsIntoFakeUses().run(MF);
|
||||
}
|
||||
|
||||
PreservedAnalyses
|
||||
RemoveLoadsIntoFakeUsesPass::run(MachineFunction &MF,
|
||||
MachineFunctionAnalysisManager &MFAM) {
|
||||
MFPropsModifier _(*this, MF);
|
||||
|
||||
if (!RemoveLoadsIntoFakeUses().run(MF))
|
||||
return PreservedAnalyses::all();
|
||||
|
||||
auto PA = getMachineFunctionPassPreservedAnalyses();
|
||||
PA.preserveSet<CFGAnalyses>();
|
||||
return PA;
|
||||
}
|
||||
|
||||
bool RemoveLoadsIntoFakeUses::run(MachineFunction &MF) {
|
||||
// Skip this pass if we would use VarLoc-based LDV, as there may be DBG_VALUE
|
||||
// instructions of the restored values that would become invalid.
|
||||
if (!MF.useDebugInstrRef())
|
||||
return false;
|
||||
// Only run this for functions that have fake uses.
|
||||
if (!MF.hasFakeUses() || skipFunction(MF.getFunction()))
|
||||
if (!MF.hasFakeUses())
|
||||
return false;
|
||||
|
||||
bool AnyChanges = false;
|
||||
|
||||
@@ -149,6 +149,7 @@
|
||||
#include "llvm/CodeGen/RegUsageInfoPropagate.h"
|
||||
#include "llvm/CodeGen/RegisterCoalescerPass.h"
|
||||
#include "llvm/CodeGen/RegisterUsageInfo.h"
|
||||
#include "llvm/CodeGen/RemoveLoadsIntoFakeUses.h"
|
||||
#include "llvm/CodeGen/RemoveRedundantDebugValues.h"
|
||||
#include "llvm/CodeGen/RenameIndependentSubregs.h"
|
||||
#include "llvm/CodeGen/SafeStack.h"
|
||||
|
||||
@@ -3,6 +3,8 @@
|
||||
# remove-loads-into-fake-uses pass, and that if the function does not use
|
||||
# instruction referencing then no changes are made.
|
||||
# RUN: llc %s -run-pass remove-loads-into-fake-uses -mtriple=x86_64-unknown-linux -debug-only=remove-loads-into-fake-uses 2>&1 -o - | FileCheck %s
|
||||
# RUN: llc %s -passes remove-loads-into-fake-uses -mtriple=x86_64-unknown-linux -debug-only=remove-loads-into-fake-uses 2>&1 -o - | FileCheck %s
|
||||
|
||||
# REQUIRES: asserts
|
||||
#
|
||||
## We verify that:
|
||||
|
||||
Reference in New Issue
Block a user