diff --git a/llvm/include/llvm/CodeGen/RemoveLoadsIntoFakeUses.h b/llvm/include/llvm/CodeGen/RemoveLoadsIntoFakeUses.h new file mode 100644 index 0000000000000..bbd5b8b430bf6 --- /dev/null +++ b/llvm/include/llvm/CodeGen/RemoveLoadsIntoFakeUses.h @@ -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 { +public: + PreservedAnalyses run(MachineFunction &MF, + MachineFunctionAnalysisManager &MFAM); + + MachineFunctionProperties getRequiredProperties() const { + return MachineFunctionProperties().set( + MachineFunctionProperties::Property::NoVRegs); + } +}; + +} // namespace llvm + +#endif // LLVM_CODEGEN_REMOVELOADSINTOFAKEUSES_H diff --git a/llvm/include/llvm/InitializePasses.h b/llvm/include/llvm/InitializePasses.h index 92b42cff74ff9..3242ccff7f879 100644 --- a/llvm/include/llvm/InitializePasses.h +++ b/llvm/include/llvm/InitializePasses.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 &); diff --git a/llvm/include/llvm/Passes/CodeGenPassBuilder.h b/llvm/include/llvm/Passes/CodeGenPassBuilder.h index 25ca982916ff8..6e2c2683730cc 100644 --- a/llvm/include/llvm/Passes/CodeGenPassBuilder.h +++ b/llvm/include/llvm/Passes/CodeGenPassBuilder.h @@ -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::addMachinePasses( addPass(FuncletLayoutPass()); + addPass(RemoveLoadsIntoFakeUsesPass()); addPass(StackMapLivenessPass()); addPass(LiveDebugValuesPass( getTM().Options.ShouldEmitDebugEntryValues())); diff --git a/llvm/include/llvm/Passes/MachinePassRegistry.def b/llvm/include/llvm/Passes/MachinePassRegistry.def index 66fc5601073f3..94febae16eeec 100644 --- a/llvm/include/llvm/Passes/MachinePassRegistry.def +++ b/llvm/include/llvm/Passes/MachinePassRegistry.def @@ -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) diff --git a/llvm/lib/CodeGen/CodeGen.cpp b/llvm/lib/CodeGen/CodeGen.cpp index deba0ecbe229d..b77cefca00b73 100644 --- a/llvm/lib/CodeGen/CodeGen.cpp +++ b/llvm/lib/CodeGen/CodeGen.cpp @@ -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); diff --git a/llvm/lib/CodeGen/RemoveLoadsIntoFakeUses.cpp b/llvm/lib/CodeGen/RemoveLoadsIntoFakeUses.cpp index 384a049acfe34..042fc13090ef6 100644 --- a/llvm/lib/CodeGen/RemoveLoadsIntoFakeUses.cpp +++ b/llvm/lib/CodeGen/RemoveLoadsIntoFakeUses.cpp @@ -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 @@ class RemoveLoadsIntoFakeUses : public MachineFunctionPass { bool runOnMachineFunction(MachineFunction &MF) override; }; -char RemoveLoadsIntoFakeUses::ID = 0; -char &llvm::RemoveLoadsIntoFakeUsesID = RemoveLoadsIntoFakeUses::ID; +struct RemoveLoadsIntoFakeUses { + bool run(MachineFunction &MF); +}; + +char RemoveLoadsIntoFakeUsesLegacy::ID = 0; +char &llvm::RemoveLoadsIntoFakeUsesID = RemoveLoadsIntoFakeUsesLegacy::ID; -INITIALIZE_PASS_BEGIN(RemoveLoadsIntoFakeUses, DEBUG_TYPE, +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(); + 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; diff --git a/llvm/lib/Passes/PassBuilder.cpp b/llvm/lib/Passes/PassBuilder.cpp index 15f6a7551f772..215355827337a 100644 --- a/llvm/lib/Passes/PassBuilder.cpp +++ b/llvm/lib/Passes/PassBuilder.cpp @@ -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" diff --git a/llvm/test/CodeGen/X86/fake-use-remove-loads.mir b/llvm/test/CodeGen/X86/fake-use-remove-loads.mir index 3f67f03c9a63d..aa9839d2700af 100644 --- a/llvm/test/CodeGen/X86/fake-use-remove-loads.mir +++ b/llvm/test/CodeGen/X86/fake-use-remove-loads.mir @@ -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: