LLVM 22.0.0git
LiveStacks.cpp
Go to the documentation of this file.
1//===-- LiveStacks.cpp - Live Stack Slot Analysis -------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file implements the live stack slot analysis pass. It is analogous to
10// live interval analysis except it's analyzing liveness of stack slots rather
11// than registers.
12//
13//===----------------------------------------------------------------------===//
14
18#include "llvm/IR/Function.h"
19using namespace llvm;
20
21#define DEBUG_TYPE "livestacks"
22
25 "Live Stack Slot Analysis", false, false)
28 "Live Stack Slot Analysis", false, true)
29
31
33 AU.setPreservesAll();
34 AU.addPreserved<SlotIndexesWrapperPass>();
35 AU.addRequiredTransitive<SlotIndexesWrapperPass>();
37}
38
40 // Release VNInfo memory regions, VNInfo objects don't need to be dtor'd.
41 VNInfoAllocator.Reset();
42 S2IMap.clear();
43 S2RCMap.clear();
44}
45
47 TRI = MF.getSubtarget().getRegisterInfo();
48 // FIXME: No analysis is being done right now. We are relying on the
49 // register allocators to provide the information.
50}
51
54 assert(Slot >= 0 && "Spill slot indice must be >= 0");
55 SS2IntervalMap::iterator I = S2IMap.find(Slot);
56 if (I == S2IMap.end()) {
57 I = S2IMap
58 .emplace(
59 std::piecewise_construct, std::forward_as_tuple(Slot),
60 std::forward_as_tuple(Register::index2StackSlot(Slot), 0.0F))
61 .first;
62 S2RCMap.insert(std::make_pair(Slot, RC));
63 } else {
64 // Use the largest common subclass register class.
65 const TargetRegisterClass *&OldRC = S2RCMap[Slot];
66 OldRC = TRI->getCommonSubClass(OldRC, RC);
67 }
68 return I->second;
69}
70
71AnalysisKey LiveStacksAnalysis::Key;
72
85
87 Impl = LiveStacks();
88 Impl.init(MF);
89 return false;
90}
91
93
95 Impl.print(OS);
96}
97
98/// print - Implement the dump method.
99void LiveStacks::print(raw_ostream &OS, const Module*) const {
100
101 OS << "********** INTERVALS **********\n";
102 for (const_iterator I = begin(), E = end(); I != E; ++I) {
103 I->second.print(OS);
104 int Slot = I->first;
106 if (RC)
107 OS << " [" << TRI->getRegClassName(RC) << "]\n";
108 else
109 OS << " [Unknown]\n";
110 }
111}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
#define DEBUG_TYPE
#define I(x, y, z)
Definition MD5.cpp:58
#define INITIALIZE_PASS_DEPENDENCY(depName)
Definition PassSupport.h:42
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
Definition PassSupport.h:44
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
Definition PassSupport.h:39
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
Represent the analysis usage information of a pass.
Module * getParent()
Get the module that this global value is contained inside of...
LiveInterval - This class represents the liveness of a register, or stack slot.
LiveStacks run(MachineFunction &MF, MachineFunctionAnalysisManager &)
PreservedAnalyses run(MachineFunction &MF, MachineFunctionAnalysisManager &AM)
void print(raw_ostream &O, const Module *=nullptr) const override
print - Implement the dump method.
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - This function should be overriden by passes that need analysis information to do t...
bool runOnMachineFunction(MachineFunction &) override
runOnMachineFunction - pass entry point
void releaseMemory() override
releaseMemory() - This member can be implemented by a pass if it wants to be able to release its memo...
SS2IntervalMap::const_iterator const_iterator
Definition LiveStacks.h:52
LiveInterval & getOrCreateInterval(int Slot, const TargetRegisterClass *RC)
void print(raw_ostream &O, const Module *M=nullptr) const
print - Implement the dump method.
const TargetRegisterClass * getIntervalRegClass(int Slot) const
Definition LiveStacks.h:79
const_iterator end() const
Definition LiveStacks.h:55
const_iterator begin() const
Definition LiveStacks.h:54
void init(MachineFunction &MF)
init - analysis entry point
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
Function & getFunction()
Return the LLVM function that this machine code represents.
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:67
A set of analyses that are preserved following a run of a transformation pass.
Definition Analysis.h:112
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
Definition Analysis.h:118
static Register index2StackSlot(int FI)
Convert a non-negative frame index to a stack slot register value.
Definition Register.h:48
virtual const TargetRegisterInfo * getRegisterInfo() const =0
Return the target's register information.
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition raw_ostream.h:53
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
This is an optimization pass for GlobalISel generic memory operations.
Printable print(const GCNRegPressure &RP, const GCNSubtarget *ST=nullptr, unsigned DynamicVGPRBlockSize=0)
LLVM_ABI char & LiveStacksID
LiveStacks pass. An analysis keeping track of the liveness of stack slots.
AnalysisManager< MachineFunction > MachineFunctionAnalysisManager
A special type used by analysis passes to provide an address that identifies that particular analysis...
Definition Analysis.h:29