mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-26 13:36:28 +00:00
28aa6c41d1
VirtRegMap keeps track of allocations so it knows what's not used. As a horrible hack, the stack coloring can color spill slots with *free* registers. That is, it replace reload and spills with copies from and to the free register. It unfold instructions that load and store the spill slot and replace them with register using variants. Not yet enabled. This is part 1. More coming. llvm-svn: 70787
58 lines
1.8 KiB
C++
58 lines
1.8 KiB
C++
//===-- LiveStackAnalysis.cpp - Live Stack Slot Analysis ------------------===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file implements the live stack slot analysis pass. It is analogous to
|
|
// live interval analysis except it's analyzing liveness of stack slots rather
|
|
// than registers.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#define DEBUG_TYPE "livestacks"
|
|
#include "llvm/CodeGen/LiveStackAnalysis.h"
|
|
#include "llvm/CodeGen/Passes.h"
|
|
#include "llvm/Target/TargetRegisterInfo.h"
|
|
#include "llvm/Support/Debug.h"
|
|
#include "llvm/ADT/Statistic.h"
|
|
using namespace llvm;
|
|
|
|
char LiveStacks::ID = 0;
|
|
static RegisterPass<LiveStacks> X("livestacks", "Live Stack Slot Analysis");
|
|
|
|
void LiveStacks::getAnalysisUsage(AnalysisUsage &AU) const {
|
|
AU.setPreservesAll();
|
|
MachineFunctionPass::getAnalysisUsage(AU);
|
|
}
|
|
|
|
void LiveStacks::releaseMemory() {
|
|
// Release VNInfo memroy regions after all VNInfo objects are dtor'd.
|
|
VNInfoAllocator.Reset();
|
|
S2IMap.clear();
|
|
S2RCMap.clear();
|
|
}
|
|
|
|
bool LiveStacks::runOnMachineFunction(MachineFunction &) {
|
|
// FIXME: No analysis is being done right now. We are relying on the
|
|
// register allocators to provide the information.
|
|
return false;
|
|
}
|
|
|
|
/// print - Implement the dump method.
|
|
void LiveStacks::print(std::ostream &O, const Module*) const {
|
|
O << "********** INTERVALS **********\n";
|
|
for (const_iterator I = begin(), E = end(); I != E; ++I) {
|
|
I->second.print(O);
|
|
int Slot = I->first;
|
|
const TargetRegisterClass *RC = getIntervalRegClass(Slot);
|
|
if (RC)
|
|
O << " [" << RC->getName() << "]\n";
|
|
else
|
|
O << " [Unknown]\n";
|
|
}
|
|
}
|