13f32d65912b4da23793dab618d981be2ce11c331Evan Cheng//===-- LiveStackAnalysis.h - Live Stack Slot Analysis ----------*- C++ -*-===// 23f32d65912b4da23793dab618d981be2ce11c331Evan Cheng// 33f32d65912b4da23793dab618d981be2ce11c331Evan Cheng// The LLVM Compiler Infrastructure 43f32d65912b4da23793dab618d981be2ce11c331Evan Cheng// 53f32d65912b4da23793dab618d981be2ce11c331Evan Cheng// This file is distributed under the University of Illinois Open Source 63f32d65912b4da23793dab618d981be2ce11c331Evan Cheng// License. See LICENSE.TXT for details. 73f32d65912b4da23793dab618d981be2ce11c331Evan Cheng// 83f32d65912b4da23793dab618d981be2ce11c331Evan Cheng//===----------------------------------------------------------------------===// 93f32d65912b4da23793dab618d981be2ce11c331Evan Cheng// 103f32d65912b4da23793dab618d981be2ce11c331Evan Cheng// This file implements the live stack slot analysis pass. It is analogous to 113f32d65912b4da23793dab618d981be2ce11c331Evan Cheng// live interval analysis except it's analyzing liveness of stack slots rather 123f32d65912b4da23793dab618d981be2ce11c331Evan Cheng// than registers. 133f32d65912b4da23793dab618d981be2ce11c331Evan Cheng// 143f32d65912b4da23793dab618d981be2ce11c331Evan Cheng//===----------------------------------------------------------------------===// 153f32d65912b4da23793dab618d981be2ce11c331Evan Cheng 16674be02d525d4e24bc6943ed9274958c580bcfbcJakub Staszak#ifndef LLVM_CODEGEN_LIVESTACKANALYSIS_H 17674be02d525d4e24bc6943ed9274958c580bcfbcJakub Staszak#define LLVM_CODEGEN_LIVESTACKANALYSIS_H 183f32d65912b4da23793dab618d981be2ce11c331Evan Cheng 193f32d65912b4da23793dab618d981be2ce11c331Evan Cheng#include "llvm/CodeGen/LiveInterval.h" 20255f89faee13dc491cb64fbeae3c763e7e2ea4e6Chandler Carruth#include "llvm/CodeGen/MachineFunctionPass.h" 213f32d65912b4da23793dab618d981be2ce11c331Evan Cheng#include "llvm/Support/Allocator.h" 22255f89faee13dc491cb64fbeae3c763e7e2ea4e6Chandler Carruth#include "llvm/Target/TargetRegisterInfo.h" 233f32d65912b4da23793dab618d981be2ce11c331Evan Cheng#include <map> 243f32d65912b4da23793dab618d981be2ce11c331Evan Cheng 253f32d65912b4da23793dab618d981be2ce11c331Evan Chengnamespace llvm { 263f32d65912b4da23793dab618d981be2ce11c331Evan Cheng 273f32d65912b4da23793dab618d981be2ce11c331Evan Cheng class LiveStacks : public MachineFunctionPass { 28e27e1ca3c90b69e78242c98a669337f84ccded7fJakob Stoklund Olesen const TargetRegisterInfo *TRI; 29e27e1ca3c90b69e78242c98a669337f84ccded7fJakob Stoklund Olesen 303f32d65912b4da23793dab618d981be2ce11c331Evan Cheng /// Special pool allocator for VNInfo's (LiveInterval val#). 313f32d65912b4da23793dab618d981be2ce11c331Evan Cheng /// 32991de14dd62dcbab4b31357ae22dc5b053ba50a0Benjamin Kramer VNInfo::Allocator VNInfoAllocator; 333f32d65912b4da23793dab618d981be2ce11c331Evan Cheng 34c781a243a3d17e7e763515794168d8fa6043f565Evan Cheng /// S2IMap - Stack slot indices to live interval mapping. 353f32d65912b4da23793dab618d981be2ce11c331Evan Cheng /// 363f32d65912b4da23793dab618d981be2ce11c331Evan Cheng typedef std::map<int, LiveInterval> SS2IntervalMap; 37c781a243a3d17e7e763515794168d8fa6043f565Evan Cheng SS2IntervalMap S2IMap; 383f32d65912b4da23793dab618d981be2ce11c331Evan Cheng 39c781a243a3d17e7e763515794168d8fa6043f565Evan Cheng /// S2RCMap - Stack slot indices to register class mapping. 40c781a243a3d17e7e763515794168d8fa6043f565Evan Cheng std::map<int, const TargetRegisterClass*> S2RCMap; 41c781a243a3d17e7e763515794168d8fa6043f565Evan Cheng 423f32d65912b4da23793dab618d981be2ce11c331Evan Cheng public: 433f32d65912b4da23793dab618d981be2ce11c331Evan Cheng static char ID; // Pass identification, replacement for typeid 44081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson LiveStacks() : MachineFunctionPass(ID) { 45081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson initializeLiveStacksPass(*PassRegistry::getPassRegistry()); 46081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson } 473f32d65912b4da23793dab618d981be2ce11c331Evan Cheng 483f32d65912b4da23793dab618d981be2ce11c331Evan Cheng typedef SS2IntervalMap::iterator iterator; 493f32d65912b4da23793dab618d981be2ce11c331Evan Cheng typedef SS2IntervalMap::const_iterator const_iterator; 50c781a243a3d17e7e763515794168d8fa6043f565Evan Cheng const_iterator begin() const { return S2IMap.begin(); } 51c781a243a3d17e7e763515794168d8fa6043f565Evan Cheng const_iterator end() const { return S2IMap.end(); } 52c781a243a3d17e7e763515794168d8fa6043f565Evan Cheng iterator begin() { return S2IMap.begin(); } 53c781a243a3d17e7e763515794168d8fa6043f565Evan Cheng iterator end() { return S2IMap.end(); } 54c781a243a3d17e7e763515794168d8fa6043f565Evan Cheng 55c781a243a3d17e7e763515794168d8fa6043f565Evan Cheng unsigned getNumIntervals() const { return (unsigned)S2IMap.size(); } 56c781a243a3d17e7e763515794168d8fa6043f565Evan Cheng 57be97e906e03dd9b22e14f6749157c9d5f9701dd5Jakob Stoklund Olesen LiveInterval &getOrCreateInterval(int Slot, const TargetRegisterClass *RC); 583f32d65912b4da23793dab618d981be2ce11c331Evan Cheng 59d0e32c5d5c1bb03bc0cc8aeef52728724cab1c51Evan Cheng LiveInterval &getInterval(int Slot) { 60c781a243a3d17e7e763515794168d8fa6043f565Evan Cheng assert(Slot >= 0 && "Spill slot indice must be >= 0"); 61c781a243a3d17e7e763515794168d8fa6043f565Evan Cheng SS2IntervalMap::iterator I = S2IMap.find(Slot); 62c781a243a3d17e7e763515794168d8fa6043f565Evan Cheng assert(I != S2IMap.end() && "Interval does not exist for stack slot"); 63d0e32c5d5c1bb03bc0cc8aeef52728724cab1c51Evan Cheng return I->second; 64d0e32c5d5c1bb03bc0cc8aeef52728724cab1c51Evan Cheng } 65d0e32c5d5c1bb03bc0cc8aeef52728724cab1c51Evan Cheng 66d0e32c5d5c1bb03bc0cc8aeef52728724cab1c51Evan Cheng const LiveInterval &getInterval(int Slot) const { 67c781a243a3d17e7e763515794168d8fa6043f565Evan Cheng assert(Slot >= 0 && "Spill slot indice must be >= 0"); 68c781a243a3d17e7e763515794168d8fa6043f565Evan Cheng SS2IntervalMap::const_iterator I = S2IMap.find(Slot); 69c781a243a3d17e7e763515794168d8fa6043f565Evan Cheng assert(I != S2IMap.end() && "Interval does not exist for stack slot"); 70d0e32c5d5c1bb03bc0cc8aeef52728724cab1c51Evan Cheng return I->second; 71d0e32c5d5c1bb03bc0cc8aeef52728724cab1c51Evan Cheng } 72d0e32c5d5c1bb03bc0cc8aeef52728724cab1c51Evan Cheng 73c781a243a3d17e7e763515794168d8fa6043f565Evan Cheng bool hasInterval(int Slot) const { 74c781a243a3d17e7e763515794168d8fa6043f565Evan Cheng return S2IMap.count(Slot); 75c781a243a3d17e7e763515794168d8fa6043f565Evan Cheng } 76c781a243a3d17e7e763515794168d8fa6043f565Evan Cheng 77c781a243a3d17e7e763515794168d8fa6043f565Evan Cheng const TargetRegisterClass *getIntervalRegClass(int Slot) const { 78c781a243a3d17e7e763515794168d8fa6043f565Evan Cheng assert(Slot >= 0 && "Spill slot indice must be >= 0"); 79c781a243a3d17e7e763515794168d8fa6043f565Evan Cheng std::map<int, const TargetRegisterClass*>::const_iterator 80c781a243a3d17e7e763515794168d8fa6043f565Evan Cheng I = S2RCMap.find(Slot); 81c781a243a3d17e7e763515794168d8fa6043f565Evan Cheng assert(I != S2RCMap.end() && 82c781a243a3d17e7e763515794168d8fa6043f565Evan Cheng "Register class info does not exist for stack slot"); 83c781a243a3d17e7e763515794168d8fa6043f565Evan Cheng return I->second; 84d0e32c5d5c1bb03bc0cc8aeef52728724cab1c51Evan Cheng } 85d0e32c5d5c1bb03bc0cc8aeef52728724cab1c51Evan Cheng 86991de14dd62dcbab4b31357ae22dc5b053ba50a0Benjamin Kramer VNInfo::Allocator& getVNInfoAllocator() { return VNInfoAllocator; } 873f32d65912b4da23793dab618d981be2ce11c331Evan Cheng 883f32d65912b4da23793dab618d981be2ce11c331Evan Cheng virtual void getAnalysisUsage(AnalysisUsage &AU) const; 893f32d65912b4da23793dab618d981be2ce11c331Evan Cheng virtual void releaseMemory(); 903f32d65912b4da23793dab618d981be2ce11c331Evan Cheng 913f32d65912b4da23793dab618d981be2ce11c331Evan Cheng /// runOnMachineFunction - pass entry point 923f32d65912b4da23793dab618d981be2ce11c331Evan Cheng virtual bool runOnMachineFunction(MachineFunction&); 933f32d65912b4da23793dab618d981be2ce11c331Evan Cheng 943f32d65912b4da23793dab618d981be2ce11c331Evan Cheng /// print - Implement the dump method. 9545cfe545ec8177262dabc70580ce05feaa1c3880Chris Lattner virtual void print(raw_ostream &O, const Module* = 0) const; 963f32d65912b4da23793dab618d981be2ce11c331Evan Cheng }; 973f32d65912b4da23793dab618d981be2ce11c331Evan Cheng} 983f32d65912b4da23793dab618d981be2ce11c331Evan Cheng 993f32d65912b4da23793dab618d981be2ce11c331Evan Cheng#endif /* LLVM_CODEGEN_LIVESTACK_ANALYSIS_H */ 100