136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===-- StackMapLivenessAnalysis.cpp - StackMap live Out Analysis ----------===//
236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//
336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//                     The LLVM Compiler Infrastructure
436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//
536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// This file is distributed under the University of Illinois Open Source
636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// License. See LICENSE.TXT for details.
736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//
836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===----------------------------------------------------------------------===//
936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//
1036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// This file implements the StackMap Liveness analysis pass. The pass calculates
1136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// the liveness for each basic block in a function and attaches the register
1236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// live-out information to a stackmap or patchpoint intrinsic if present.
1336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//
1436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===----------------------------------------------------------------------===//
1536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
1636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/ADT/Statistic.h"
174c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar#include "llvm/CodeGen/LivePhysRegs.h"
1836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/CodeGen/MachineFrameInfo.h"
1936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/CodeGen/MachineFunction.h"
2036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/CodeGen/MachineFunctionAnalysis.h"
214c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar#include "llvm/CodeGen/MachineFunctionPass.h"
2236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/CodeGen/Passes.h"
2336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Support/CommandLine.h"
2436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Support/Debug.h"
254c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar#include "llvm/Support/raw_ostream.h"
2637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "llvm/Target/TargetSubtargetInfo.h"
2736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
2836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesusing namespace llvm;
2936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
30dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#define DEBUG_TYPE "stackmaps"
31dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
324c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarstatic cl::opt<bool> EnablePatchPointLiveness(
334c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    "enable-patchpoint-liveness", cl::Hidden, cl::init(true),
344c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    cl::desc("Enable PatchPoint Liveness Analysis Pass"));
3536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
3636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesSTATISTIC(NumStackMapFuncVisited, "Number of functions visited");
3736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesSTATISTIC(NumStackMapFuncSkipped, "Number of functions skipped");
3836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesSTATISTIC(NumBBsVisited,          "Number of basic blocks visited");
3936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesSTATISTIC(NumBBsHaveNoStackmap,   "Number of basic blocks with no stackmap");
4036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesSTATISTIC(NumStackMaps,           "Number of StackMaps visited");
4136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
424c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarnamespace {
434c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar/// \brief This pass calculates the liveness information for each basic block in
444c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar/// a function and attaches the register live-out information to a patchpoint
454c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar/// intrinsic if present.
464c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar///
474c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar/// This pass can be disabled via the -enable-patchpoint-liveness=false flag.
484c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar/// The pass skips functions that don't have any patchpoint intrinsics. The
494c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar/// information provided by this pass is optional and not required by the
504c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar/// aformentioned intrinsic to function.
514c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarclass StackMapLiveness : public MachineFunctionPass {
524c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  const TargetRegisterInfo *TRI;
534c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  LivePhysRegs LiveRegs;
544c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
554c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarpublic:
564c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  static char ID;
574c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
584c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// \brief Default construct and initialize the pass.
594c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  StackMapLiveness();
604c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
614c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// \brief Tell the pass manager which passes we depend on and what
624c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// information we preserve.
634c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  void getAnalysisUsage(AnalysisUsage &AU) const override;
644c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
654c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// \brief Calculate the liveness information for the given machine function.
664c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  bool runOnMachineFunction(MachineFunction &MF) override;
674c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
684c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarprivate:
694c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// \brief Performs the actual liveness calculation for the function.
70cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  bool calculateLiveness(MachineFunction &MF);
714c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
724c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// \brief Add the current register live set to the instruction.
73cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  void addLiveOutSetToMI(MachineFunction &MF, MachineInstr &MI);
744c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
754c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// \brief Create a register mask and initialize it with the registers from
764c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// the register live set.
77cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  uint32_t *createRegisterMask(MachineFunction &MF) const;
784c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar};
794c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar} // namespace
804c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
8136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hineschar StackMapLiveness::ID = 0;
8236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hineschar &llvm::StackMapLivenessID = StackMapLiveness::ID;
8336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesINITIALIZE_PASS(StackMapLiveness, "stackmap-liveness",
8436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                "StackMap Liveness Analysis", false, false)
8536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
8636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// Default construct and initialize the pass.
8736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesStackMapLiveness::StackMapLiveness() : MachineFunctionPass(ID) {
8836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  initializeStackMapLivenessPass(*PassRegistry::getPassRegistry());
8936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
9036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
9136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// Tell the pass manager which passes we depend on and what information we
9236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// preserve.
9336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid StackMapLiveness::getAnalysisUsage(AnalysisUsage &AU) const {
9436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // We preserve all information.
9536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  AU.setPreservesAll();
9636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  AU.setPreservesCFG();
97cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  MachineFunctionPass::getAnalysisUsage(AU);
9836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
9936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
10036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// Calculate the liveness information for the given machine function.
1014c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarbool StackMapLiveness::runOnMachineFunction(MachineFunction &MF) {
102c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  if (!EnablePatchPointLiveness)
103c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    return false;
104c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
1054c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  DEBUG(dbgs() << "********** COMPUTING STACKMAP LIVENESS: " << MF.getName()
1064c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar               << " **********\n");
1074c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  TRI = MF.getSubtarget().getRegisterInfo();
10836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  ++NumStackMapFuncVisited;
10936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
110c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  // Skip this function if there are no patchpoints to process.
1114c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  if (!MF.getFrameInfo()->hasPatchPoint()) {
11236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    ++NumStackMapFuncSkipped;
11336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return false;
11436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
115cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  return calculateLiveness(MF);
11636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
11736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
11836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// Performs the actual liveness calculation for the function.
119cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarbool StackMapLiveness::calculateLiveness(MachineFunction &MF) {
12036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool HasChanged = false;
12136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // For all basic blocks in the function.
122cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  for (auto &MBB : MF) {
123cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    DEBUG(dbgs() << "****** BB " << MBB.getName() << " ******\n");
12436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    LiveRegs.init(TRI);
125cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    LiveRegs.addLiveOuts(&MBB);
12636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    bool HasStackMap = false;
12736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    // Reverse iterate over all instructions and add the current live register
128c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    // set to an instruction if we encounter a patchpoint instruction.
129cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    for (auto I = MBB.rbegin(), E = MBB.rend(); I != E; ++I) {
130c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines      if (I->getOpcode() == TargetOpcode::PATCHPOINT) {
131cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar        addLiveOutSetToMI(MF, *I);
13236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        HasChanged = true;
13336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        HasStackMap = true;
13436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        ++NumStackMaps;
13536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      }
136dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      DEBUG(dbgs() << "   " << LiveRegs << "   " << *I);
13736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      LiveRegs.stepBackward(*I);
13836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    }
13936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    ++NumBBsVisited;
14036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    if (!HasStackMap)
14136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      ++NumBBsHaveNoStackmap;
14236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
14336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return HasChanged;
14436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
14536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
14636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// Add the current register live set to the instruction.
147cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarvoid StackMapLiveness::addLiveOutSetToMI(MachineFunction &MF,
148cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar                                         MachineInstr &MI) {
149cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  uint32_t *Mask = createRegisterMask(MF);
15036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  MachineOperand MO = MachineOperand::CreateRegLiveOut(Mask);
151cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  MI.addOperand(MF, MO);
15236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
15336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
15436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// Create a register mask and initialize it with the registers from the
15536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// register live set.
156cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainaruint32_t *StackMapLiveness::createRegisterMask(MachineFunction &MF) const {
15736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // The mask is owned and cleaned up by the Machine Function.
158cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  uint32_t *Mask = MF.allocateRegisterMask(TRI->getNumRegs());
159cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  for (auto Reg : LiveRegs)
160cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Mask[Reg / 32] |= 1U << (Reg % 32);
161ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
162cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  // Give the target a chance to adjust the mask.
163ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  TRI->adjustStackMapLiveOutMask(Mask);
164cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
16536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return Mask;
16636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
167