llvm.org GIT mirror llvm / release_30 lib / CodeGen / Passes.cpp
release_30

Tree @release_30 (Download .tar.gz)

Passes.cpp @release_30

aa4c91f
edf128a
b576c94
 
4ee451d
 
edf128a
b576c94
7237ece
 
 
 
 
 
eb577ba
7237ece
13ec702
aa4c91f
d0fde30
eb577ba
 
 
 
 
 
 
700bfad
 
 
 
 
eb577ba
 
 
 
 
 
844731a
 
 
700bfad
 
33a0a6d
eb577ba
 
 
 
 
 
700bfad
9ff542f
700bfad
13ec702
eb577ba
 
13ec702
700bfad
141f529
 
5aa3211
 
430721c
700bfad
 
 
 
 
 
8b89c64
700bfad
5aa3211
700bfad
33a0a6d
//===-- Passes.cpp - Target independent code generation passes ------------===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file defines interfaces to access the target independent code
// generation passes provided by the LLVM backend.
//
//===---------------------------------------------------------------------===//

#include "llvm/CodeGen/RegAllocRegistry.h"
#include "llvm/CodeGen/Passes.h"

using namespace llvm;

//===---------------------------------------------------------------------===//
///
/// RegisterRegAlloc class - Track the registration of register allocators.
///
//===---------------------------------------------------------------------===//
MachinePassRegistry RegisterRegAlloc::Registry;

static FunctionPass *createDefaultRegisterAllocator() { return 0; }
static RegisterRegAlloc
defaultRegAlloc("default",
                "pick register allocator based on -O option",
                createDefaultRegisterAllocator);

//===---------------------------------------------------------------------===//
///
/// RegAlloc command line options.
///
//===---------------------------------------------------------------------===//
static cl::opt<RegisterRegAlloc::FunctionPassCtor, false,
               RegisterPassParser<RegisterRegAlloc> >
RegAlloc("regalloc",
         cl::init(&createDefaultRegisterAllocator),
         cl::desc("Register allocator to use"));


//===---------------------------------------------------------------------===//
///
/// createRegisterAllocator - choose the appropriate register allocator.
///
//===---------------------------------------------------------------------===//
FunctionPass *llvm::createRegisterAllocator(CodeGenOpt::Level OptLevel) {
  RegisterRegAlloc::FunctionPassCtor Ctor = RegisterRegAlloc::getDefault();

  if (!Ctor) {
    Ctor = RegAlloc;
    RegisterRegAlloc::setDefault(RegAlloc);
  }

  // This forces linking of the linear scan register allocator,
  // so -regalloc=linearscan still works in clang.
  if (Ctor == createLinearScanRegisterAllocator)
    return createLinearScanRegisterAllocator();

  if (Ctor != createDefaultRegisterAllocator)
    return Ctor();

  // When the 'default' allocator is requested, pick one based on OptLevel.
  switch (OptLevel) {
  case CodeGenOpt::None:
    return createFastRegisterAllocator();
  default:
    return createGreedyRegisterAllocator();
  }
}