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

          Line data    Source code
       1             : //===-- StackMapLivenessAnalysis.cpp - StackMap live Out Analysis ----------===//
       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             : // This file implements the StackMap Liveness analysis pass. The pass calculates
      11             : // the liveness for each basic block in a function and attaches the register
      12             : // live-out information to a stackmap or patchpoint intrinsic if present.
      13             : //
      14             : //===----------------------------------------------------------------------===//
      15             : 
      16             : #include "llvm/ADT/Statistic.h"
      17             : #include "llvm/CodeGen/LivePhysRegs.h"
      18             : #include "llvm/CodeGen/MachineFrameInfo.h"
      19             : #include "llvm/CodeGen/MachineFunction.h"
      20             : #include "llvm/CodeGen/MachineFunctionPass.h"
      21             : #include "llvm/CodeGen/Passes.h"
      22             : #include "llvm/CodeGen/TargetSubtargetInfo.h"
      23             : #include "llvm/Support/CommandLine.h"
      24             : #include "llvm/Support/Debug.h"
      25             : #include "llvm/Support/raw_ostream.h"
      26             : 
      27             : using namespace llvm;
      28             : 
      29             : #define DEBUG_TYPE "stackmaps"
      30             : 
      31             : static cl::opt<bool> EnablePatchPointLiveness(
      32             :     "enable-patchpoint-liveness", cl::Hidden, cl::init(true),
      33             :     cl::desc("Enable PatchPoint Liveness Analysis Pass"));
      34             : 
      35             : STATISTIC(NumStackMapFuncVisited, "Number of functions visited");
      36             : STATISTIC(NumStackMapFuncSkipped, "Number of functions skipped");
      37             : STATISTIC(NumBBsVisited,          "Number of basic blocks visited");
      38             : STATISTIC(NumBBsHaveNoStackmap,   "Number of basic blocks with no stackmap");
      39             : STATISTIC(NumStackMaps,           "Number of StackMaps visited");
      40             : 
      41             : namespace {
      42             : /// This pass calculates the liveness information for each basic block in
      43             : /// a function and attaches the register live-out information to a patchpoint
      44             : /// intrinsic if present.
      45             : ///
      46             : /// This pass can be disabled via the -enable-patchpoint-liveness=false flag.
      47             : /// The pass skips functions that don't have any patchpoint intrinsics. The
      48             : /// information provided by this pass is optional and not required by the
      49             : /// aformentioned intrinsic to function.
      50             : class StackMapLiveness : public MachineFunctionPass {
      51             :   const TargetRegisterInfo *TRI;
      52             :   LivePhysRegs LiveRegs;
      53             : 
      54             : public:
      55             :   static char ID;
      56             : 
      57             :   /// Default construct and initialize the pass.
      58             :   StackMapLiveness();
      59             : 
      60             :   /// Tell the pass manager which passes we depend on and what
      61             :   /// information we preserve.
      62             :   void getAnalysisUsage(AnalysisUsage &AU) const override;
      63             : 
      64       24495 :   MachineFunctionProperties getRequiredProperties() const override {
      65       24495 :     return MachineFunctionProperties().set(
      66       24495 :         MachineFunctionProperties::Property::NoVRegs);
      67             :   }
      68             : 
      69             :   /// Calculate the liveness information for the given machine function.
      70             :   bool runOnMachineFunction(MachineFunction &MF) override;
      71             : 
      72             : private:
      73             :   /// Performs the actual liveness calculation for the function.
      74             :   bool calculateLiveness(MachineFunction &MF);
      75             : 
      76             :   /// Add the current register live set to the instruction.
      77             :   void addLiveOutSetToMI(MachineFunction &MF, MachineInstr &MI);
      78             : 
      79             :   /// Create a register mask and initialize it with the registers from
      80             :   /// the register live set.
      81             :   uint32_t *createRegisterMask(MachineFunction &MF) const;
      82             : };
      83             : } // namespace
      84             : 
      85             : char StackMapLiveness::ID = 0;
      86             : char &llvm::StackMapLivenessID = StackMapLiveness::ID;
      87      109803 : INITIALIZE_PASS(StackMapLiveness, "stackmap-liveness",
      88             :                 "StackMap Liveness Analysis", false, false)
      89             : 
      90             : /// Default construct and initialize the pass.
      91       24656 : StackMapLiveness::StackMapLiveness() : MachineFunctionPass(ID) {
      92       24656 :   initializeStackMapLivenessPass(*PassRegistry::getPassRegistry());
      93       24656 : }
      94             : 
      95             : /// Tell the pass manager which passes we depend on and what information we
      96             : /// preserve.
      97       24491 : void StackMapLiveness::getAnalysisUsage(AnalysisUsage &AU) const {
      98             :   // We preserve all information.
      99             :   AU.setPreservesAll();
     100       24491 :   AU.setPreservesCFG();
     101       24491 :   MachineFunctionPass::getAnalysisUsage(AU);
     102       24491 : }
     103             : 
     104             : /// Calculate the liveness information for the given machine function.
     105      379347 : bool StackMapLiveness::runOnMachineFunction(MachineFunction &MF) {
     106      379347 :   if (!EnablePatchPointLiveness)
     107             :     return false;
     108             : 
     109             :   LLVM_DEBUG(dbgs() << "********** COMPUTING STACKMAP LIVENESS: "
     110             :                     << MF.getName() << " **********\n");
     111      379345 :   TRI = MF.getSubtarget().getRegisterInfo();
     112             :   ++NumStackMapFuncVisited;
     113             : 
     114             :   // Skip this function if there are no patchpoints to process.
     115      379345 :   if (!MF.getFrameInfo().hasPatchPoint()) {
     116             :     ++NumStackMapFuncSkipped;
     117             :     return false;
     118             :   }
     119         147 :   return calculateLiveness(MF);
     120             : }
     121             : 
     122             : /// Performs the actual liveness calculation for the function.
     123         147 : bool StackMapLiveness::calculateLiveness(MachineFunction &MF) {
     124             :   bool HasChanged = false;
     125             :   // For all basic blocks in the function.
     126         307 :   for (auto &MBB : MF) {
     127             :     LLVM_DEBUG(dbgs() << "****** BB " << MBB.getName() << " ******\n");
     128         160 :     LiveRegs.init(*TRI);
     129             :     // FIXME: This should probably be addLiveOuts().
     130         160 :     LiveRegs.addLiveOutsNoPristines(MBB);
     131             :     bool HasStackMap = false;
     132             :     // Reverse iterate over all instructions and add the current live register
     133             :     // set to an instruction if we encounter a patchpoint instruction.
     134        2783 :     for (auto I = MBB.rbegin(), E = MBB.rend(); I != E; ++I) {
     135        5246 :       if (I->getOpcode() == TargetOpcode::PATCHPOINT) {
     136         178 :         addLiveOutSetToMI(MF, *I);
     137             :         HasChanged = true;
     138             :         HasStackMap = true;
     139             :         ++NumStackMaps;
     140             :       }
     141             :       LLVM_DEBUG(dbgs() << "   " << LiveRegs << "   " << *I);
     142        2623 :       LiveRegs.stepBackward(*I);
     143             :     }
     144             :     ++NumBBsVisited;
     145             :     if (!HasStackMap)
     146             :       ++NumBBsHaveNoStackmap;
     147             :   }
     148         147 :   return HasChanged;
     149             : }
     150             : 
     151             : /// Add the current register live set to the instruction.
     152         178 : void StackMapLiveness::addLiveOutSetToMI(MachineFunction &MF,
     153             :                                          MachineInstr &MI) {
     154         178 :   uint32_t *Mask = createRegisterMask(MF);
     155             :   MachineOperand MO = MachineOperand::CreateRegLiveOut(Mask);
     156         178 :   MI.addOperand(MF, MO);
     157         178 : }
     158             : 
     159             : /// Create a register mask and initialize it with the registers from the
     160             : /// register live set.
     161         178 : uint32_t *StackMapLiveness::createRegisterMask(MachineFunction &MF) const {
     162             :   // The mask is owned and cleaned up by the Machine Function.
     163         178 :   uint32_t *Mask = MF.allocateRegMask();
     164        1370 :   for (auto Reg : LiveRegs)
     165        1192 :     Mask[Reg / 32] |= 1U << (Reg % 32);
     166             : 
     167             :   // Give the target a chance to adjust the mask.
     168         178 :   TRI->adjustStackMapLiveOutMask(Mask);
     169             : 
     170         178 :   return Mask;
     171             : }

Generated by: LCOV version 1.13