mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-28 21:34:23 +00:00
Remove the PHIElimination.h header, as it is no longer needed.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@120959 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
1324289d24
commit
0a3fdd6e11
@ -14,7 +14,6 @@
|
|||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
#define DEBUG_TYPE "phielim"
|
#define DEBUG_TYPE "phielim"
|
||||||
#include "PHIElimination.h"
|
|
||||||
#include "PHIEliminationUtils.h"
|
#include "PHIEliminationUtils.h"
|
||||||
#include "llvm/CodeGen/LiveVariables.h"
|
#include "llvm/CodeGen/LiveVariables.h"
|
||||||
#include "llvm/CodeGen/Passes.h"
|
#include "llvm/CodeGen/Passes.h"
|
||||||
@ -35,6 +34,54 @@
|
|||||||
#include <map>
|
#include <map>
|
||||||
using namespace llvm;
|
using namespace llvm;
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
class PHIElimination : public MachineFunctionPass {
|
||||||
|
MachineRegisterInfo *MRI; // Machine register information
|
||||||
|
|
||||||
|
public:
|
||||||
|
static char ID; // Pass identification, replacement for typeid
|
||||||
|
PHIElimination() : MachineFunctionPass(ID) {
|
||||||
|
initializePHIEliminationPass(*PassRegistry::getPassRegistry());
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual bool runOnMachineFunction(MachineFunction &Fn);
|
||||||
|
virtual void getAnalysisUsage(AnalysisUsage &AU) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
/// EliminatePHINodes - Eliminate phi nodes by inserting copy instructions
|
||||||
|
/// in predecessor basic blocks.
|
||||||
|
///
|
||||||
|
bool EliminatePHINodes(MachineFunction &MF, MachineBasicBlock &MBB);
|
||||||
|
void LowerAtomicPHINode(MachineBasicBlock &MBB,
|
||||||
|
MachineBasicBlock::iterator AfterPHIsIt);
|
||||||
|
|
||||||
|
/// analyzePHINodes - Gather information about the PHI nodes in
|
||||||
|
/// here. In particular, we want to map the number of uses of a virtual
|
||||||
|
/// register which is used in a PHI node. We map that to the BB the
|
||||||
|
/// vreg is coming from. This is used later to determine when the vreg
|
||||||
|
/// is killed in the BB.
|
||||||
|
///
|
||||||
|
void analyzePHINodes(const MachineFunction& Fn);
|
||||||
|
|
||||||
|
/// Split critical edges where necessary for good coalescer performance.
|
||||||
|
bool SplitPHIEdges(MachineFunction &MF, MachineBasicBlock &MBB,
|
||||||
|
LiveVariables &LV, MachineLoopInfo *MLI);
|
||||||
|
|
||||||
|
typedef std::pair<unsigned, unsigned> BBVRegPair;
|
||||||
|
typedef DenseMap<BBVRegPair, unsigned> VRegPHIUse;
|
||||||
|
|
||||||
|
VRegPHIUse VRegPHIUseCount;
|
||||||
|
|
||||||
|
// Defs of PHI sources which are implicit_def.
|
||||||
|
SmallPtrSet<MachineInstr*, 4> ImpDefs;
|
||||||
|
|
||||||
|
// Map reusable lowered PHI node -> incoming join register.
|
||||||
|
typedef DenseMap<MachineInstr*, unsigned,
|
||||||
|
MachineInstrExpressionTrait> LoweredPHIMap;
|
||||||
|
LoweredPHIMap LoweredPHIs;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
STATISTIC(NumAtomic, "Number of atomic phis lowered");
|
STATISTIC(NumAtomic, "Number of atomic phis lowered");
|
||||||
STATISTIC(NumReused, "Number of reused lowered phis");
|
STATISTIC(NumReused, "Number of reused lowered phis");
|
||||||
|
|
||||||
@ -42,16 +89,16 @@ char PHIElimination::ID = 0;
|
|||||||
INITIALIZE_PASS(PHIElimination, "phi-node-elimination",
|
INITIALIZE_PASS(PHIElimination, "phi-node-elimination",
|
||||||
"Eliminate PHI nodes for register allocation", false, false)
|
"Eliminate PHI nodes for register allocation", false, false)
|
||||||
|
|
||||||
char &llvm::PHIEliminationID = PHIElimination::ID;
|
char& llvm::PHIEliminationID = PHIElimination::ID;
|
||||||
|
|
||||||
void llvm::PHIElimination::getAnalysisUsage(AnalysisUsage &AU) const {
|
void PHIElimination::getAnalysisUsage(AnalysisUsage &AU) const {
|
||||||
AU.addPreserved<LiveVariables>();
|
AU.addPreserved<LiveVariables>();
|
||||||
AU.addPreserved<MachineDominatorTree>();
|
AU.addPreserved<MachineDominatorTree>();
|
||||||
AU.addPreserved<MachineLoopInfo>();
|
AU.addPreserved<MachineLoopInfo>();
|
||||||
MachineFunctionPass::getAnalysisUsage(AU);
|
MachineFunctionPass::getAnalysisUsage(AU);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool llvm::PHIElimination::runOnMachineFunction(MachineFunction &MF) {
|
bool PHIElimination::runOnMachineFunction(MachineFunction &MF) {
|
||||||
MRI = &MF.getRegInfo();
|
MRI = &MF.getRegInfo();
|
||||||
|
|
||||||
bool Changed = false;
|
bool Changed = false;
|
||||||
@ -94,7 +141,7 @@ bool llvm::PHIElimination::runOnMachineFunction(MachineFunction &MF) {
|
|||||||
/// EliminatePHINodes - Eliminate phi nodes by inserting copy instructions in
|
/// EliminatePHINodes - Eliminate phi nodes by inserting copy instructions in
|
||||||
/// predecessor basic blocks.
|
/// predecessor basic blocks.
|
||||||
///
|
///
|
||||||
bool llvm::PHIElimination::EliminatePHINodes(MachineFunction &MF,
|
bool PHIElimination::EliminatePHINodes(MachineFunction &MF,
|
||||||
MachineBasicBlock &MBB) {
|
MachineBasicBlock &MBB) {
|
||||||
if (MBB.empty() || !MBB.front().isPHI())
|
if (MBB.empty() || !MBB.front().isPHI())
|
||||||
return false; // Quick exit for basic blocks without PHIs.
|
return false; // Quick exit for basic blocks without PHIs.
|
||||||
@ -129,7 +176,7 @@ static bool isSourceDefinedByImplicitDef(const MachineInstr *MPhi,
|
|||||||
/// atomic execution of PHIs. This lowering method is always correct all of the
|
/// atomic execution of PHIs. This lowering method is always correct all of the
|
||||||
/// time.
|
/// time.
|
||||||
///
|
///
|
||||||
void llvm::PHIElimination::LowerAtomicPHINode(
|
void PHIElimination::LowerAtomicPHINode(
|
||||||
MachineBasicBlock &MBB,
|
MachineBasicBlock &MBB,
|
||||||
MachineBasicBlock::iterator AfterPHIsIt) {
|
MachineBasicBlock::iterator AfterPHIsIt) {
|
||||||
++NumAtomic;
|
++NumAtomic;
|
||||||
@ -328,7 +375,7 @@ void llvm::PHIElimination::LowerAtomicPHINode(
|
|||||||
/// used in a PHI node. We map that to the BB the vreg is coming from. This is
|
/// used in a PHI node. We map that to the BB the vreg is coming from. This is
|
||||||
/// used later to determine when the vreg is killed in the BB.
|
/// used later to determine when the vreg is killed in the BB.
|
||||||
///
|
///
|
||||||
void llvm::PHIElimination::analyzePHINodes(const MachineFunction& MF) {
|
void PHIElimination::analyzePHINodes(const MachineFunction& MF) {
|
||||||
for (MachineFunction::const_iterator I = MF.begin(), E = MF.end();
|
for (MachineFunction::const_iterator I = MF.begin(), E = MF.end();
|
||||||
I != E; ++I)
|
I != E; ++I)
|
||||||
for (MachineBasicBlock::const_iterator BBI = I->begin(), BBE = I->end();
|
for (MachineBasicBlock::const_iterator BBI = I->begin(), BBE = I->end();
|
||||||
@ -338,7 +385,7 @@ void llvm::PHIElimination::analyzePHINodes(const MachineFunction& MF) {
|
|||||||
BBI->getOperand(i).getReg())];
|
BBI->getOperand(i).getReg())];
|
||||||
}
|
}
|
||||||
|
|
||||||
bool llvm::PHIElimination::SplitPHIEdges(MachineFunction &MF,
|
bool PHIElimination::SplitPHIEdges(MachineFunction &MF,
|
||||||
MachineBasicBlock &MBB,
|
MachineBasicBlock &MBB,
|
||||||
LiveVariables &LV,
|
LiveVariables &LV,
|
||||||
MachineLoopInfo *MLI) {
|
MachineLoopInfo *MLI) {
|
||||||
|
@ -1,74 +0,0 @@
|
|||||||
//===-- lib/CodeGen/PHIElimination.h ----------------------------*- C++ -*-===//
|
|
||||||
//
|
|
||||||
// The LLVM Compiler Infrastructure
|
|
||||||
//
|
|
||||||
// This file is distributed under the University of Illinois Open Source
|
|
||||||
// License. See LICENSE.TXT for details.
|
|
||||||
//
|
|
||||||
//===----------------------------------------------------------------------===//
|
|
||||||
|
|
||||||
#ifndef LLVM_CODEGEN_PHIELIMINATION_HPP
|
|
||||||
#define LLVM_CODEGEN_PHIELIMINATION_HPP
|
|
||||||
|
|
||||||
#include "llvm/ADT/DenseMap.h"
|
|
||||||
#include "llvm/ADT/SmallSet.h"
|
|
||||||
#include "llvm/ADT/SmallPtrSet.h"
|
|
||||||
#include "llvm/CodeGen/MachineBasicBlock.h"
|
|
||||||
#include "llvm/CodeGen/MachineFunctionPass.h"
|
|
||||||
|
|
||||||
namespace llvm {
|
|
||||||
class LiveVariables;
|
|
||||||
class MachineRegisterInfo;
|
|
||||||
class MachineLoopInfo;
|
|
||||||
|
|
||||||
/// Lower PHI instructions to copies.
|
|
||||||
class PHIElimination : public MachineFunctionPass {
|
|
||||||
MachineRegisterInfo *MRI; // Machine register information
|
|
||||||
|
|
||||||
public:
|
|
||||||
static char ID; // Pass identification, replacement for typeid
|
|
||||||
PHIElimination() : MachineFunctionPass(ID) {
|
|
||||||
initializePHIEliminationPass(*PassRegistry::getPassRegistry());
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual bool runOnMachineFunction(MachineFunction &Fn);
|
|
||||||
|
|
||||||
virtual void getAnalysisUsage(AnalysisUsage &AU) const;
|
|
||||||
|
|
||||||
private:
|
|
||||||
/// EliminatePHINodes - Eliminate phi nodes by inserting copy instructions
|
|
||||||
/// in predecessor basic blocks.
|
|
||||||
///
|
|
||||||
bool EliminatePHINodes(MachineFunction &MF, MachineBasicBlock &MBB);
|
|
||||||
void LowerAtomicPHINode(MachineBasicBlock &MBB,
|
|
||||||
MachineBasicBlock::iterator AfterPHIsIt);
|
|
||||||
|
|
||||||
/// analyzePHINodes - Gather information about the PHI nodes in
|
|
||||||
/// here. In particular, we want to map the number of uses of a virtual
|
|
||||||
/// register which is used in a PHI node. We map that to the BB the
|
|
||||||
/// vreg is coming from. This is used later to determine when the vreg
|
|
||||||
/// is killed in the BB.
|
|
||||||
///
|
|
||||||
void analyzePHINodes(const MachineFunction& Fn);
|
|
||||||
|
|
||||||
/// Split critical edges where necessary for good coalescer performance.
|
|
||||||
bool SplitPHIEdges(MachineFunction &MF, MachineBasicBlock &MBB,
|
|
||||||
LiveVariables &LV, MachineLoopInfo *MLI);
|
|
||||||
|
|
||||||
typedef std::pair<unsigned, unsigned> BBVRegPair;
|
|
||||||
typedef DenseMap<BBVRegPair, unsigned> VRegPHIUse;
|
|
||||||
|
|
||||||
VRegPHIUse VRegPHIUseCount;
|
|
||||||
|
|
||||||
// Defs of PHI sources which are implicit_def.
|
|
||||||
SmallPtrSet<MachineInstr*, 4> ImpDefs;
|
|
||||||
|
|
||||||
// Map reusable lowered PHI node -> incoming join register.
|
|
||||||
typedef DenseMap<MachineInstr*, unsigned,
|
|
||||||
MachineInstrExpressionTrait> LoweredPHIMap;
|
|
||||||
LoweredPHIMap LoweredPHIs;
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* LLVM_CODEGEN_PHIELIMINATION_HPP */
|
|
Loading…
x
Reference in New Issue
Block a user