mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-30 02:32:08 +00:00
ad2afc2a42
shouldn't do AU.setPreservesCFG(), because even though CodeGen passes don't modify the LLVM IR CFG, they may modify the MachineFunction CFG, and passes like MachineLoop are registered with isCFGOnly set to true. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@77691 91177308-0d34-0410-b5e6-96231b3b80d8
65 lines
1.9 KiB
C++
65 lines
1.9 KiB
C++
//===- LazyLiveness.h - Lazy, CFG-invariant liveness information ----------===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This pass implements a lazy liveness analysis as per "Fast Liveness Checking
|
|
// for SSA-form Programs," by Boissinot, et al.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_CODEGEN_LAZYLIVENESS_H
|
|
#define LLVM_CODEGEN_LAZYLIVENESS_H
|
|
|
|
#include "llvm/CodeGen/MachineFunctionPass.h"
|
|
#include "llvm/CodeGen/MachineDominators.h"
|
|
#include "llvm/ADT/DenseMap.h"
|
|
#include "llvm/ADT/DenseSet.h"
|
|
#include "llvm/ADT/SparseBitVector.h"
|
|
#include <vector>
|
|
|
|
namespace llvm {
|
|
|
|
class MachineRegisterInfo;
|
|
|
|
class LazyLiveness : public MachineFunctionPass {
|
|
public:
|
|
static char ID; // Pass identification, replacement for typeid
|
|
LazyLiveness() : MachineFunctionPass(&ID) { }
|
|
|
|
void getAnalysisUsage(AnalysisUsage &AU) const {
|
|
AU.setPreservesAll();
|
|
AU.addRequired<MachineDominatorTree>();
|
|
MachineFunctionPass::getAnalysisUsage(AU);
|
|
}
|
|
|
|
bool runOnMachineFunction(MachineFunction &mf);
|
|
|
|
bool vregLiveIntoMBB(unsigned vreg, MachineBasicBlock* MBB);
|
|
|
|
private:
|
|
void computeBackedgeChain(MachineFunction& mf, MachineBasicBlock* MBB);
|
|
|
|
typedef std::pair<MachineBasicBlock*, MachineBasicBlock*> edge_t;
|
|
|
|
MachineRegisterInfo* MRI;
|
|
|
|
DenseMap<MachineBasicBlock*, unsigned> preorder;
|
|
std::vector<MachineBasicBlock*> rev_preorder;
|
|
DenseMap<MachineBasicBlock*, SparseBitVector<128> > rv;
|
|
DenseMap<MachineBasicBlock*, SparseBitVector<128> > tv;
|
|
DenseSet<edge_t> backedges;
|
|
SparseBitVector<128> backedge_source;
|
|
SparseBitVector<128> backedge_target;
|
|
SparseBitVector<128> calculated;
|
|
};
|
|
|
|
}
|
|
|
|
#endif
|
|
|