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"
1736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/CodeGen/MachineFrameInfo.h"
1836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/CodeGen/MachineFunction.h"
1936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/CodeGen/MachineFunctionAnalysis.h"
2036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/CodeGen/Passes.h"
2136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/CodeGen/StackMapLivenessAnalysis.h"
2236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Support/CommandLine.h"
2336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Support/Debug.h"
2436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
2536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
2636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesusing namespace llvm;
2736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
28dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#define DEBUG_TYPE "stackmaps"
29dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
3036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesnamespace llvm {
3136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinescl::opt<bool> EnablePatchPointLiveness("enable-patchpoint-liveness",
32cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  cl::Hidden, cl::init(true),
33cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  cl::desc("Enable PatchPoint Liveness Analysis Pass"));
3436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
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
4236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hineschar StackMapLiveness::ID = 0;
4336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hineschar &llvm::StackMapLivenessID = StackMapLiveness::ID;
4436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesINITIALIZE_PASS(StackMapLiveness, "stackmap-liveness",
4536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                "StackMap Liveness Analysis", false, false)
4636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
4736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// Default construct and initialize the pass.
4836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesStackMapLiveness::StackMapLiveness() : MachineFunctionPass(ID) {
4936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  initializeStackMapLivenessPass(*PassRegistry::getPassRegistry());
5036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
5136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
5236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// Tell the pass manager which passes we depend on and what information we
5336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// preserve.
5436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid StackMapLiveness::getAnalysisUsage(AnalysisUsage &AU) const {
5536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // We preserve all information.
5636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  AU.setPreservesAll();
5736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  AU.setPreservesCFG();
5836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // Default dependencie for all MachineFunction passes.
5936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  AU.addRequired<MachineFunctionAnalysis>();
6036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
6136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
6236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// Calculate the liveness information for the given machine function.
6336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesbool StackMapLiveness::runOnMachineFunction(MachineFunction &_MF) {
64cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  if (!EnablePatchPointLiveness)
65cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    return false;
66cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
6736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  DEBUG(dbgs() << "********** COMPUTING STACKMAP LIVENESS: "
6836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines               << _MF.getName() << " **********\n");
6936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  MF = &_MF;
7036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  TRI = MF->getTarget().getRegisterInfo();
7136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  ++NumStackMapFuncVisited;
7236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
73cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // Skip this function if there are no patchpoints to process.
74cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  if (!MF->getFrameInfo()->hasPatchPoint()) {
7536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    ++NumStackMapFuncSkipped;
7636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return false;
7736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
7836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return calculateLiveness();
7936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
8036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
8136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// Performs the actual liveness calculation for the function.
8236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesbool StackMapLiveness::calculateLiveness() {
8336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool HasChanged = false;
8436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // For all basic blocks in the function.
8536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  for (MachineFunction::iterator MBBI = MF->begin(), MBBE = MF->end();
8636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines       MBBI != MBBE; ++MBBI) {
8736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    DEBUG(dbgs() << "****** BB " << MBBI->getName() << " ******\n");
8836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    LiveRegs.init(TRI);
8936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    LiveRegs.addLiveOuts(MBBI);
9036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    bool HasStackMap = false;
9136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    // Reverse iterate over all instructions and add the current live register
92cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    // set to an instruction if we encounter a patchpoint instruction.
9336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    for (MachineBasicBlock::reverse_iterator I = MBBI->rbegin(),
9436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines         E = MBBI->rend(); I != E; ++I) {
95cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      if (I->getOpcode() == TargetOpcode::PATCHPOINT) {
9636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        addLiveOutSetToMI(*I);
9736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        HasChanged = true;
9836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        HasStackMap = true;
9936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        ++NumStackMaps;
10036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      }
101dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      DEBUG(dbgs() << "   " << LiveRegs << "   " << *I);
10236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      LiveRegs.stepBackward(*I);
10336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    }
10436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    ++NumBBsVisited;
10536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    if (!HasStackMap)
10636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      ++NumBBsHaveNoStackmap;
10736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
10836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return HasChanged;
10936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
11036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
11136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// Add the current register live set to the instruction.
11236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid StackMapLiveness::addLiveOutSetToMI(MachineInstr &MI) {
11336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  uint32_t *Mask = createRegisterMask();
11436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  MachineOperand MO = MachineOperand::CreateRegLiveOut(Mask);
11536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  MI.addOperand(*MF, MO);
11636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
11736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
11836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// Create a register mask and initialize it with the registers from the
11936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// register live set.
12036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesuint32_t *StackMapLiveness::createRegisterMask() const {
12136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // The mask is owned and cleaned up by the Machine Function.
12236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  uint32_t *Mask = MF->allocateRegisterMask(TRI->getNumRegs());
12336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  for (LivePhysRegs::const_iterator RI = LiveRegs.begin(), RE = LiveRegs.end();
12436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines       RI != RE; ++RI)
12536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    Mask[*RI / 32] |= 1U << (*RI % 32);
12636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return Mask;
12736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
128