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