LCOV - code coverage report
Current view: top level - lib/Target/WebAssembly - WebAssemblyOptimizeLiveIntervals.cpp (source / functions) Hit Total Coverage
Test: llvm-toolchain.info Lines: 26 26 100.0 %
Date: 2018-10-20 13:21:21 Functions: 6 6 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : //===--- WebAssemblyOptimizeLiveIntervals.cpp - LiveInterval processing ---===//
       2             : //
       3             : //                     The LLVM Compiler Infrastructure
       4             : //
       5             : // This file is distributed under the University of Illinois Open Source
       6             : // License. See LICENSE.TXT for details.
       7             : //
       8             : //===----------------------------------------------------------------------===//
       9             : ///
      10             : /// \file
      11             : /// Optimize LiveIntervals for use in a post-RA context.
      12             : //
      13             : /// LiveIntervals normally runs before register allocation when the code is
      14             : /// only recently lowered out of SSA form, so it's uncommon for registers to
      15             : /// have multiple defs, and when they do, the defs are usually closely related.
      16             : /// Later, after coalescing, tail duplication, and other optimizations, it's
      17             : /// more common to see registers with multiple unrelated defs. This pass
      18             : /// updates LiveIntervals to distribute the value numbers across separate
      19             : /// LiveIntervals.
      20             : ///
      21             : //===----------------------------------------------------------------------===//
      22             : 
      23             : #include "WebAssembly.h"
      24             : #include "WebAssemblySubtarget.h"
      25             : #include "llvm/CodeGen/LiveIntervals.h"
      26             : #include "llvm/CodeGen/MachineBlockFrequencyInfo.h"
      27             : #include "llvm/CodeGen/MachineRegisterInfo.h"
      28             : #include "llvm/CodeGen/Passes.h"
      29             : #include "llvm/Support/Debug.h"
      30             : #include "llvm/Support/raw_ostream.h"
      31             : using namespace llvm;
      32             : 
      33             : #define DEBUG_TYPE "wasm-optimize-live-intervals"
      34             : 
      35             : namespace {
      36             : class WebAssemblyOptimizeLiveIntervals final : public MachineFunctionPass {
      37         298 :   StringRef getPassName() const override {
      38         298 :     return "WebAssembly Optimize Live Intervals";
      39             :   }
      40             : 
      41         298 :   void getAnalysisUsage(AnalysisUsage &AU) const override {
      42         298 :     AU.setPreservesCFG();
      43             :     AU.addRequired<LiveIntervals>();
      44             :     AU.addPreserved<MachineBlockFrequencyInfo>();
      45             :     AU.addPreserved<SlotIndexes>();
      46             :     AU.addPreserved<LiveIntervals>();
      47         298 :     AU.addPreservedID(LiveVariablesID);
      48         298 :     AU.addPreservedID(MachineDominatorsID);
      49         298 :     MachineFunctionPass::getAnalysisUsage(AU);
      50         298 :   }
      51             : 
      52             :   bool runOnMachineFunction(MachineFunction &MF) override;
      53             : 
      54             : public:
      55             :   static char ID; // Pass identification, replacement for typeid
      56         298 :   WebAssemblyOptimizeLiveIntervals() : MachineFunctionPass(ID) {}
      57             : };
      58             : } // end anonymous namespace
      59             : 
      60             : char WebAssemblyOptimizeLiveIntervals::ID = 0;
      61      199030 : INITIALIZE_PASS(WebAssemblyOptimizeLiveIntervals, DEBUG_TYPE,
      62             :                 "Optimize LiveIntervals for WebAssembly", false, false)
      63             : 
      64         298 : FunctionPass *llvm::createWebAssemblyOptimizeLiveIntervals() {
      65         298 :   return new WebAssemblyOptimizeLiveIntervals();
      66             : }
      67             : 
      68        2891 : bool WebAssemblyOptimizeLiveIntervals::runOnMachineFunction(
      69             :     MachineFunction &MF) {
      70             :   LLVM_DEBUG(dbgs() << "********** Optimize LiveIntervals **********\n"
      71             :                        "********** Function: "
      72             :                     << MF.getName() << '\n');
      73             : 
      74        2891 :   MachineRegisterInfo &MRI = MF.getRegInfo();
      75        2891 :   LiveIntervals &LIS = getAnalysis<LiveIntervals>();
      76             : 
      77             :   // We don't preserve SSA form.
      78        2891 :   MRI.leaveSSA();
      79             : 
      80             :   assert(MRI.tracksLiveness() && "OptimizeLiveIntervals expects liveness");
      81             : 
      82             :   // Split multiple-VN LiveIntervals into multiple LiveIntervals.
      83             :   SmallVector<LiveInterval *, 4> SplitLIs;
      84       21801 :   for (unsigned i = 0, e = MRI.getNumVirtRegs(); i < e; ++i) {
      85             :     unsigned Reg = TargetRegisterInfo::index2VirtReg(i);
      86       18910 :     if (MRI.reg_nodbg_empty(Reg))
      87             :       continue;
      88             : 
      89       18215 :     LIS.splitSeparateComponents(LIS.getInterval(Reg), SplitLIs);
      90             :     SplitLIs.clear();
      91             :   }
      92             : 
      93             :   // In PrepareForLiveIntervals, we conservatively inserted IMPLICIT_DEF
      94             :   // instructions to satisfy LiveIntervals' requirement that all uses be
      95             :   // dominated by defs. Now that LiveIntervals has computed which of these
      96             :   // defs are actually needed and which are dead, remove the dead ones.
      97       37475 :   for (auto MII = MF.begin()->begin(), MIE = MF.begin()->end(); MII != MIE;) {
      98             :     MachineInstr *MI = &*MII++;
      99       34584 :     if (MI->isImplicitDef() && MI->getOperand(0).isDead()) {
     100       11202 :       LiveInterval &LI = LIS.getInterval(MI->getOperand(0).getReg());
     101       11202 :       LIS.removeVRegDefAt(LI, LIS.getInstructionIndex(*MI).getRegSlot());
     102       11202 :       LIS.RemoveMachineInstrFromMaps(*MI);
     103       11202 :       MI->eraseFromParent();
     104             :     }
     105             :   }
     106             : 
     107        2891 :   return false;
     108             : }

Generated by: LCOV version 1.13