From 09e8ca8a582bb67ef290d77d9b9441716dd6ba2e Mon Sep 17 00:00:00 2001 From: Evan Cheng Date: Mon, 20 Oct 2008 21:44:59 +0000 Subject: [PATCH] Add skeleton for the pre-register allocation live interval splitting pass. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@57847 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/CodeGen/Passes.h | 2 + lib/CodeGen/PreAllocSplitting.cpp | 81 +++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+) create mode 100644 lib/CodeGen/PreAllocSplitting.cpp diff --git a/include/llvm/CodeGen/Passes.h b/include/llvm/CodeGen/Passes.h index e07f7de12ac..6357f0635bf 100644 --- a/include/llvm/CodeGen/Passes.h +++ b/include/llvm/CodeGen/Passes.h @@ -61,6 +61,8 @@ namespace llvm { /// This pass is still in development extern const PassInfo *const StrongPHIEliminationID; + extern const PassInfo *const PreAllocSplittingID; + /// SimpleRegisterCoalescing pass. Aggressively coalesces every register /// copy it can. /// diff --git a/lib/CodeGen/PreAllocSplitting.cpp b/lib/CodeGen/PreAllocSplitting.cpp new file mode 100644 index 00000000000..7b4ec8efbcf --- /dev/null +++ b/lib/CodeGen/PreAllocSplitting.cpp @@ -0,0 +1,81 @@ +//===-- PreAllocSplitting.cpp - Pre-allocation Interval Spltting Pass. ----===// +// +// 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 machine instruction level pre-register allocation +// live interval splitting pass. It finds live interval barriers, i.e. +// instructions which will kill all physical registers in certain register +// classes, and split all live intervals which cross the barrier. +// +//===----------------------------------------------------------------------===// + +#define DEBUG_TYPE "pre-alloc-split" +#include "llvm/CodeGen/LiveIntervalAnalysis.h" +#include "llvm/CodeGen/MachineFunctionPass.h" +#include "llvm/CodeGen/MachineLoopInfo.h" +#include "llvm/CodeGen/MachineRegisterInfo.h" +#include "llvm/CodeGen/Passes.h" +#include "llvm/CodeGen/RegisterCoalescer.h" +#include "llvm/Target/TargetMachine.h" +#include "llvm/Target/TargetOptions.h" +#include "llvm/Target/TargetRegisterInfo.h" +#include "llvm/Support/CommandLine.h" +#include "llvm/Support/Debug.h" +#include "llvm/ADT/PostOrderIterator.h" +#include "llvm/ADT/SmallPtrSet.h" +using namespace llvm; + +namespace { + class VISIBILITY_HIDDEN PreAllocSplitting : public MachineFunctionPass { + // ProcessedBarriers - Register live interval barriers that have already + // been processed. + SmallPtrSet ProcessedBarriers; + + // ActiveBarriers - Register live interval barriers that are currently + // being processed. + SmallSet ActiveBarriers; + public: + static char ID; + PreAllocSplitting() : MachineFunctionPass(&ID) {} + + virtual bool runOnMachineFunction(MachineFunction &MF); + + virtual void getAnalysisUsage(AnalysisUsage &AU) const { + AU.addRequired(); + AU.addPreserved(); + AU.addPreserved(); + AU.addPreserved(); + if (StrongPHIElim) + AU.addPreservedID(StrongPHIEliminationID); + else + AU.addPreservedID(PHIEliminationID); + AU.addPreservedID(TwoAddressInstructionPassID); + MachineFunctionPass::getAnalysisUsage(AU); + } + + virtual void releaseMemory() { + ProcessedBarriers.clear(); + ActiveBarriers.clear(); + } + + virtual const char *getPassName() const { + return "Pre-Register Allocaton Live Interval Splitting"; + } + }; +} // end anonymous namespace + +char PreAllocSplitting::ID = 0; + +static RegisterPass +X("pre-alloc-splitting", "Pre-Register Allocation Live Interval Splitting"); + +const PassInfo *const llvm::PreAllocSplittingID = &X; + +bool PreAllocSplitting::runOnMachineFunction(MachineFunction &MF) { + return false; +}