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