LLVM 20.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
32void LiveStacksWrapperLegacy::getAnalysisUsage(AnalysisUsage &AU) const {
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 S2RCMap[Slot] = TRI->getCommonSubClass(OldRC, RC);
67 }
68 return I->second;
69}
70
71AnalysisKey LiveStacksAnalysis::Key;
72
75 LiveStacks Impl;
76 Impl.init(MF);
77 return Impl;
78}
84}
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}
basic Basic Alias true
Looks at all the uses of the given value Returns the Liveness deduced from the uses of this value Adds all uses that cause the result to be MaybeLive to MaybeLiveRetUses If the result is Live
Live Stack Slot Analysis
Definition: LiveStacks.cpp:28
#define DEBUG_TYPE
Definition: LiveStacks.cpp:21
#define I(x, y, z)
Definition: MD5.cpp:58
#define INITIALIZE_PASS_DEPENDENCY(depName)
Definition: PassSupport.h:55
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
Definition: PassSupport.h:57
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
Definition: PassSupport.h:52
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
raw_pwrite_stream & OS
A container for analyses that lazily runs them and caches their results.
Definition: PassManager.h:253
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
Definition: PassManager.h:410
Represent the analysis usage information of a pass.
void Reset()
Deallocate all but the current slab and reset the current pointer to the beginning of it,...
Definition: Allocator.h:123
Module * getParent()
Get the module that this global value is contained inside of...
Definition: GlobalValue.h:656
LiveInterval - This class represents the liveness of a register, or stack slot.
Definition: LiveInterval.h:687
LiveStacks run(MachineFunction &MF, MachineFunctionAnalysisManager &)
Definition: LiveStacks.cpp:73
PreservedAnalyses run(MachineFunction &MF, MachineFunctionAnalysisManager &AM)
Definition: LiveStacks.cpp:80
void print(raw_ostream &O, const Module *=nullptr) const override
print - Implement the dump method.
Definition: LiveStacks.cpp:94
bool runOnMachineFunction(MachineFunction &) override
runOnMachineFunction - pass entry point
Definition: LiveStacks.cpp:86
void releaseMemory() override
releaseMemory() - This member can be implemented by a pass if it wants to be able to release its memo...
Definition: LiveStacks.cpp:92
SS2IntervalMap::const_iterator const_iterator
Definition: LiveStacks.h:52
LiveInterval & getOrCreateInterval(int Slot, const TargetRegisterClass *RC)
Definition: LiveStacks.cpp:53
void print(raw_ostream &O, const Module *M=nullptr) const
print - Implement the dump method.
Definition: LiveStacks.cpp:99
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
Definition: LiveStacks.cpp:46
void releaseMemory()
Definition: LiveStacks.cpp:39
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:65
A set of analyses that are preserved following a run of a transformation pass.
Definition: Analysis.h:111
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
Definition: Analysis.h:117
static Register index2StackSlot(int FI)
Convert a non-negative frame index to a stack slot register value.
Definition: Register.h:58
const TargetRegisterClass * getCommonSubClass(const TargetRegisterClass *A, const TargetRegisterClass *B) const
Find the largest common subclass of A and B.
const char * getRegClassName(const TargetRegisterClass *Class) const
Returns the name of the register class.
virtual const TargetRegisterInfo * getRegisterInfo() const
getRegisterInfo - If register information is available, return it.
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition: raw_ostream.h:52
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
char & LiveStacksID
LiveStacks pass. An analysis keeping track of the liveness of stack slots.
Definition: LiveStacks.cpp:30
Printable print(const GCNRegPressure &RP, const GCNSubtarget *ST=nullptr)
A special type used by analysis passes to provide an address that identifies that particular analysis...
Definition: Analysis.h:28