Have ARMSelectionDAGInfo take a DataLayout as it's argument as the
[oota-llvm.git] / lib / Target / ARM / ARMTargetMachine.cpp
1 //===-- ARMTargetMachine.cpp - Define TargetMachine for ARM ---------------===//
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 //
11 //===----------------------------------------------------------------------===//
12
13 #include "ARM.h"
14 #include "ARMTargetMachine.h"
15 #include "ARMFrameLowering.h"
16 #include "llvm/CodeGen/Passes.h"
17 #include "llvm/MC/MCAsmInfo.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 #include "llvm/Transforms/Scalar.h"
24 using namespace llvm;
25
26 static cl::opt<bool>
27 DisableA15SDOptimization("disable-a15-sd-optimization", cl::Hidden,
28                    cl::desc("Inhibit optimization of S->D register accesses on A15"),
29                    cl::init(false));
30
31 static cl::opt<bool>
32 EnableAtomicTidy("arm-atomic-cfg-tidy", cl::Hidden,
33                  cl::desc("Run SimplifyCFG after expanding atomic operations"
34                           " to make use of cmpxchg flow-based information"),
35                  cl::init(true));
36
37 extern "C" void LLVMInitializeARMTarget() {
38   // Register the target.
39   RegisterTargetMachine<ARMLETargetMachine> X(TheARMLETarget);
40   RegisterTargetMachine<ARMBETargetMachine> Y(TheARMBETarget);
41   RegisterTargetMachine<ThumbLETargetMachine> A(TheThumbLETarget);
42   RegisterTargetMachine<ThumbBETargetMachine> B(TheThumbBETarget);
43 }
44
45
46 /// TargetMachine ctor - Create an ARM architecture model.
47 ///
48 ARMBaseTargetMachine::ARMBaseTargetMachine(const Target &T, StringRef TT,
49                                            StringRef CPU, StringRef FS,
50                                            const TargetOptions &Options,
51                                            Reloc::Model RM, CodeModel::Model CM,
52                                            CodeGenOpt::Level OL,
53                                            bool isLittle)
54   : LLVMTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL),
55     Subtarget(TT, CPU, FS, isLittle, Options),
56     JITInfo(),
57     InstrItins(Subtarget.getInstrItineraryData()) {
58
59   // Default to triple-appropriate float ABI
60   if (Options.FloatABIType == FloatABI::Default)
61     this->Options.FloatABIType =
62         Subtarget.isTargetHardFloat() ? FloatABI::Hard : FloatABI::Soft;
63 }
64
65 void ARMBaseTargetMachine::addAnalysisPasses(PassManagerBase &PM) {
66   // Add first the target-independent BasicTTI pass, then our ARM pass. This
67   // allows the ARM pass to delegate to the target independent layer when
68   // appropriate.
69   PM.add(createBasicTargetTransformInfoPass(this));
70   PM.add(createARMTargetTransformInfoPass(this));
71 }
72
73
74 void ARMTargetMachine::anchor() { }
75
76 static std::string computeDataLayout(ARMSubtarget &ST) {
77   std::string Ret = "";
78
79   if (ST.isLittle())
80     // Little endian.
81     Ret += "e";
82   else
83     // Big endian.
84     Ret += "E";
85
86   Ret += DataLayout::getManglingComponent(ST.getTargetTriple());
87
88   // Pointers are 32 bits and aligned to 32 bits.
89   Ret += "-p:32:32";
90
91   // On thumb, i16,i18 and i1 have natural aligment requirements, but we try to
92   // align to 32.
93   if (ST.isThumb())
94     Ret += "-i1:8:32-i8:8:32-i16:16:32";
95
96   // ABIs other than APCS have 64 bit integers with natural alignment.
97   if (!ST.isAPCS_ABI())
98     Ret += "-i64:64";
99
100   // We have 64 bits floats. The APCS ABI requires them to be aligned to 32
101   // bits, others to 64 bits. We always try to align to 64 bits.
102   if (ST.isAPCS_ABI())
103     Ret += "-f64:32:64";
104
105   // We have 128 and 64 bit vectors. The APCS ABI aligns them to 32 bits, others
106   // to 64. We always ty to give them natural alignment.
107   if (ST.isAPCS_ABI())
108     Ret += "-v64:32:64-v128:32:128";
109   else
110     Ret += "-v128:64:128";
111
112   // On thumb and APCS, only try to align aggregates to 32 bits (the default is
113   // 64 bits).
114   if (ST.isThumb() || ST.isAPCS_ABI())
115     Ret += "-a:0:32";
116
117   // Integer registers are 32 bits.
118   Ret += "-n32";
119
120   // The stack is 128 bit aligned on NaCl, 64 bit aligned on AAPCS and 32 bit
121   // aligned everywhere else.
122   if (ST.isTargetNaCl())
123     Ret += "-S128";
124   else if (ST.isAAPCS_ABI())
125     Ret += "-S64";
126   else
127     Ret += "-S32";
128
129   return Ret;
130 }
131
132 ARMTargetMachine::ARMTargetMachine(const Target &T, StringRef TT,
133                                    StringRef CPU, StringRef FS,
134                                    const TargetOptions &Options,
135                                    Reloc::Model RM, CodeModel::Model CM,
136                                    CodeGenOpt::Level OL,
137                                    bool isLittle)
138   : ARMBaseTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL, isLittle),
139     InstrInfo(Subtarget),
140     DL(computeDataLayout(Subtarget)),
141     TLInfo(*this),
142     TSInfo(DL),
143     FrameLowering(Subtarget) {
144   initAsmInfo();
145   if (!Subtarget.hasARMOps())
146     report_fatal_error("CPU: '" + Subtarget.getCPUString() + "' does not "
147                        "support ARM mode execution!");
148 }
149
150 void ARMLETargetMachine::anchor() { }
151
152 ARMLETargetMachine::
153 ARMLETargetMachine(const Target &T, StringRef TT,
154                        StringRef CPU, StringRef FS, const TargetOptions &Options,
155                        Reloc::Model RM, CodeModel::Model CM,
156                        CodeGenOpt::Level OL)
157   : ARMTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL, true) {}
158
159 void ARMBETargetMachine::anchor() { }
160
161 ARMBETargetMachine::
162 ARMBETargetMachine(const Target &T, StringRef TT,
163                        StringRef CPU, StringRef FS, const TargetOptions &Options,
164                        Reloc::Model RM, CodeModel::Model CM,
165                        CodeGenOpt::Level OL)
166   : ARMTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL, false) {}
167
168 void ThumbTargetMachine::anchor() { }
169
170 ThumbTargetMachine::ThumbTargetMachine(const Target &T, StringRef TT,
171                                        StringRef CPU, StringRef FS,
172                                        const TargetOptions &Options,
173                                        Reloc::Model RM, CodeModel::Model CM,
174                                        CodeGenOpt::Level OL,
175                                        bool isLittle)
176   : ARMBaseTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL, isLittle),
177     InstrInfo(Subtarget.hasThumb2()
178               ? ((ARMBaseInstrInfo*)new Thumb2InstrInfo(Subtarget))
179               : ((ARMBaseInstrInfo*)new Thumb1InstrInfo(Subtarget))),
180     DL(computeDataLayout(Subtarget)),
181     TLInfo(*this),
182     TSInfo(DL),
183     FrameLowering(Subtarget.hasThumb2()
184               ? new ARMFrameLowering(Subtarget)
185               : (ARMFrameLowering*)new Thumb1FrameLowering(Subtarget)) {
186   initAsmInfo();
187 }
188
189 void ThumbLETargetMachine::anchor() { }
190
191 ThumbLETargetMachine::
192 ThumbLETargetMachine(const Target &T, StringRef TT,
193                        StringRef CPU, StringRef FS, const TargetOptions &Options,
194                        Reloc::Model RM, CodeModel::Model CM,
195                        CodeGenOpt::Level OL)
196   : ThumbTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL, true) {}
197
198 void ThumbBETargetMachine::anchor() { }
199
200 ThumbBETargetMachine::
201 ThumbBETargetMachine(const Target &T, StringRef TT,
202                        StringRef CPU, StringRef FS, const TargetOptions &Options,
203                        Reloc::Model RM, CodeModel::Model CM,
204                        CodeGenOpt::Level OL)
205   : ThumbTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL, false) {}
206
207 namespace {
208 /// ARM Code Generator Pass Configuration Options.
209 class ARMPassConfig : public TargetPassConfig {
210 public:
211   ARMPassConfig(ARMBaseTargetMachine *TM, PassManagerBase &PM)
212     : TargetPassConfig(TM, PM) {}
213
214   ARMBaseTargetMachine &getARMTargetMachine() const {
215     return getTM<ARMBaseTargetMachine>();
216   }
217
218   const ARMSubtarget &getARMSubtarget() const {
219     return *getARMTargetMachine().getSubtargetImpl();
220   }
221
222   void addIRPasses() override;
223   bool addPreISel() override;
224   bool addInstSelector() override;
225   bool addPreRegAlloc() override;
226   bool addPreSched2() override;
227   bool addPreEmitPass() override;
228 };
229 } // namespace
230
231 TargetPassConfig *ARMBaseTargetMachine::createPassConfig(PassManagerBase &PM) {
232   return new ARMPassConfig(this, PM);
233 }
234
235 void ARMPassConfig::addIRPasses() {
236   const ARMSubtarget *Subtarget = &getARMSubtarget();
237   if (Subtarget->hasAnyDataBarrier() && !Subtarget->isThumb1Only()) {
238     addPass(createAtomicExpandLoadLinkedPass(TM));
239
240     // Cmpxchg instructions are often used with a subsequent comparison to
241     // determine whether it succeeded. We can exploit existing control-flow in
242     // ldrex/strex loops to simplify this, but it needs tidying up.
243     if (TM->getOptLevel() != CodeGenOpt::None && EnableAtomicTidy)
244       addPass(createCFGSimplificationPass());
245   }
246
247   TargetPassConfig::addIRPasses();
248 }
249
250 bool ARMPassConfig::addPreISel() {
251   if (TM->getOptLevel() != CodeGenOpt::None)
252     addPass(createGlobalMergePass(TM));
253
254   return false;
255 }
256
257 bool ARMPassConfig::addInstSelector() {
258   addPass(createARMISelDag(getARMTargetMachine(), getOptLevel()));
259
260   const ARMSubtarget *Subtarget = &getARMSubtarget();
261   if (Subtarget->isTargetELF() && !Subtarget->isThumb1Only() &&
262       TM->Options.EnableFastISel)
263     addPass(createARMGlobalBaseRegPass());
264   return false;
265 }
266
267 bool ARMPassConfig::addPreRegAlloc() {
268   // FIXME: Temporarily disabling Thumb-1 pre-RA Load/Store optimization pass
269   if (getOptLevel() != CodeGenOpt::None && !getARMSubtarget().isThumb1Only())
270     addPass(createARMLoadStoreOptimizationPass(true));
271   if (getOptLevel() != CodeGenOpt::None && getARMSubtarget().isCortexA9())
272     addPass(createMLxExpansionPass());
273   // Since the A15SDOptimizer pass can insert VDUP instructions, it can only be
274   // enabled when NEON is available.
275   if (getOptLevel() != CodeGenOpt::None && getARMSubtarget().isCortexA15() &&
276     getARMSubtarget().hasNEON() && !DisableA15SDOptimization) {
277     addPass(createA15SDOptimizerPass());
278   }
279   return true;
280 }
281
282 bool ARMPassConfig::addPreSched2() {
283   if (getOptLevel() != CodeGenOpt::None) {
284     // FIXME: Temporarily disabling Thumb-1 post-RA Load/Store optimization pass
285     if (!getARMSubtarget().isThumb1Only()) {
286       addPass(createARMLoadStoreOptimizationPass());
287       printAndVerify("After ARM load / store optimizer");
288     }
289
290     if (getARMSubtarget().hasNEON())
291       addPass(createExecutionDependencyFixPass(&ARM::DPRRegClass));
292   }
293
294   // Expand some pseudo instructions into multiple instructions to allow
295   // proper scheduling.
296   addPass(createARMExpandPseudoPass());
297
298   if (getOptLevel() != CodeGenOpt::None) {
299     if (!getARMSubtarget().isThumb1Only()) {
300       // in v8, IfConversion depends on Thumb instruction widths
301       if (getARMSubtarget().restrictIT() &&
302           !getARMSubtarget().prefers32BitThumb())
303         addPass(createThumb2SizeReductionPass());
304       addPass(&IfConverterID);
305     }
306   }
307   if (getARMSubtarget().isThumb2())
308     addPass(createThumb2ITBlockPass());
309
310   return true;
311 }
312
313 bool ARMPassConfig::addPreEmitPass() {
314   if (getARMSubtarget().isThumb2()) {
315     if (!getARMSubtarget().prefers32BitThumb())
316       addPass(createThumb2SizeReductionPass());
317
318     // Constant island pass work on unbundled instructions.
319     addPass(&UnpackMachineBundlesID);
320   }
321
322   addPass(createARMOptimizeBarriersPass());
323   addPass(createARMConstantIslandPass());
324
325   return true;
326 }
327
328 bool ARMBaseTargetMachine::addCodeEmitter(PassManagerBase &PM,
329                                           JITCodeEmitter &JCE) {
330   // Machine code emitter pass for ARM.
331   PM.add(createARMJITCodeEmitterPass(*this, JCE));
332   return false;
333 }