Move PPCFrameLowering into PPCSubtarget from PPCTargetMachine. Use
[oota-llvm.git] / lib / Target / PowerPC / PPCTargetMachine.cpp
1 //===-- PPCTargetMachine.cpp - Define TargetMachine for PowerPC -----------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // Top-level implementation for the PowerPC target.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #include "PPCTargetMachine.h"
15 #include "PPC.h"
16 #include "llvm/CodeGen/Passes.h"
17 #include "llvm/MC/MCStreamer.h"
18 #include "llvm/PassManager.h"
19 #include "llvm/Support/CommandLine.h"
20 #include "llvm/Support/FormattedStream.h"
21 #include "llvm/Support/TargetRegistry.h"
22 #include "llvm/Target/TargetOptions.h"
23 using namespace llvm;
24
25 static cl::
26 opt<bool> DisableCTRLoops("disable-ppc-ctrloops", cl::Hidden,
27                         cl::desc("Disable CTR loops for PPC"));
28
29 static cl::opt<bool>
30 VSXFMAMutateEarly("schedule-ppc-vsx-fma-mutation-early",
31   cl::Hidden, cl::desc("Schedule VSX FMA instruction mutation early"));
32
33 extern "C" void LLVMInitializePowerPCTarget() {
34   // Register the targets
35   RegisterTargetMachine<PPC32TargetMachine> A(ThePPC32Target);
36   RegisterTargetMachine<PPC64TargetMachine> B(ThePPC64Target);
37   RegisterTargetMachine<PPC64TargetMachine> C(ThePPC64LETarget);
38 }
39
40 /// Return the datalayout string of a subtarget.
41 static std::string getDataLayoutString(const PPCSubtarget &ST) {
42   const Triple &T = ST.getTargetTriple();
43
44   std::string Ret;
45
46   // Most PPC* platforms are big endian, PPC64LE is little endian.
47   if (ST.isLittleEndian())
48     Ret = "e";
49   else
50     Ret = "E";
51
52   Ret += DataLayout::getManglingComponent(T);
53
54   // PPC32 has 32 bit pointers. The PS3 (OS Lv2) is a PPC64 machine with 32 bit
55   // pointers.
56   if (!ST.isPPC64() || T.getOS() == Triple::Lv2)
57     Ret += "-p:32:32";
58
59   // Note, the alignment values for f64 and i64 on ppc64 in Darwin
60   // documentation are wrong; these are correct (i.e. "what gcc does").
61   if (ST.isPPC64() || ST.isSVR4ABI())
62     Ret += "-i64:64";
63   else
64     Ret += "-f64:32:64";
65
66   // PPC64 has 32 and 64 bit registers, PPC32 has only 32 bit ones.
67   if (ST.isPPC64())
68     Ret += "-n32:64";
69   else
70     Ret += "-n32";
71
72   return Ret;
73 }
74
75 PPCTargetMachine::PPCTargetMachine(const Target &T, StringRef TT, StringRef CPU,
76                                    StringRef FS, const TargetOptions &Options,
77                                    Reloc::Model RM, CodeModel::Model CM,
78                                    CodeGenOpt::Level OL, bool is64Bit)
79     : LLVMTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL),
80       Subtarget(TT, CPU, FS, is64Bit, OL), DL(getDataLayoutString(Subtarget)),
81       InstrInfo(*this), JITInfo(*this, is64Bit), TLInfo(*this), TSInfo(*this) {
82   initAsmInfo();
83 }
84
85 void PPC32TargetMachine::anchor() { }
86
87 PPC32TargetMachine::PPC32TargetMachine(const Target &T, StringRef TT,
88                                        StringRef CPU, StringRef FS,
89                                        const TargetOptions &Options,
90                                        Reloc::Model RM, CodeModel::Model CM,
91                                        CodeGenOpt::Level OL)
92   : PPCTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL, false) {
93 }
94
95 void PPC64TargetMachine::anchor() { }
96
97 PPC64TargetMachine::PPC64TargetMachine(const Target &T, StringRef TT,
98                                        StringRef CPU,  StringRef FS,
99                                        const TargetOptions &Options,
100                                        Reloc::Model RM, CodeModel::Model CM,
101                                        CodeGenOpt::Level OL)
102   : PPCTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL, true) {
103 }
104
105
106 //===----------------------------------------------------------------------===//
107 // Pass Pipeline Configuration
108 //===----------------------------------------------------------------------===//
109
110 namespace {
111 /// PPC Code Generator Pass Configuration Options.
112 class PPCPassConfig : public TargetPassConfig {
113 public:
114   PPCPassConfig(PPCTargetMachine *TM, PassManagerBase &PM)
115     : TargetPassConfig(TM, PM) {}
116
117   PPCTargetMachine &getPPCTargetMachine() const {
118     return getTM<PPCTargetMachine>();
119   }
120
121   const PPCSubtarget &getPPCSubtarget() const {
122     return *getPPCTargetMachine().getSubtargetImpl();
123   }
124
125   bool addPreISel() override;
126   bool addILPOpts() override;
127   bool addInstSelector() override;
128   bool addPreRegAlloc() override;
129   bool addPreSched2() override;
130   bool addPreEmitPass() override;
131 };
132 } // namespace
133
134 TargetPassConfig *PPCTargetMachine::createPassConfig(PassManagerBase &PM) {
135   return new PPCPassConfig(this, PM);
136 }
137
138 bool PPCPassConfig::addPreISel() {
139   if (!DisableCTRLoops && getOptLevel() != CodeGenOpt::None)
140     addPass(createPPCCTRLoops(getPPCTargetMachine()));
141
142   return false;
143 }
144
145 bool PPCPassConfig::addILPOpts() {
146   addPass(&EarlyIfConverterID);
147   return true;
148 }
149
150 bool PPCPassConfig::addInstSelector() {
151   // Install an instruction selector.
152   addPass(createPPCISelDag(getPPCTargetMachine()));
153
154 #ifndef NDEBUG
155   if (!DisableCTRLoops && getOptLevel() != CodeGenOpt::None)
156     addPass(createPPCCTRLoopsVerify());
157 #endif
158
159   addPass(createPPCVSXCopyPass());
160   return false;
161 }
162
163 bool PPCPassConfig::addPreRegAlloc() {
164   initializePPCVSXFMAMutatePass(*PassRegistry::getPassRegistry());
165   insertPass(VSXFMAMutateEarly ? &RegisterCoalescerID : &MachineSchedulerID,
166              &PPCVSXFMAMutateID);
167   return false;
168 }
169
170 bool PPCPassConfig::addPreSched2() {
171   addPass(createPPCVSXCopyCleanupPass());
172
173   if (getOptLevel() != CodeGenOpt::None)
174     addPass(&IfConverterID);
175
176   return true;
177 }
178
179 bool PPCPassConfig::addPreEmitPass() {
180   if (getOptLevel() != CodeGenOpt::None)
181     addPass(createPPCEarlyReturnPass());
182   // Must run branch selection immediately preceding the asm printer.
183   addPass(createPPCBranchSelectionPass());
184   return false;
185 }
186
187 bool PPCTargetMachine::addCodeEmitter(PassManagerBase &PM,
188                                       JITCodeEmitter &JCE) {
189   // Inform the subtarget that we are in JIT mode.  FIXME: does this break macho
190   // writing?
191   Subtarget.SetJITMode();
192
193   // Machine code emitter pass for PowerPC.
194   PM.add(createPPCJITCodeEmitterPass(*this, JCE));
195
196   return false;
197 }
198
199 void PPCTargetMachine::addAnalysisPasses(PassManagerBase &PM) {
200   // Add first the target-independent BasicTTI pass, then our PPC pass. This
201   // allows the PPC pass to delegate to the target independent layer when
202   // appropriate.
203   PM.add(createBasicTargetTransformInfoPass(this));
204   PM.add(createPPCTargetTransformInfoPass(this));
205 }
206