mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-11-02 07:17:36 +00:00
Add a MachinePostDominator pass
This is used in the AMDIL and R600 backends. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@164029 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
85
include/llvm/CodeGen/MachinePostDominators.h
Normal file
85
include/llvm/CodeGen/MachinePostDominators.h
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
//=- llvm/CodeGen/MachineDominators.h ----------------------------*- C++ -*-==//
|
||||||
|
//
|
||||||
|
// The LLVM Compiler Infrastructure
|
||||||
|
//
|
||||||
|
// This file is distributed under the University of Illinois Open Source
|
||||||
|
// License. See LICENSE.TXT for details.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
//
|
||||||
|
// This file exposes interfaces to post dominance information for
|
||||||
|
// target-specific code.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
#ifndef LLVM_CODEGEN_MACHINEPOSTDOMINATORS_H
|
||||||
|
#define LLVM_CODEGEN_MACHINEPOSTDOMINATORS_H
|
||||||
|
|
||||||
|
#include "llvm/CodeGen/MachineFunctionPass.h"
|
||||||
|
#include "llvm/CodeGen/MachineDominators.h"
|
||||||
|
#include "llvm/Analysis/Dominators.h"
|
||||||
|
#include "llvm/Analysis/DominatorInternals.h"
|
||||||
|
|
||||||
|
namespace llvm {
|
||||||
|
|
||||||
|
///
|
||||||
|
/// PostDominatorTree Class - Concrete subclass of DominatorTree that is used
|
||||||
|
/// to compute the a post-dominator tree.
|
||||||
|
///
|
||||||
|
struct MachinePostDominatorTree : public MachineFunctionPass {
|
||||||
|
static char ID;
|
||||||
|
|
||||||
|
DominatorTreeBase<MachineBasicBlock> *DT;
|
||||||
|
|
||||||
|
MachinePostDominatorTree();
|
||||||
|
|
||||||
|
~MachinePostDominatorTree();
|
||||||
|
|
||||||
|
FunctionPass *createMachinePostDominatorTreePass();
|
||||||
|
|
||||||
|
const std::vector<MachineBasicBlock *> &getRoots() const {
|
||||||
|
return DT->getRoots();
|
||||||
|
}
|
||||||
|
|
||||||
|
MachineDomTreeNode *getRootNode() const {
|
||||||
|
return DT->getRootNode();
|
||||||
|
}
|
||||||
|
|
||||||
|
MachineDomTreeNode *operator[](MachineBasicBlock *BB) const {
|
||||||
|
return DT->getNode(BB);
|
||||||
|
}
|
||||||
|
|
||||||
|
MachineDomTreeNode *getNode(MachineBasicBlock *BB) const {
|
||||||
|
return DT->getNode(BB);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool dominates(MachineDomTreeNode *A, MachineDomTreeNode *B) const {
|
||||||
|
return DT->dominates(A, B);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool dominates(MachineBasicBlock *A, MachineBasicBlock *B) const {
|
||||||
|
return DT->dominates(A, B);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
properlyDominates(const MachineDomTreeNode *A, MachineDomTreeNode *B) const {
|
||||||
|
return DT->properlyDominates(A, B);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
properlyDominates(MachineBasicBlock *A, MachineBasicBlock *B) const {
|
||||||
|
return DT->properlyDominates(A, B);
|
||||||
|
}
|
||||||
|
|
||||||
|
MachineBasicBlock *findNearestCommonDominator(MachineBasicBlock *A,
|
||||||
|
MachineBasicBlock *B) {
|
||||||
|
return DT->findNearestCommonDominator(A, B);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual bool runOnMachineFunction(MachineFunction &MF);
|
||||||
|
virtual void getAnalysisUsage(AnalysisUsage &AU) const;
|
||||||
|
virtual void print(llvm::raw_ostream &OS, const Module *M = 0) const;
|
||||||
|
};
|
||||||
|
} //end of namespace llvm
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -167,6 +167,7 @@ void initializeMachineBlockPlacementStatsPass(PassRegistry&);
|
|||||||
void initializeMachineBranchProbabilityInfoPass(PassRegistry&);
|
void initializeMachineBranchProbabilityInfoPass(PassRegistry&);
|
||||||
void initializeMachineCSEPass(PassRegistry&);
|
void initializeMachineCSEPass(PassRegistry&);
|
||||||
void initializeMachineDominatorTreePass(PassRegistry&);
|
void initializeMachineDominatorTreePass(PassRegistry&);
|
||||||
|
void initializeMachinePostDominatorTreePass(PassRegistry&);
|
||||||
void initializeMachineLICMPass(PassRegistry&);
|
void initializeMachineLICMPass(PassRegistry&);
|
||||||
void initializeMachineLoopInfoPass(PassRegistry&);
|
void initializeMachineLoopInfoPass(PassRegistry&);
|
||||||
void initializeMachineLoopRangesPass(PassRegistry&);
|
void initializeMachineLoopRangesPass(PassRegistry&);
|
||||||
|
|||||||
@@ -45,6 +45,7 @@ add_llvm_library(LLVMCodeGen
|
|||||||
MachineCopyPropagation.cpp
|
MachineCopyPropagation.cpp
|
||||||
MachineCSE.cpp
|
MachineCSE.cpp
|
||||||
MachineDominators.cpp
|
MachineDominators.cpp
|
||||||
|
MachinePostDominators.cpp
|
||||||
MachineFunction.cpp
|
MachineFunction.cpp
|
||||||
MachineFunctionAnalysis.cpp
|
MachineFunctionAnalysis.cpp
|
||||||
MachineFunctionPass.cpp
|
MachineFunctionPass.cpp
|
||||||
|
|||||||
@@ -41,6 +41,7 @@ void llvm::initializeCodeGen(PassRegistry &Registry) {
|
|||||||
initializeMachineCopyPropagationPass(Registry);
|
initializeMachineCopyPropagationPass(Registry);
|
||||||
initializeMachineCSEPass(Registry);
|
initializeMachineCSEPass(Registry);
|
||||||
initializeMachineDominatorTreePass(Registry);
|
initializeMachineDominatorTreePass(Registry);
|
||||||
|
initializeMachinePostDominatorTreePass(Registry);
|
||||||
initializeMachineLICMPass(Registry);
|
initializeMachineLICMPass(Registry);
|
||||||
initializeMachineLoopInfoPass(Registry);
|
initializeMachineLoopInfoPass(Registry);
|
||||||
initializeMachineModuleInfoPass(Registry);
|
initializeMachineModuleInfoPass(Registry);
|
||||||
|
|||||||
55
lib/CodeGen/MachinePostDominators.cpp
Normal file
55
lib/CodeGen/MachinePostDominators.cpp
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
//===- MachinePostDominators.cpp -Machine Post Dominator Calculation ------===//
|
||||||
|
//
|
||||||
|
// The LLVM Compiler Infrastructure
|
||||||
|
//
|
||||||
|
// This file is distributed under the University of Illinois Open Source
|
||||||
|
// License. See LICENSE.TXT for details.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
//
|
||||||
|
// This file implements simple dominator construction algorithms for finding
|
||||||
|
// post dominators on machine functions.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
#include "llvm/CodeGen/MachinePostDominators.h"
|
||||||
|
|
||||||
|
using namespace llvm;
|
||||||
|
|
||||||
|
char MachinePostDominatorTree::ID = 0;
|
||||||
|
|
||||||
|
//declare initializeMachinePostDominatorTreePass
|
||||||
|
INITIALIZE_PASS(MachinePostDominatorTree, "machinepostdomtree",
|
||||||
|
"MachinePostDominator Tree Construction", true, true)
|
||||||
|
|
||||||
|
MachinePostDominatorTree::MachinePostDominatorTree() : MachineFunctionPass(ID) {
|
||||||
|
initializeMachinePostDominatorTreePass(*PassRegistry::getPassRegistry());
|
||||||
|
DT = new DominatorTreeBase<MachineBasicBlock>(true); //true indicate
|
||||||
|
// postdominator
|
||||||
|
}
|
||||||
|
|
||||||
|
FunctionPass *
|
||||||
|
MachinePostDominatorTree::createMachinePostDominatorTreePass() {
|
||||||
|
return new MachinePostDominatorTree();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
MachinePostDominatorTree::runOnMachineFunction(MachineFunction &F) {
|
||||||
|
DT->recalculate(F);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
MachinePostDominatorTree::~MachinePostDominatorTree() {
|
||||||
|
delete DT;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
MachinePostDominatorTree::getAnalysisUsage(AnalysisUsage &AU) const {
|
||||||
|
AU.setPreservesAll();
|
||||||
|
MachineFunctionPass::getAnalysisUsage(AU);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
MachinePostDominatorTree::print(llvm::raw_ostream &OS, const Module *M) const {
|
||||||
|
DT->print(OS);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user