[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