From 2f9b28e59a1e10152cd32f2c717e89d47a2fd7e3 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Mon, 4 Feb 2002 15:54:09 +0000 Subject: [PATCH] Convert RegisterAllocator interface to opaque pass type, so that users do not need to know _anything_ about RegAlloc to use it. Well in the end maybe. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@1681 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/CodeGen/RegisterAllocation.h | 8 ++--- lib/CodeGen/RegAlloc/PhyRegAlloc.cpp | 38 ++++++++++++++------- lib/Target/SparcV9/RegAlloc/PhyRegAlloc.cpp | 38 ++++++++++++++------- lib/Target/SparcV9/SparcV9TargetMachine.cpp | 2 +- 4 files changed, 55 insertions(+), 31 deletions(-) diff --git a/include/llvm/CodeGen/RegisterAllocation.h b/include/llvm/CodeGen/RegisterAllocation.h index 161be18498b..e552fbe887a 100644 --- a/include/llvm/CodeGen/RegisterAllocation.h +++ b/include/llvm/CodeGen/RegisterAllocation.h @@ -9,16 +9,12 @@ #include "llvm/Pass.h" class TargetMachine; +class MethodPass; //---------------------------------------------------------------------------- // Entry point for register allocation for a module //---------------------------------------------------------------------------- -class RegisterAllocation : public MethodPass { - TargetMachine &Target; -public: - inline RegisterAllocation(TargetMachine &T) : Target(T) {} - bool runOnMethod(Method *M); -}; +MethodPass *getRegisterAllocator(TargetMachine &T); #endif diff --git a/lib/CodeGen/RegAlloc/PhyRegAlloc.cpp b/lib/CodeGen/RegAlloc/PhyRegAlloc.cpp index 7efb469b457..46f045c5e27 100644 --- a/lib/CodeGen/RegAlloc/PhyRegAlloc.cpp +++ b/lib/CodeGen/RegAlloc/PhyRegAlloc.cpp @@ -32,21 +32,35 @@ cl::Enum DEBUG_RA("dregalloc", cl::NoFlags, clEnumValN(RA_DEBUG_Verbose, "v", "enable extra debug output"), 0); -bool RegisterAllocation::runOnMethod(Method *M) { - if (DEBUG_RA) - cerr << "\n******************** Method "<< M->getName() - << " ********************\n"; +//---------------------------------------------------------------------------- +// RegisterAllocation pass front end... +//---------------------------------------------------------------------------- +namespace { + class RegisterAllocator : public MethodPass { + TargetMachine &Target; + public: + inline RegisterAllocator(TargetMachine &T) : Target(T) {} - MethodLiveVarInfo LVI(M); // Analyze live varaibles - LVI.analyze(); - - PhyRegAlloc PRA(M, Target, &LVI); // allocate registers - PRA.allocateRegisters(); - - if (DEBUG_RA) cerr << "\nRegister allocation complete!\n"; - return false; + bool runOnMethod(Method *M) { + if (DEBUG_RA) + cerr << "\n******************** Method "<< M->getName() + << " ********************\n"; + + MethodLiveVarInfo LVI(M); // Analyze live varaibles + LVI.analyze(); + + PhyRegAlloc PRA(M, Target, &LVI); // allocate registers + PRA.allocateRegisters(); + + if (DEBUG_RA) cerr << "\nRegister allocation complete!\n"; + return false; + } + }; } +MethodPass *getRegisterAllocator(TargetMachine &T) { + return new RegisterAllocator(T); +} //---------------------------------------------------------------------------- // Constructor: Init local composite objects and create register classes. diff --git a/lib/Target/SparcV9/RegAlloc/PhyRegAlloc.cpp b/lib/Target/SparcV9/RegAlloc/PhyRegAlloc.cpp index 7efb469b457..46f045c5e27 100644 --- a/lib/Target/SparcV9/RegAlloc/PhyRegAlloc.cpp +++ b/lib/Target/SparcV9/RegAlloc/PhyRegAlloc.cpp @@ -32,21 +32,35 @@ cl::Enum DEBUG_RA("dregalloc", cl::NoFlags, clEnumValN(RA_DEBUG_Verbose, "v", "enable extra debug output"), 0); -bool RegisterAllocation::runOnMethod(Method *M) { - if (DEBUG_RA) - cerr << "\n******************** Method "<< M->getName() - << " ********************\n"; +//---------------------------------------------------------------------------- +// RegisterAllocation pass front end... +//---------------------------------------------------------------------------- +namespace { + class RegisterAllocator : public MethodPass { + TargetMachine &Target; + public: + inline RegisterAllocator(TargetMachine &T) : Target(T) {} - MethodLiveVarInfo LVI(M); // Analyze live varaibles - LVI.analyze(); - - PhyRegAlloc PRA(M, Target, &LVI); // allocate registers - PRA.allocateRegisters(); - - if (DEBUG_RA) cerr << "\nRegister allocation complete!\n"; - return false; + bool runOnMethod(Method *M) { + if (DEBUG_RA) + cerr << "\n******************** Method "<< M->getName() + << " ********************\n"; + + MethodLiveVarInfo LVI(M); // Analyze live varaibles + LVI.analyze(); + + PhyRegAlloc PRA(M, Target, &LVI); // allocate registers + PRA.allocateRegisters(); + + if (DEBUG_RA) cerr << "\nRegister allocation complete!\n"; + return false; + } + }; } +MethodPass *getRegisterAllocator(TargetMachine &T) { + return new RegisterAllocator(T); +} //---------------------------------------------------------------------------- // Constructor: Init local composite objects and create register classes. diff --git a/lib/Target/SparcV9/SparcV9TargetMachine.cpp b/lib/Target/SparcV9/SparcV9TargetMachine.cpp index b4e069453cc..91e51d88d28 100644 --- a/lib/Target/SparcV9/SparcV9TargetMachine.cpp +++ b/lib/Target/SparcV9/SparcV9TargetMachine.cpp @@ -260,7 +260,7 @@ void UltraSparc::addPassesToEmitAssembly(PassManager &PM, std::ostream &Out) { //PM.add(new InstructionScheduling(*this)); - PM.add(new RegisterAllocation(*this)); + PM.add(getRegisterAllocator(*this)); //PM.add(new OptimizeLeafProcedures()); //PM.add(new DeleteFallThroughBranches());