[llvm] r279564 - CodeGen: Remove MachineFunctionAnalysis => Enable (Machine)ModulePasses
Richard Smith via llvm-commits
llvm-commits at lists.llvm.org
Tue Aug 23 15:37:57 PDT 2016
On Tue, Aug 23, 2016 at 3:33 PM, Matthias Braun <matze at braunis.de> wrote:
> This constructor is never executed and just there because the
> INITIALIZE_PASS stuff is used incrorrectly throughout CodeGen. But I did
> not want to fix that in the same commit...
>
Sadly, this caused a few buildbots to break. As mentioned on IRC, you could
use something like
[]()->TargetMachine& { llvm_unreachable("this constructor should never be
called"); }
instead of the dereferenced null pointer here as a temporary workaround.
>
> On Aug 23, 2016, at 3:16 PM, Richard Smith <richard at metafoo.co.uk> wrote:
>
> Reverted in r279580.
>
> On Tue, Aug 23, 2016 at 3:07 PM, Richard Smith <richard at metafoo.co.uk>
> wrote:
>
>>
>>
>> On Tue, Aug 23, 2016 at 1:58 PM, Matthias Braun via llvm-commits <
>> llvm-commits at lists.llvm.org> wrote:
>>
>>> Author: matze
>>> Date: Tue Aug 23 15:58:29 2016
>>> New Revision: 279564
>>>
>>> URL: http://llvm.org/viewvc/llvm-project?rev=279564&view=rev
>>> Log:
>>> CodeGen: Remove MachineFunctionAnalysis => Enable (Machine)ModulePasses
>>>
>>> Re-apply this commit with the deletion of a MachineFunction delegated to
>>> a separate pass to avoid use after free when doing this directly in
>>> AsmPrinter.
>>>
>>> This patch removes the MachineFunctionAnalysis. Instead we keep a
>>> map from IR Function to MachineFunction in the MachineModuleInfo.
>>>
>>> This allows the insertion of ModulePasses into the codegen pipeline
>>> without breaking it because the MachineFunctionAnalysis gets dropped
>>> before a module pass.
>>>
>>> Peak memory should stay unchanged without a ModulePass in the codegen
>>> pipeline: Previously the MachineFunction was freed at the end of a
>>> codegen
>>> function pipeline because the MachineFunctionAnalysis was dropped; With
>>> this patch the MachineFunction is freed after the AsmPrinter has
>>> finished.
>>>
>>> Differential Revision: http://reviews.llvm.org/D23736
>>>
>>> Removed:
>>> llvm/trunk/include/llvm/CodeGen/MachineFunctionAnalysis.h
>>> llvm/trunk/lib/CodeGen/MachineFunctionAnalysis.cpp
>>> Modified:
>>> llvm/trunk/include/llvm/CodeGen/MachineModuleInfo.h
>>> llvm/trunk/include/llvm/CodeGen/Passes.h
>>> llvm/trunk/include/llvm/Target/TargetMachine.h
>>> llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
>>> llvm/trunk/lib/CodeGen/CMakeLists.txt
>>> llvm/trunk/lib/CodeGen/LLVMTargetMachine.cpp
>>> llvm/trunk/lib/CodeGen/MachineFunctionPass.cpp
>>> llvm/trunk/lib/CodeGen/MachineModuleInfo.cpp
>>> llvm/trunk/lib/CodeGen/StackMapLivenessAnalysis.cpp
>>> llvm/trunk/lib/Target/AMDGPU/AMDILCFGStructurizer.cpp
>>> llvm/trunk/lib/Target/Hexagon/HexagonCommonGEP.cpp
>>> llvm/trunk/lib/Target/Hexagon/HexagonGenExtract.cpp
>>> llvm/trunk/lib/Target/Hexagon/HexagonNewValueJump.cpp
>>> llvm/trunk/lib/Target/Hexagon/HexagonOptimizeSZextends.cpp
>>> llvm/trunk/lib/Target/Hexagon/HexagonVLIWPacketizer.cpp
>>> llvm/trunk/lib/Target/NVPTX/NVPTXAllocaHoisting.cpp
>>> llvm/trunk/lib/Target/NVPTX/NVPTXGenericToNVVM.cpp
>>> llvm/trunk/lib/Target/NVPTX/NVPTXLowerAggrCopies.cpp
>>> llvm/trunk/lib/Target/NVPTX/NVPTXTargetMachine.cpp
>>> llvm/trunk/test/CodeGen/Generic/stop-after.ll
>>> llvm/trunk/test/CodeGen/X86/hidden-vis-pic.ll
>>> llvm/trunk/tools/llc/llc.cpp
>>> llvm/trunk/unittests/MI/LiveIntervalTest.cpp
>>>
>>> Removed: llvm/trunk/include/llvm/CodeGen/MachineFunctionAnalysis.h
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/
>>> CodeGen/MachineFunctionAnalysis.h?rev=279563&view=auto
>>> ============================================================
>>> ==================
>>> --- llvm/trunk/include/llvm/CodeGen/MachineFunctionAnalysis.h (original)
>>> +++ llvm/trunk/include/llvm/CodeGen/MachineFunctionAnalysis.h (removed)
>>> @@ -1,55 +0,0 @@
>>> -//===-- MachineFunctionAnalysis.h - Owner of MachineFunctions ----*-C++
>>> -*-===//
>>> -//
>>> -// The LLVM Compiler Infrastructure
>>> -//
>>> -// This file is distributed under the University of Illinois Open Source
>>> -// License. See LICENSE.TXT for details.
>>> -//
>>> -//===------------------------------------------------------
>>> ----------------===//
>>> -//
>>> -// This file declares the MachineFunctionAnalysis class.
>>> -//
>>> -//===------------------------------------------------------
>>> ----------------===//
>>> -
>>> -#ifndef LLVM_CODEGEN_MACHINEFUNCTIONANALYSIS_H
>>> -#define LLVM_CODEGEN_MACHINEFUNCTIONANALYSIS_H
>>> -
>>> -#include "llvm/Pass.h"
>>> -
>>> -namespace llvm {
>>> -
>>> -class MachineFunction;
>>> -class MachineFunctionInitializer;
>>> -class TargetMachine;
>>> -
>>> -/// MachineFunctionAnalysis - This class is a Pass that manages a
>>> -/// MachineFunction object.
>>> -struct MachineFunctionAnalysis : public FunctionPass {
>>> -private:
>>> - const TargetMachine &TM;
>>> - MachineFunction *MF;
>>> - unsigned NextFnNum;
>>> - MachineFunctionInitializer *MFInitializer;
>>> -
>>> -public:
>>> - static char ID;
>>> - explicit MachineFunctionAnalysis(const TargetMachine &tm,
>>> - MachineFunctionInitializer
>>> *MFInitializer);
>>> - ~MachineFunctionAnalysis() override;
>>> -
>>> - MachineFunction &getMF() const { return *MF; }
>>> -
>>> - const char* getPassName() const override {
>>> - return "Machine Function Analysis";
>>> - }
>>> -
>>> -private:
>>> - bool doInitialization(Module &M) override;
>>> - bool runOnFunction(Function &F) override;
>>> - void releaseMemory() override;
>>> - void getAnalysisUsage(AnalysisUsage &AU) const override;
>>> -};
>>> -
>>> -} // End llvm namespace
>>> -
>>> -#endif
>>>
>>> Modified: llvm/trunk/include/llvm/CodeGen/MachineModuleInfo.h
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/
>>> CodeGen/MachineModuleInfo.h?rev=279564&r1=279563&r2=279564&view=diff
>>> ============================================================
>>> ==================
>>> --- llvm/trunk/include/llvm/CodeGen/MachineModuleInfo.h (original)
>>> +++ llvm/trunk/include/llvm/CodeGen/MachineModuleInfo.h Tue Aug 23
>>> 15:58:29 2016
>>> @@ -54,6 +54,7 @@ class BlockAddress;
>>> class MDNode;
>>> class MMIAddrLabelMap;
>>> class MachineBasicBlock;
>>> +class MachineFunctionInitializer;
>>> class MachineFunction;
>>> class Module;
>>> class PointerType;
>>> @@ -107,6 +108,8 @@ protected:
>>> /// schemes and reformated for specific use.
>>> ///
>>> class MachineModuleInfo : public ImmutablePass {
>>> + const TargetMachine &TM;
>>> +
>>> /// Context - This is the MCContext used for the entire code
>>> generator.
>>> MCContext Context;
>>>
>>> @@ -184,6 +187,14 @@ class MachineModuleInfo : public Immutab
>>>
>>> EHPersonality PersonalityTypeCache;
>>>
>>> + MachineFunctionInitializer *MFInitializer;
>>> + /// Maps IR Functions to their corresponding MachineFunctions.
>>> + DenseMap<const Function*, std::unique_ptr<MachineFunction>>
>>> MachineFunctions;
>>> + /// Next unique number available for a MachineFunction.
>>> + unsigned NextFnNum = 0;
>>> + const Function *LastRequest = nullptr; ///< Used for shortcut/cache.
>>> + MachineFunction *LastResult = nullptr; ///< Used for shortcut/cache.
>>> +
>>> public:
>>> static char ID; // Pass identification, replacement for typeid
>>>
>>> @@ -202,8 +213,9 @@ public:
>>>
>>> MachineModuleInfo(); // DUMMY CONSTRUCTOR, DO NOT CALL.
>>> // Real constructor.
>>> - MachineModuleInfo(const MCAsmInfo &MAI, const MCRegisterInfo &MRI,
>>> - const MCObjectFileInfo *MOFI);
>>> + MachineModuleInfo(const TargetMachine &TM, const MCAsmInfo &MAI,
>>> + const MCRegisterInfo &MRI, const MCObjectFileInfo
>>> *MOFI,
>>> + MachineFunctionInitializer *MFInitializer =
>>> nullptr);
>>> ~MachineModuleInfo() override;
>>>
>>> // Initialization and Finalization
>>> @@ -220,6 +232,15 @@ public:
>>> void setModule(const Module *M) { TheModule = M; }
>>> const Module *getModule() const { return TheModule; }
>>>
>>> + /// Returns the MachineFunction constructed for the IR function \p F.
>>> + /// Creates a new MachineFunction and runs the
>>> MachineFunctionInitializer
>>> + /// if none exists yet.
>>> + MachineFunction &getMachineFunction(const Function &F);
>>> +
>>> + /// \brief Delete the MachineFunction \p MF and reset the link in the
>>> IR
>>> + /// Function to Machine Function map.
>>> + void deleteMachineFunctionFor(Function &F);
>>> +
>>> /// getInfo - Keep track of various per-function pieces of
>>> information for
>>> /// backends that would like to do so.
>>> ///
>>>
>>> Modified: llvm/trunk/include/llvm/CodeGen/Passes.h
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/
>>> CodeGen/Passes.h?rev=279564&r1=279563&r2=279564&view=diff
>>> ============================================================
>>> ==================
>>> --- llvm/trunk/include/llvm/CodeGen/Passes.h (original)
>>> +++ llvm/trunk/include/llvm/CodeGen/Passes.h Tue Aug 23 15:58:29 2016
>>> @@ -377,6 +377,9 @@ namespace llvm {
>>>
>>> /// This pass performs software pipelining on machine instructions.
>>> extern char &MachinePipelinerID;
>>> +
>>> + /// This pass frees the memory occupied by the MachineFunction.
>>> + FunctionPass *createFreeMachineFunctionPass();
>>> } // End llvm namespace
>>>
>>> /// Target machine pass initializer for passes with dependencies. Use
>>> with
>>>
>>> Modified: llvm/trunk/include/llvm/Target/TargetMachine.h
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/
>>> Target/TargetMachine.h?rev=279564&r1=279563&r2=279564&view=diff
>>> ============================================================
>>> ==================
>>> --- llvm/trunk/include/llvm/Target/TargetMachine.h (original)
>>> +++ llvm/trunk/include/llvm/Target/TargetMachine.h Tue Aug 23 15:58:29
>>> 2016
>>> @@ -314,11 +314,8 @@ public:
>>> bool DisableVerify = true) override;
>>>
>>> /// Add MachineModuleInfo pass to pass manager.
>>> - MachineModuleInfo &addMachineModuleInfo(PassManagerBase &PM) const;
>>> -
>>> - /// Add MachineFunctionAnalysis pass to pass manager.
>>> - void addMachineFunctionAnalysis(PassManagerBase &PM,
>>> - MachineFunctionInitializer *MFInitializer) const;
>>> + MachineModuleInfo &addMachineModuleInfo(PassManagerBase &PM,
>>> + MachineFunctionInitializer *MFI = nullptr) const;
>>> };
>>>
>>> } // End llvm namespace
>>>
>>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/A
>>> smPrinter/AsmPrinter.cpp?rev=279564&r1=279563&r2=279564&view=diff
>>> ============================================================
>>> ==================
>>> --- llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp (original)
>>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp Tue Aug 23
>>> 15:58:29 2016
>>> @@ -2571,8 +2571,6 @@ isBlockOnlyReachableByFallthrough(const
>>> return true;
>>> }
>>>
>>> -
>>> -
>>> GCMetadataPrinter *AsmPrinter::GetOrCreateGCPrinter(GCStrategy &S) {
>>> if (!S.usesMetadata())
>>> return nullptr;
>>>
>>> Modified: llvm/trunk/lib/CodeGen/CMakeLists.txt
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/C
>>> MakeLists.txt?rev=279564&r1=279563&r2=279564&view=diff
>>> ============================================================
>>> ==================
>>> --- llvm/trunk/lib/CodeGen/CMakeLists.txt (original)
>>> +++ llvm/trunk/lib/CodeGen/CMakeLists.txt Tue Aug 23 15:58:29 2016
>>> @@ -59,7 +59,6 @@ add_llvm_library(LLVMCodeGen
>>> MachineCSE.cpp
>>> MachineDominanceFrontier.cpp
>>> MachineDominators.cpp
>>> - MachineFunctionAnalysis.cpp
>>> MachineFunction.cpp
>>> MachineFunctionPass.cpp
>>> MachineFunctionPrinterPass.cpp
>>>
>>> Modified: llvm/trunk/lib/CodeGen/LLVMTargetMachine.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/L
>>> LVMTargetMachine.cpp?rev=279564&r1=279563&r2=279564&view=diff
>>> ============================================================
>>> ==================
>>> --- llvm/trunk/lib/CodeGen/LLVMTargetMachine.cpp (original)
>>> +++ llvm/trunk/lib/CodeGen/LLVMTargetMachine.cpp Tue Aug 23 15:58:29
>>> 2016
>>> @@ -15,7 +15,6 @@
>>> #include "llvm/Analysis/Passes.h"
>>> #include "llvm/CodeGen/AsmPrinter.h"
>>> #include "llvm/CodeGen/BasicTTIImpl.h"
>>> -#include "llvm/CodeGen/MachineFunctionAnalysis.h"
>>> #include "llvm/CodeGen/MachineModuleInfo.h"
>>> #include "llvm/CodeGen/Passes.h"
>>> #include "llvm/CodeGen/TargetPassConfig.h"
>>> @@ -103,19 +102,15 @@ TargetIRAnalysis LLVMTargetMachine::getT
>>> }
>>>
>>> MachineModuleInfo &
>>> -LLVMTargetMachine::addMachineModuleInfo(PassManagerBase &PM) const {
>>> - MachineModuleInfo *MMI = new MachineModuleInfo(*getMCAsmInfo(),
>>> +LLVMTargetMachine::addMachineModuleInfo(PassManagerBase &PM,
>>> + MachineFunctionInitializer
>>> *MFI) const {
>>> + MachineModuleInfo *MMI = new MachineModuleInfo(*this, *getMCAsmInfo(),
>>> *getMCRegisterInfo(),
>>> - getObjFileLowering());
>>> + getObjFileLowering(),
>>> MFI);
>>> PM.add(MMI);
>>> return *MMI;
>>> }
>>>
>>> -void LLVMTargetMachine::addMachineFunctionAnalysis(PassManagerBase &PM,
>>> - MachineFunctionInitializer *MFInitializer) const {
>>> - PM.add(new MachineFunctionAnalysis(*this, MFInitializer));
>>> -}
>>> -
>>> /// addPassesToX helper drives creation and initialization of
>>> TargetPassConfig.
>>> static MCContext *
>>> addPassesToGenerateCode(LLVMTargetMachine *TM, PassManagerBase &PM,
>>> @@ -150,8 +145,7 @@ addPassesToGenerateCode(LLVMTargetMachin
>>>
>>> PassConfig->addISelPrepare();
>>>
>>> - MachineModuleInfo &MMI = TM->addMachineModuleInfo(PM);
>>> - TM->addMachineFunctionAnalysis(PM, MFInitializer);
>>> + MachineModuleInfo &MMI = TM->addMachineModuleInfo(PM, MFInitializer);
>>>
>>> // Enable FastISel with -fast, but allow that to be overridden.
>>> TM->setO0WantsFastISel(EnableFastISelOption != cl::BOU_FALSE);
>>> @@ -273,6 +267,7 @@ bool LLVMTargetMachine::addPassesToEmitF
>>> return true;
>>>
>>> PM.add(Printer);
>>> + PM.add(createFreeMachineFunctionPass());
>>>
>>> return false;
>>> }
>>> @@ -319,6 +314,7 @@ bool LLVMTargetMachine::addPassesToEmitM
>>> return true;
>>>
>>> PM.add(Printer);
>>> + PM.add(createFreeMachineFunctionPass());
>>>
>>> return false; // success!
>>> }
>>>
>>> Removed: llvm/trunk/lib/CodeGen/MachineFunctionAnalysis.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/M
>>> achineFunctionAnalysis.cpp?rev=279563&view=auto
>>> ============================================================
>>> ==================
>>> --- llvm/trunk/lib/CodeGen/MachineFunctionAnalysis.cpp (original)
>>> +++ llvm/trunk/lib/CodeGen/MachineFunctionAnalysis.cpp (removed)
>>> @@ -1,62 +0,0 @@
>>> -//===-- MachineFunctionAnalysis.cpp ------------------------------
>>> ---------===//
>>> -//
>>> -// The LLVM Compiler Infrastructure
>>> -//
>>> -// This file is distributed under the University of Illinois Open Source
>>> -// License. See LICENSE.TXT for details.
>>> -//
>>> -//===------------------------------------------------------
>>> ----------------===//
>>> -//
>>> -// This file contains the definitions of the MachineFunctionAnalysis
>>> members.
>>> -//
>>> -//===------------------------------------------------------
>>> ----------------===//
>>> -
>>> -#include "llvm/CodeGen/MachineFunctionAnalysis.h"
>>> -#include "llvm/CodeGen/GCMetadata.h"
>>> -#include "llvm/CodeGen/MachineFunction.h"
>>> -#include "llvm/CodeGen/MachineModuleInfo.h"
>>> -#include "llvm/CodeGen/MachineFunctionInitializer.h"
>>> -using namespace llvm;
>>> -
>>> -char MachineFunctionAnalysis::ID = 0;
>>> -
>>> -MachineFunctionAnalysis::MachineFunctionAnalysis(
>>> - const TargetMachine &tm, MachineFunctionInitializer *MFInitializer)
>>> - : FunctionPass(ID), TM(tm), MF(nullptr),
>>> MFInitializer(MFInitializer) {
>>> - initializeMachineModuleInfoPass(*PassRegistry::getPassRegistry());
>>> -}
>>> -
>>> -MachineFunctionAnalysis::~MachineFunctionAnalysis() {
>>> - releaseMemory();
>>> - assert(!MF && "MachineFunctionAnalysis left initialized!");
>>> -}
>>> -
>>> -void MachineFunctionAnalysis::getAnalysisUsage(AnalysisUsage &AU)
>>> const {
>>> - AU.setPreservesAll();
>>> - AU.addRequired<MachineModuleInfo>();
>>> -}
>>> -
>>> -bool MachineFunctionAnalysis::doInitialization(Module &M) {
>>> - MachineModuleInfo *MMI = getAnalysisIfAvailable<MachineModuleInfo>();
>>> - assert(MMI && "MMI not around yet??");
>>> - MMI->setModule(&M);
>>> - NextFnNum = 0;
>>> - return false;
>>> -}
>>> -
>>> -
>>> -bool MachineFunctionAnalysis::runOnFunction(Function &F) {
>>> - assert(!MF && "MachineFunctionAnalysis already initialized!");
>>> - MF = new MachineFunction(&F, TM, NextFnNum++,
>>> - getAnalysis<MachineModuleInfo>());
>>> - if (MFInitializer) {
>>> - if (MFInitializer->initializeMachineFunction(*MF))
>>> - report_fatal_error("Unable to initialize machine function");
>>> - }
>>> - return false;
>>> -}
>>> -
>>> -void MachineFunctionAnalysis::releaseMemory() {
>>> - delete MF;
>>> - MF = nullptr;
>>> -}
>>>
>>> Modified: llvm/trunk/lib/CodeGen/MachineFunctionPass.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/M
>>> achineFunctionPass.cpp?rev=279564&r1=279563&r2=279564&view=diff
>>> ============================================================
>>> ==================
>>> --- llvm/trunk/lib/CodeGen/MachineFunctionPass.cpp (original)
>>> +++ llvm/trunk/lib/CodeGen/MachineFunctionPass.cpp Tue Aug 23 15:58:29
>>> 2016
>>> @@ -22,7 +22,7 @@
>>> #include "llvm/Analysis/ScalarEvolution.h"
>>> #include "llvm/Analysis/ScalarEvolutionAliasAnalysis.h"
>>> #include "llvm/CodeGen/MachineFunction.h"
>>> -#include "llvm/CodeGen/MachineFunctionAnalysis.h"
>>> +#include "llvm/CodeGen/MachineModuleInfo.h"
>>> #include "llvm/CodeGen/Passes.h"
>>> #include "llvm/CodeGen/StackProtector.h"
>>> #include "llvm/IR/Dominators.h"
>>> @@ -41,7 +41,9 @@ bool MachineFunctionPass::runOnFunction(
>>> if (F.hasAvailableExternallyLinkage())
>>> return false;
>>>
>>> - MachineFunction &MF = getAnalysis<MachineFunctionAnalysis>().getMF();
>>> + MachineModuleInfo &MMI = getAnalysis<MachineModuleInfo>();
>>> + MachineFunction &MF = MMI.getMachineFunction(F);
>>> +
>>> MachineFunctionProperties &MFProps = MF.getProperties();
>>>
>>> #ifndef NDEBUG
>>> @@ -65,8 +67,8 @@ bool MachineFunctionPass::runOnFunction(
>>> }
>>>
>>> void MachineFunctionPass::getAnalysisUsage(AnalysisUsage &AU) const {
>>> - AU.addRequired<MachineFunctionAnalysis>();
>>> - AU.addPreserved<MachineFunctionAnalysis>();
>>> + AU.addRequired<MachineModuleInfo>();
>>> + AU.addPreserved<MachineModuleInfo>();
>>>
>>> // MachineFunctionPass preserves all LLVM IR passes, but there's no
>>> // high-level way to express this. Instead, just list a bunch of
>>>
>>> Modified: llvm/trunk/lib/CodeGen/MachineModuleInfo.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/M
>>> achineModuleInfo.cpp?rev=279564&r1=279563&r2=279564&view=diff
>>> ============================================================
>>> ==================
>>> --- llvm/trunk/lib/CodeGen/MachineModuleInfo.cpp (original)
>>> +++ llvm/trunk/lib/CodeGen/MachineModuleInfo.cpp Tue Aug 23 15:58:29
>>> 2016
>>> @@ -13,6 +13,7 @@
>>> #include "llvm/Analysis/EHPersonalities.h"
>>> #include "llvm/Analysis/ValueTracking.h"
>>> #include "llvm/CodeGen/MachineFunction.h"
>>> +#include "llvm/CodeGen/MachineFunctionInitializer.h"
>>> #include "llvm/CodeGen/MachineFunctionPass.h"
>>> #include "llvm/CodeGen/Passes.h"
>>> #include "llvm/IR/Constants.h"
>>> @@ -186,15 +187,19 @@ void MMIAddrLabelMapCallbackPtr::allUses
>>>
>>> //===------------------------------------------------------
>>> ----------------===//
>>>
>>> -MachineModuleInfo::MachineModuleInfo(const MCAsmInfo &MAI,
>>> +MachineModuleInfo::MachineModuleInfo(const TargetMachine &TM,
>>> + const MCAsmInfo &MAI,
>>> const MCRegisterInfo &MRI,
>>> - const MCObjectFileInfo *MOFI)
>>> - : ImmutablePass(ID), Context(&MAI, &MRI, MOFI, nullptr, false) {
>>> + const MCObjectFileInfo *MOFI,
>>> + MachineFunctionInitializer *MFI)
>>> + : ImmutablePass(ID), TM(TM), Context(&MAI, &MRI, MOFI, nullptr,
>>> false),
>>> + MFInitializer(MFI) {
>>> initializeMachineModuleInfoPass(*PassRegistry::getPassRegistry());
>>> }
>>>
>>> MachineModuleInfo::MachineModuleInfo()
>>> - : ImmutablePass(ID), Context(nullptr, nullptr, nullptr) {
>>> + : ImmutablePass(ID), TM(*((TargetMachine*)nullptr)),
>>>
>>
>> This (binding a reference to a dereferenced null pointer) is not OK; it
>> breaks -Werror builds, and LLVM will optimize on the assumption that this
>> is undefined behavior.
>>
>>
>>> + Context(nullptr, nullptr, nullptr) {
>>> llvm_unreachable("This MachineModuleInfo constructor should never be
>>> called, "
>>> "MMI should always be explicitly constructed by "
>>> "LLVMTargetMachine");
>>> @@ -213,7 +218,7 @@ bool MachineModuleInfo::doInitialization
>>> DbgInfoAvailable = UsesVAFloatArgument = UsesMorestackAddr = false;
>>> PersonalityTypeCache = EHPersonality::Unknown;
>>> AddrLabelSymbols = nullptr;
>>> - TheModule = nullptr;
>>> + TheModule = &M;
>>>
>>> return false;
>>> }
>>> @@ -461,3 +466,63 @@ try_next:;
>>> FilterIds.push_back(0); // terminator
>>> return FilterID;
>>> }
>>> +
>>> +MachineFunction &MachineModuleInfo::getMachineFunction(const Function
>>> &F) {
>>> + // Shortcut for the common case where a sequence of
>>> MachineFunctionPasses
>>> + // all query for the same Function.
>>> + if (LastRequest == &F)
>>> + return *LastResult;
>>> +
>>> + auto I = MachineFunctions.insert(
>>> + std::make_pair(&F, std::unique_ptr<MachineFunction>()));
>>> + MachineFunction *MF;
>>> + if (I.second) {
>>> + // No pre-existing machine function, create a new one.
>>> + MF = new MachineFunction(&F, TM, NextFnNum++, *this);
>>> + // Update the set entry.
>>> + I.first->second.reset(MF);
>>> +
>>> + if (MFInitializer)
>>> + if (MFInitializer->initializeMachineFunction(*MF))
>>> + report_fatal_error("Unable to initialize machine function");
>>> + } else {
>>> + MF = I.first->second.get();
>>> + }
>>> +
>>> + LastRequest = &F;
>>> + LastResult = MF;
>>> + return *MF;
>>> +}
>>> +
>>> +void MachineModuleInfo::deleteMachineFunctionFor(Function &F) {
>>> + MachineFunctions.erase(&F);
>>> + LastRequest = nullptr;
>>> + LastResult = nullptr;
>>> +}
>>> +
>>> +namespace {
>>> +/// This pass frees the MachineFunction object associated with a
>>> Function.
>>> +class FreeMachineFunction : public FunctionPass {
>>> +public:
>>> + static char ID;
>>> + FreeMachineFunction() : FunctionPass(ID) {}
>>> +
>>> + void getAnalysisUsage(AnalysisUsage &AU) const override {
>>> + AU.addRequired<MachineModuleInfo>();
>>> + AU.addPreserved<MachineModuleInfo>();
>>> + }
>>> +
>>> + bool runOnFunction(Function &F) override {
>>> + MachineModuleInfo &MMI = getAnalysis<MachineModuleInfo>();
>>> + MMI.deleteMachineFunctionFor(F);
>>> + return true;
>>> + }
>>> +};
>>> +char FreeMachineFunction::ID;
>>> +} // end anonymous namespace
>>> +
>>> +namespace llvm {
>>> +FunctionPass *createFreeMachineFunctionPass() {
>>> + return new FreeMachineFunction();
>>> +}
>>> +} // end namespace llvm
>>>
>>> Modified: llvm/trunk/lib/CodeGen/StackMapLivenessAnalysis.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/S
>>> tackMapLivenessAnalysis.cpp?rev=279564&r1=279563&r2=279564&view=diff
>>> ============================================================
>>> ==================
>>> --- llvm/trunk/lib/CodeGen/StackMapLivenessAnalysis.cpp (original)
>>> +++ llvm/trunk/lib/CodeGen/StackMapLivenessAnalysis.cpp Tue Aug 23
>>> 15:58:29 2016
>>> @@ -17,7 +17,6 @@
>>> #include "llvm/CodeGen/LivePhysRegs.h"
>>> #include "llvm/CodeGen/MachineFrameInfo.h"
>>> #include "llvm/CodeGen/MachineFunction.h"
>>> -#include "llvm/CodeGen/MachineFunctionAnalysis.h"
>>> #include "llvm/CodeGen/MachineFunctionPass.h"
>>> #include "llvm/CodeGen/Passes.h"
>>> #include "llvm/Support/CommandLine.h"
>>>
>>> Modified: llvm/trunk/lib/Target/AMDGPU/AMDILCFGStructurizer.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AM
>>> DGPU/AMDILCFGStructurizer.cpp?rev=279564&r1=279563&r2=279564&view=diff
>>> ============================================================
>>> ==================
>>> --- llvm/trunk/lib/Target/AMDGPU/AMDILCFGStructurizer.cpp (original)
>>> +++ llvm/trunk/lib/Target/AMDGPU/AMDILCFGStructurizer.cpp Tue Aug 23
>>> 15:58:29 2016
>>> @@ -18,7 +18,6 @@
>>> #include "llvm/ADT/Statistic.h"
>>> #include "llvm/CodeGen/MachineDominators.h"
>>> #include "llvm/CodeGen/MachineFunction.h"
>>> -#include "llvm/CodeGen/MachineFunctionAnalysis.h"
>>> #include "llvm/CodeGen/MachineFunctionPass.h"
>>> #include "llvm/CodeGen/MachineInstrBuilder.h"
>>> #include "llvm/CodeGen/MachineJumpTableInfo.h"
>>> @@ -144,11 +143,10 @@ public:
>>> }
>>>
>>> void getAnalysisUsage(AnalysisUsage &AU) const override {
>>> - AU.addPreserved<MachineFunctionAnalysis>();
>>> - AU.addRequired<MachineFunctionAnalysis>();
>>> AU.addRequired<MachineDominatorTree>();
>>> AU.addRequired<MachinePostDominatorTree>();
>>> AU.addRequired<MachineLoopInfo>();
>>> + MachineFunctionPass::getAnalysisUsage(AU);
>>> }
>>>
>>> /// Perform the CFG structurization
>>>
>>> Modified: llvm/trunk/lib/Target/Hexagon/HexagonCommonGEP.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/He
>>> xagon/HexagonCommonGEP.cpp?rev=279564&r1=279563&r2=279564&view=diff
>>> ============================================================
>>> ==================
>>> --- llvm/trunk/lib/Target/Hexagon/HexagonCommonGEP.cpp (original)
>>> +++ llvm/trunk/lib/Target/Hexagon/HexagonCommonGEP.cpp Tue Aug 23
>>> 15:58:29 2016
>>> @@ -14,7 +14,6 @@
>>> #include "llvm/ADT/STLExtras.h"
>>> #include "llvm/Analysis/LoopInfo.h"
>>> #include "llvm/Analysis/PostDominators.h"
>>> -#include "llvm/CodeGen/MachineFunctionAnalysis.h"
>>> #include "llvm/IR/Constants.h"
>>> #include "llvm/IR/Dominators.h"
>>> #include "llvm/IR/Function.h"
>>>
>>> Modified: llvm/trunk/lib/Target/Hexagon/HexagonGenExtract.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/He
>>> xagon/HexagonGenExtract.cpp?rev=279564&r1=279563&r2=279564&view=diff
>>> ============================================================
>>> ==================
>>> --- llvm/trunk/lib/Target/Hexagon/HexagonGenExtract.cpp (original)
>>> +++ llvm/trunk/lib/Target/Hexagon/HexagonGenExtract.cpp Tue Aug 23
>>> 15:58:29 2016
>>> @@ -8,7 +8,6 @@
>>> //===------------------------------------------------------
>>> ----------------===//
>>>
>>> #include "llvm/ADT/STLExtras.h"
>>> -#include "llvm/CodeGen/MachineFunctionAnalysis.h"
>>> #include "llvm/IR/Constants.h"
>>> #include "llvm/IR/Dominators.h"
>>> #include "llvm/IR/Function.h"
>>> @@ -60,7 +59,6 @@ namespace {
>>> virtual void getAnalysisUsage(AnalysisUsage &AU) const override {
>>> AU.addRequired<DominatorTreeWrapperPass>();
>>> AU.addPreserved<DominatorTreeWrapperPass>();
>>> - AU.addPreserved<MachineFunctionAnalysis>();
>>> FunctionPass::getAnalysisUsage(AU);
>>> }
>>> private:
>>>
>>> Modified: llvm/trunk/lib/Target/Hexagon/HexagonNewValueJump.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/He
>>> xagon/HexagonNewValueJump.cpp?rev=279564&r1=279563&r2=279564&view=diff
>>> ============================================================
>>> ==================
>>> --- llvm/trunk/lib/Target/Hexagon/HexagonNewValueJump.cpp (original)
>>> +++ llvm/trunk/lib/Target/Hexagon/HexagonNewValueJump.cpp Tue Aug 23
>>> 15:58:29 2016
>>> @@ -29,7 +29,6 @@
>>> #include "HexagonTargetMachine.h"
>>> #include "llvm/ADT/Statistic.h"
>>> #include "llvm/CodeGen/LiveVariables.h"
>>> -#include "llvm/CodeGen/MachineFunctionAnalysis.h"
>>> #include "llvm/CodeGen/MachineFunctionPass.h"
>>> #include "llvm/CodeGen/MachineInstrBuilder.h"
>>> #include "llvm/CodeGen/MachineRegisterInfo.h"
>>>
>>> Modified: llvm/trunk/lib/Target/Hexagon/HexagonOptimizeSZextends.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/He
>>> xagon/HexagonOptimizeSZextends.cpp?rev=279564&r1=279563&r2=2
>>> 79564&view=diff
>>> ============================================================
>>> ==================
>>> --- llvm/trunk/lib/Target/Hexagon/HexagonOptimizeSZextends.cpp
>>> (original)
>>> +++ llvm/trunk/lib/Target/Hexagon/HexagonOptimizeSZextends.cpp Tue Aug
>>> 23 15:58:29 2016
>>> @@ -12,7 +12,6 @@
>>> //
>>> //===------------------------------------------------------
>>> ----------------===//
>>>
>>> -#include "llvm/CodeGen/MachineFunctionAnalysis.h"
>>> #include "llvm/CodeGen/StackProtector.h"
>>> #include "llvm/IR/Function.h"
>>> #include "llvm/IR/Instructions.h"
>>> @@ -43,8 +42,6 @@ namespace {
>>> }
>>>
>>> void getAnalysisUsage(AnalysisUsage &AU) const override {
>>> - AU.addRequired<MachineFunctionAnalysis>();
>>> - AU.addPreserved<MachineFunctionAnalysis>();
>>> AU.addPreserved<StackProtector>();
>>> FunctionPass::getAnalysisUsage(AU);
>>> }
>>>
>>> Modified: llvm/trunk/lib/Target/Hexagon/HexagonVLIWPacketizer.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/He
>>> xagon/HexagonVLIWPacketizer.cpp?rev=279564&r1=279563&r2=279564&view=diff
>>> ============================================================
>>> ==================
>>> --- llvm/trunk/lib/Target/Hexagon/HexagonVLIWPacketizer.cpp (original)
>>> +++ llvm/trunk/lib/Target/Hexagon/HexagonVLIWPacketizer.cpp Tue Aug 23
>>> 15:58:29 2016
>>> @@ -22,7 +22,6 @@
>>> #include "HexagonVLIWPacketizer.h"
>>> #include "llvm/Analysis/AliasAnalysis.h"
>>> #include "llvm/CodeGen/MachineDominators.h"
>>> -#include "llvm/CodeGen/MachineFunctionAnalysis.h"
>>> #include "llvm/CodeGen/MachineFunctionPass.h"
>>> #include "llvm/CodeGen/MachineLoopInfo.h"
>>> #include "llvm/CodeGen/MachineRegisterInfo.h"
>>>
>>> Modified: llvm/trunk/lib/Target/NVPTX/NVPTXAllocaHoisting.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/NV
>>> PTX/NVPTXAllocaHoisting.cpp?rev=279564&r1=279563&r2=279564&view=diff
>>> ============================================================
>>> ==================
>>> --- llvm/trunk/lib/Target/NVPTX/NVPTXAllocaHoisting.cpp (original)
>>> +++ llvm/trunk/lib/Target/NVPTX/NVPTXAllocaHoisting.cpp Tue Aug 23
>>> 15:58:29 2016
>>> @@ -12,7 +12,6 @@
>>> //===------------------------------------------------------
>>> ----------------===//
>>>
>>> #include "NVPTXAllocaHoisting.h"
>>> -#include "llvm/CodeGen/MachineFunctionAnalysis.h"
>>> #include "llvm/CodeGen/StackProtector.h"
>>> #include "llvm/IR/Constants.h"
>>> #include "llvm/IR/Function.h"
>>> @@ -28,7 +27,6 @@ public:
>>> NVPTXAllocaHoisting() : FunctionPass(ID) {}
>>>
>>> void getAnalysisUsage(AnalysisUsage &AU) const override {
>>> - AU.addPreserved<MachineFunctionAnalysis>();
>>> AU.addPreserved<StackProtector>();
>>> }
>>>
>>>
>>> Modified: llvm/trunk/lib/Target/NVPTX/NVPTXGenericToNVVM.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/NV
>>> PTX/NVPTXGenericToNVVM.cpp?rev=279564&r1=279563&r2=279564&view=diff
>>> ============================================================
>>> ==================
>>> --- llvm/trunk/lib/Target/NVPTX/NVPTXGenericToNVVM.cpp (original)
>>> +++ llvm/trunk/lib/Target/NVPTX/NVPTXGenericToNVVM.cpp Tue Aug 23
>>> 15:58:29 2016
>>> @@ -15,7 +15,6 @@
>>> #include "NVPTX.h"
>>> #include "MCTargetDesc/NVPTXBaseInfo.h"
>>> #include "NVPTXUtilities.h"
>>> -#include "llvm/CodeGen/MachineFunctionAnalysis.h"
>>> #include "llvm/CodeGen/ValueTypes.h"
>>> #include "llvm/IR/Constants.h"
>>> #include "llvm/IR/DerivedTypes.h"
>>>
>>> Modified: llvm/trunk/lib/Target/NVPTX/NVPTXLowerAggrCopies.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/NV
>>> PTX/NVPTXLowerAggrCopies.cpp?rev=279564&r1=279563&r2=279564&view=diff
>>> ============================================================
>>> ==================
>>> --- llvm/trunk/lib/Target/NVPTX/NVPTXLowerAggrCopies.cpp (original)
>>> +++ llvm/trunk/lib/Target/NVPTX/NVPTXLowerAggrCopies.cpp Tue Aug 23
>>> 15:58:29 2016
>>> @@ -14,7 +14,6 @@
>>> //===------------------------------------------------------
>>> ----------------===//
>>>
>>> #include "NVPTXLowerAggrCopies.h"
>>> -#include "llvm/CodeGen/MachineFunctionAnalysis.h"
>>> #include "llvm/CodeGen/StackProtector.h"
>>> #include "llvm/IR/Constants.h"
>>> #include "llvm/IR/DataLayout.h"
>>> @@ -41,7 +40,6 @@ struct NVPTXLowerAggrCopies : public Fun
>>> NVPTXLowerAggrCopies() : FunctionPass(ID) {}
>>>
>>> void getAnalysisUsage(AnalysisUsage &AU) const override {
>>> - AU.addPreserved<MachineFunctionAnalysis>();
>>> AU.addPreserved<StackProtector>();
>>> }
>>>
>>>
>>> Modified: llvm/trunk/lib/Target/NVPTX/NVPTXTargetMachine.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/NV
>>> PTX/NVPTXTargetMachine.cpp?rev=279564&r1=279563&r2=279564&view=diff
>>> ============================================================
>>> ==================
>>> --- llvm/trunk/lib/Target/NVPTX/NVPTXTargetMachine.cpp (original)
>>> +++ llvm/trunk/lib/Target/NVPTX/NVPTXTargetMachine.cpp Tue Aug 23
>>> 15:58:29 2016
>>> @@ -20,7 +20,6 @@
>>> #include "NVPTXTargetTransformInfo.h"
>>> #include "llvm/Analysis/Passes.h"
>>> #include "llvm/CodeGen/AsmPrinter.h"
>>> -#include "llvm/CodeGen/MachineFunctionAnalysis.h"
>>> #include "llvm/CodeGen/MachineModuleInfo.h"
>>> #include "llvm/CodeGen/Passes.h"
>>> #include "llvm/CodeGen/TargetPassConfig.h"
>>>
>>> Modified: llvm/trunk/test/CodeGen/Generic/stop-after.ll
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/
>>> Generic/stop-after.ll?rev=279564&r1=279563&r2=279564&view=diff
>>> ============================================================
>>> ==================
>>> --- llvm/trunk/test/CodeGen/Generic/stop-after.ll (original)
>>> +++ llvm/trunk/test/CodeGen/Generic/stop-after.ll Tue Aug 23 15:58:29
>>> 2016
>>> @@ -3,7 +3,6 @@
>>>
>>> ; STOP: -loop-reduce
>>> ; STOP: Loop Strength Reduction
>>> -; STOP-NEXT: Machine Function Analysis
>>> ; STOP-NEXT: MIR Printing Pass
>>>
>>> ; START: -machine-branch-prob -pre-isel-intrinsic-lowering
>>>
>>> Modified: llvm/trunk/test/CodeGen/X86/hidden-vis-pic.ll
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/
>>> X86/hidden-vis-pic.ll?rev=279564&r1=279563&r2=279564&view=diff
>>> ============================================================
>>> ==================
>>> --- llvm/trunk/test/CodeGen/X86/hidden-vis-pic.ll (original)
>>> +++ llvm/trunk/test/CodeGen/X86/hidden-vis-pic.ll Tue Aug 23 15:58:29
>>> 2016
>>> @@ -17,7 +17,7 @@ entry:
>>>
>>> ; This must use movl of the stub, not an lea, since the function isn't
>>> being
>>> ; emitted here.
>>> -; CHECK: movl L__ZNSbIcED1Ev$non_lazy_ptr-L1$pb(
>>> +; CHECK: movl L__ZNSbIcED1Ev$non_lazy_ptr-L0$pb(
>>>
>>>
>>>
>>>
>>> Modified: llvm/trunk/tools/llc/llc.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llc/llc
>>> .cpp?rev=279564&r1=279563&r2=279564&view=diff
>>> ============================================================
>>> ==================
>>> --- llvm/trunk/tools/llc/llc.cpp (original)
>>> +++ llvm/trunk/tools/llc/llc.cpp Tue Aug 23 15:58:29 2016
>>> @@ -450,8 +450,7 @@ static int compileModule(char **argv, LL
>>> LLVMTargetMachine &LLVMTM = static_cast<LLVMTargetMachine&
>>> >(*Target);
>>> TargetPassConfig &TPC = *LLVMTM.createPassConfig(PM);
>>> PM.add(&TPC);
>>> - LLVMTM.addMachineModuleInfo(PM);
>>> - LLVMTM.addMachineFunctionAnalysis(PM, MIR.get());
>>> + LLVMTM.addMachineModuleInfo(PM, MIR.get());
>>> TPC.printAndVerify("");
>>>
>>> for (const std::string &RunPassName : *RunPassNames) {
>>>
>>> Modified: llvm/trunk/unittests/MI/LiveIntervalTest.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/MI/
>>> LiveIntervalTest.cpp?rev=279564&r1=279563&r2=279564&view=diff
>>> ============================================================
>>> ==================
>>> --- llvm/trunk/unittests/MI/LiveIntervalTest.cpp (original)
>>> +++ llvm/trunk/unittests/MI/LiveIntervalTest.cpp Tue Aug 23 15:58:29
>>> 2016
>>> @@ -70,8 +70,7 @@ std::unique_ptr<Module> parseMIR(LLVMCon
>>> return nullptr;
>>>
>>> const LLVMTargetMachine &LLVMTM = static_cast<const
>>> LLVMTargetMachine&>(TM);
>>> - LLVMTM.addMachineModuleInfo(PM);
>>> - LLVMTM.addMachineFunctionAnalysis(PM, MIR.get());
>>> + LLVMTM.addMachineModuleInfo(PM, MIR.get());
>>>
>>> return M;
>>> }
>>>
>>>
>>> _______________________________________________
>>> llvm-commits mailing list
>>> llvm-commits at lists.llvm.org
>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>>
>>
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160823/b78c8f4d/attachment-0001.html>
More information about the llvm-commits
mailing list