Passes.cpp revision 221345
1117397Skan//===-- Passes.cpp - Target independent code generation passes ------------===//
2117397Skan//
3117397Skan//                     The LLVM Compiler Infrastructure
4117397Skan//
5117397Skan// This file is distributed under the University of Illinois Open Source
6117397Skan// License. See LICENSE.TXT for details.
7117397Skan//
8117397Skan//===----------------------------------------------------------------------===//
9117397Skan//
10117397Skan// This file defines interfaces to access the target independent code
11117397Skan// generation passes provided by the LLVM backend.
12117397Skan//
13117397Skan//===---------------------------------------------------------------------===//
14117397Skan
15117397Skan#include "llvm/CodeGen/RegAllocRegistry.h"
16117397Skan#include "llvm/CodeGen/Passes.h"
17117397Skan
18169691Skanusing namespace llvm;
19117397Skan
20117397Skan//===---------------------------------------------------------------------===//
21117397Skan///
22117397Skan/// RegisterRegAlloc class - Track the registration of register allocators.
23117397Skan///
24117397Skan//===---------------------------------------------------------------------===//
25117397SkanMachinePassRegistry RegisterRegAlloc::Registry;
26117397Skan
27117397Skanstatic FunctionPass *createDefaultRegisterAllocator() { return 0; }
28117397Skanstatic RegisterRegAlloc
29117397SkandefaultRegAlloc("default",
30169691Skan                "pick register allocator based on -O option",
31169691Skan                createDefaultRegisterAllocator);
32169691Skan
33169691Skan//===---------------------------------------------------------------------===//
34169691Skan///
35117397Skan/// RegAlloc command line options.
36117397Skan///
37117397Skan//===---------------------------------------------------------------------===//
38117397Skanstatic cl::opt<RegisterRegAlloc::FunctionPassCtor, false,
39117397Skan               RegisterPassParser<RegisterRegAlloc> >
40117397SkanRegAlloc("regalloc",
41117397Skan         cl::init(&createDefaultRegisterAllocator),
42117397Skan         cl::desc("Register allocator to use"));
43117397Skan
44117397Skan
45117397Skan//===---------------------------------------------------------------------===//
46117397Skan///
47132720Skan/// createRegisterAllocator - choose the appropriate register allocator.
48117397Skan///
49117397Skan//===---------------------------------------------------------------------===//
50132720SkanFunctionPass *llvm::createRegisterAllocator(CodeGenOpt::Level OptLevel) {
51132720Skan  RegisterRegAlloc::FunctionPassCtor Ctor = RegisterRegAlloc::getDefault();
52132720Skan
53132720Skan  if (!Ctor) {
54132720Skan    Ctor = RegAlloc;
55132720Skan    RegisterRegAlloc::setDefault(RegAlloc);
56117397Skan  }
57117397Skan
58132720Skan  // This forces linking of the linear scan register allocator,
59117397Skan  // so -regalloc=linearscan still works in clang.
60117397Skan  if (Ctor == createLinearScanRegisterAllocator)
61132720Skan    return createLinearScanRegisterAllocator();
62132720Skan
63132720Skan  if (Ctor != createDefaultRegisterAllocator)
64132720Skan    return Ctor();
65132720Skan
66132720Skan  // When the 'default' allocator is requested, pick one based on OptLevel.
67117397Skan  switch (OptLevel) {
68117397Skan  case CodeGenOpt::None:
69117397Skan    return createFastRegisterAllocator();
70117397Skan  default:
71117397Skan    return createGreedyRegisterAllocator();
72117397Skan  }
73117397Skan}
74117397Skan