OLD | NEW |
1 //===-- ARMTargetMachine.cpp - Define TargetMachine for ARM ---------------===// | 1 //===-- ARMTargetMachine.cpp - Define TargetMachine for ARM ---------------===// |
2 // | 2 // |
3 // The LLVM Compiler Infrastructure | 3 // The LLVM Compiler Infrastructure |
4 // | 4 // |
5 // This file is distributed under the University of Illinois Open Source | 5 // This file is distributed under the University of Illinois Open Source |
6 // License. See LICENSE.TXT for details. | 6 // License. See LICENSE.TXT for details. |
7 // | 7 // |
8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
9 // | 9 // |
10 // | 10 // |
11 //===----------------------------------------------------------------------===// | 11 //===----------------------------------------------------------------------===// |
12 | 12 |
13 #include "ARM.h" | 13 #include "ARM.h" |
14 #include "ARMTargetMachine.h" | 14 #include "ARMTargetMachine.h" |
15 #include "ARMFrameLowering.h" | 15 #include "ARMFrameLowering.h" |
16 #include "ARMTargetObjectFile.h" | 16 #include "ARMTargetObjectFile.h" |
17 #include "llvm/CodeGen/Passes.h" | 17 #include "llvm/CodeGen/Passes.h" |
18 #include "llvm/IR/Function.h" | 18 #include "llvm/IR/Function.h" |
19 #include "llvm/MC/MCAsmInfo.h" | 19 #include "llvm/MC/MCAsmInfo.h" |
20 #include "llvm/PassManager.h" | 20 #include "llvm/PassManager.h" |
21 #include "llvm/Support/CommandLine.h" | 21 #include "llvm/Support/CommandLine.h" |
22 #include "llvm/Support/FormattedStream.h" | 22 #include "llvm/Support/FormattedStream.h" |
23 #include "llvm/Support/TargetRegistry.h" | 23 #include "llvm/Support/TargetRegistry.h" |
24 #include "llvm/Target/TargetOptions.h" | 24 #include "llvm/Target/TargetOptions.h" |
| 25 // @LOCALMOD-START |
| 26 #include "llvm/Transforms/NaCl.h" |
| 27 // @LOCALMOD-END |
25 #include "llvm/Transforms/Scalar.h" | 28 #include "llvm/Transforms/Scalar.h" |
26 using namespace llvm; | 29 using namespace llvm; |
27 | 30 |
28 static cl::opt<bool> | 31 static cl::opt<bool> |
29 DisableA15SDOptimization("disable-a15-sd-optimization", cl::Hidden, | 32 DisableA15SDOptimization("disable-a15-sd-optimization", cl::Hidden, |
30 cl::desc("Inhibit optimization of S->D register accesses on A
15"), | 33 cl::desc("Inhibit optimization of S->D register accesses on A
15"), |
31 cl::init(false)); | 34 cl::init(false)); |
32 | 35 |
33 static cl::opt<bool> | 36 static cl::opt<bool> |
34 EnableAtomicTidy("arm-atomic-cfg-tidy", cl::Hidden, | 37 EnableAtomicTidy("arm-atomic-cfg-tidy", cl::Hidden, |
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
201 bool addPreSched2() override; | 204 bool addPreSched2() override; |
202 bool addPreEmitPass() override; | 205 bool addPreEmitPass() override; |
203 }; | 206 }; |
204 } // namespace | 207 } // namespace |
205 | 208 |
206 TargetPassConfig *ARMBaseTargetMachine::createPassConfig(PassManagerBase &PM) { | 209 TargetPassConfig *ARMBaseTargetMachine::createPassConfig(PassManagerBase &PM) { |
207 return new ARMPassConfig(this, PM); | 210 return new ARMPassConfig(this, PM); |
208 } | 211 } |
209 | 212 |
210 void ARMPassConfig::addIRPasses() { | 213 void ARMPassConfig::addIRPasses() { |
| 214 // @LOCALMOD-START |
| 215 if (getARMSubtarget().isTargetNaCl()) |
| 216 addPass(createInsertDivideCheckPass()); |
| 217 // @LOCALMOD-END |
| 218 |
211 if (TM->Options.ThreadModel == ThreadModel::Single) | 219 if (TM->Options.ThreadModel == ThreadModel::Single) |
212 addPass(createLowerAtomicPass()); | 220 addPass(createLowerAtomicPass()); |
213 else | 221 else |
214 addPass(createAtomicExpandPass(TM)); | 222 addPass(createAtomicExpandPass(TM)); |
215 | 223 |
216 // Cmpxchg instructions are often used with a subsequent comparison to | 224 // Cmpxchg instructions are often used with a subsequent comparison to |
217 // determine whether it succeeded. We can exploit existing control-flow in | 225 // determine whether it succeeded. We can exploit existing control-flow in |
218 // ldrex/strex loops to simplify this, but it needs tidying up. | 226 // ldrex/strex loops to simplify this, but it needs tidying up. |
219 const ARMSubtarget *Subtarget = &getARMSubtarget(); | 227 const ARMSubtarget *Subtarget = &getARMSubtarget(); |
220 if (Subtarget->hasAnyDataBarrier() && !Subtarget->isThumb1Only()) | 228 if (Subtarget->hasAnyDataBarrier() && !Subtarget->isThumb1Only()) |
221 if (TM->getOptLevel() != CodeGenOpt::None && EnableAtomicTidy) | 229 if (TM->getOptLevel() != CodeGenOpt::None && EnableAtomicTidy) |
222 addPass(createCFGSimplificationPass()); | 230 addPass(createCFGSimplificationPass()); |
223 | 231 |
224 TargetPassConfig::addIRPasses(); | 232 TargetPassConfig::addIRPasses(); |
225 } | 233 } |
226 | 234 |
227 bool ARMPassConfig::addPreISel() { | 235 bool ARMPassConfig::addPreISel() { |
228 if (TM->getOptLevel() != CodeGenOpt::None) | 236 // @LOCALMOD-START |
| 237 // We disable the GlobalMerge pass for PNaCl because it causes the |
| 238 // PNaCl ABI checker to reject the program when the PNaCl translator |
| 239 // is run in streaming mode. This is because GlobalMerge replaces |
| 240 // functions' GlobalVariable references with ConstantExprs which the |
| 241 // ABI verifier rejects. |
| 242 // TODO(mseaborn): Make the ABI checks coexist with GlobalMerge to |
| 243 // get back the performance benefits of GlobalMerge. |
| 244 if (!getARMSubtarget().isTargetNaCl() && |
| 245 TM->getOptLevel() != CodeGenOpt::None) |
| 246 // @LOCALMOD-END |
229 addPass(createGlobalMergePass(TM)); | 247 addPass(createGlobalMergePass(TM)); |
230 | 248 |
231 return false; | 249 return false; |
232 } | 250 } |
233 | 251 |
234 bool ARMPassConfig::addInstSelector() { | 252 bool ARMPassConfig::addInstSelector() { |
235 addPass(createARMISelDag(getARMTargetMachine(), getOptLevel())); | 253 addPass(createARMISelDag(getARMTargetMachine(), getOptLevel())); |
236 | 254 |
237 const ARMSubtarget *Subtarget = &getARMSubtarget(); | 255 const ARMSubtarget *Subtarget = &getARMSubtarget(); |
238 if (Subtarget->isTargetELF() && !Subtarget->isThumb1Only() && | 256 if (Subtarget->isTargetELF() && !Subtarget->isThumb1Only() && |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
286 bool ARMPassConfig::addPreEmitPass() { | 304 bool ARMPassConfig::addPreEmitPass() { |
287 if (getARMSubtarget().isThumb2()) { | 305 if (getARMSubtarget().isThumb2()) { |
288 if (!getARMSubtarget().prefers32BitThumb()) | 306 if (!getARMSubtarget().prefers32BitThumb()) |
289 addPass(createThumb2SizeReductionPass()); | 307 addPass(createThumb2SizeReductionPass()); |
290 | 308 |
291 // Constant island pass work on unbundled instructions. | 309 // Constant island pass work on unbundled instructions. |
292 addPass(&UnpackMachineBundlesID); | 310 addPass(&UnpackMachineBundlesID); |
293 } | 311 } |
294 | 312 |
295 addPass(createARMOptimizeBarriersPass()); | 313 addPass(createARMOptimizeBarriersPass()); |
296 addPass(createARMConstantIslandPass()); | 314 |
| 315 // @LOCALMOD-START |
| 316 if (getARMSubtarget().useConstIslands()) |
| 317 addPass(createARMConstantIslandPass()); |
| 318 // @LOCALMOD-END |
| 319 |
| 320 // @LOCALMOD-START |
| 321 // This pass does all the heavy sfi lifting. |
| 322 if (getARMSubtarget().isTargetNaCl()) { |
| 323 addPass(createARMNaClRewritePass()); |
| 324 } |
| 325 // @LOCALMOD-END |
297 | 326 |
298 return true; | 327 return true; |
299 } | 328 } |
OLD | NEW |