28 cl::desc(
"Enable global merge pass"),
33 cl::desc(
"Inhibit optimization of S->D register accesses on A15"),
51 Subtarget(TT, CPU, FS, Options),
53 InstrItins(Subtarget.getInstrItineraryData()) {
68 void ARMTargetMachine::anchor() { }
77 DL(Subtarget.isAPCS_ABI() ?
78 std::string(
"e-p:32:32-f64:32:64-i64:32:64-"
79 "v128:32:128-v64:32:64-n32-S32") :
80 Subtarget.isAAPCS_ABI() ?
81 std::string(
"e-p:32:32-f64:64:64-i64:64:64-"
82 "v128:64:128-v64:64:64-n32-S64") :
83 std::string(
"e-p:32:32-f64:64:64-i64:64:64-"
84 "v128:64:128-v64:64:64-n32-S32")),
87 FrameLowering(Subtarget) {
91 "support ARM mode execution!");
94 void ThumbTargetMachine::anchor() { }
102 InstrInfo(Subtarget.hasThumb2()
105 DL(Subtarget.isAPCS_ABI() ?
106 std::string(
"e-p:32:32-f64:32:64-i64:32:64-"
107 "i16:16:32-i8:8:32-i1:8:32-"
108 "v128:32:128-v64:32:64-a:0:32-n32-S32") :
109 Subtarget.isAAPCS_ABI() ?
110 std::string(
"e-p:32:32-f64:64:64-i64:64:64-"
111 "i16:16:32-i8:8:32-i1:8:32-"
112 "v128:64:128-v64:64:64-a:0:32-n32-S64") :
113 std::string(
"e-p:32:32-f64:64:64-i64:64:64-"
114 "i16:16:32-i8:8:32-i1:8:32-"
115 "v128:64:128-v64:64:64-a:0:32-n32-S32")),
118 FrameLowering(Subtarget.hasThumb2()
132 return getTM<ARMBaseTargetMachine>();
136 return *getARMTargetMachine().getSubtargetImpl();
139 virtual bool addPreISel();
140 virtual bool addInstSelector();
141 virtual bool addPreRegAlloc();
142 virtual bool addPreSched2();
143 virtual bool addPreEmitPass();
148 return new ARMPassConfig(
this, PM);
151 bool ARMPassConfig::addPreISel() {
158 bool ARMPassConfig::addInstSelector() {
163 TM->Options.EnableFastISel)
168 bool ARMPassConfig::addPreRegAlloc() {
183 bool ARMPassConfig::addPreSched2() {
186 if (!getARMSubtarget().isThumb1Only()) {
188 printAndVerify(
"After ARM load / store optimizer");
190 if (getARMSubtarget().hasNEON())
199 if (!getARMSubtarget().isThumb1Only()) {
201 if (getARMSubtarget().restrictIT() &&
202 !getARMSubtarget().prefers32BitThumb())
207 if (getARMSubtarget().isThumb2())
213 bool ARMPassConfig::addPreEmitPass() {
214 if (getARMSubtarget().isThumb2()) {
215 if (!getARMSubtarget().prefers32BitThumb())
FunctionPass * createThumb2SizeReductionPass()
ImmutablePass * createARMTargetTransformInfoPass(const ARMBaseTargetMachine *TM)
Creates an ARM-specific Target Transformation Info pass.
FunctionPass * createA15SDOptimizerPass()
FunctionPass * createMLxExpansionPass()
ARMBaseTargetMachine(const Target &T, StringRef TT, StringRef CPU, StringRef FS, const TargetOptions &Options, Reloc::Model RM, CodeModel::Model CM, CodeGenOpt::Level OL)
const std::string & getCPUString() const
FunctionPass * createARMGlobalBaseRegPass()
ImmutablePass * createBasicTargetTransformInfoPass(const TargetMachine *TM)
Create a basic TargetTransformInfo analysis pass.
FunctionPass * createARMExpandPseudoPass()
bool isThumb1Only() const
LLVM_ATTRIBUTE_NORETURN void report_fatal_error(const char *reason, bool gen_crash_diag=true)
ThumbTargetMachine(const Target &T, StringRef TT, StringRef CPU, StringRef FS, const TargetOptions &Options, Reloc::Model RM, CodeModel::Model CM, CodeGenOpt::Level OL)
virtual bool addCodeEmitter(PassManagerBase &PM, JITCodeEmitter &MCE)
virtual void addAnalysisPasses(PassManagerBase &PM)
Register ARM analysis passes with a pass manager.
FunctionPass * createARMConstantIslandPass()
virtual TargetPassConfig * createPassConfig(PassManagerBase &PM)
void LLVMInitializeARMTarget()
FunctionPass * createARMJITCodeEmitterPass(ARMBaseTargetMachine &TM, JITCodeEmitter &JCE)
Pass * createGlobalMergePass(const TargetMachine *TM=0)
initializer< Ty > init(const Ty &Val)
static cl::opt< bool > DisableA15SDOptimization("disable-a15-sd-optimization", cl::Hidden, cl::desc("Inhibit optimization of S->D register accesses on A15"), cl::init(false))
char & UnpackMachineBundlesID
UnpackMachineBundles - This pass unpack machine instruction bundles.
FunctionPass * createARMLoadStoreOptimizationPass(bool PreAlloc=false)
FunctionPass * createExecutionDependencyFixPass(const TargetRegisterClass *RC)
char & IfConverterID
IfConverter - This pass performs machine code if conversion.
FunctionPass * createARMISelDag(ARMBaseTargetMachine &TM, CodeGenOpt::Level OptLevel)
static cl::opt< bool > EnableGlobalMerge("global-merge", cl::Hidden, cl::desc("Enable global merge pass"), cl::init(true))
FunctionPass * createThumb2ITBlockPass()
static GCMetadataPrinterRegistry::Add< OcamlGCMetadataPrinter > Y("ocaml","ocaml 3.10-compatible collector")
ARMTargetMachine(const Target &T, StringRef TT, StringRef CPU, StringRef FS, const TargetOptions &Options, Reloc::Model RM, CodeModel::Model CM, CodeGenOpt::Level OL)
static RegisterPass< NVPTXAllocaHoisting > X("alloca-hoisting","Hoisting alloca instructions in non-entry ""blocks to the entry block")
FloatABI::ABIType FloatABIType