diff options
author | Arnaud A. de Grandmaison <arnaud.degrandmaison@arm.com> | 2014-09-10 14:06:10 +0000 |
---|---|---|
committer | Arnaud A. de Grandmaison <arnaud.degrandmaison@arm.com> | 2014-09-10 14:06:10 +0000 |
commit | c75dbbbdd6cff6a91f46e619a31f530f223cdfa0 (patch) | |
tree | 9e911c4b8908e1cb95798d4bc4bd049df9589406 /llvm/lib/Target/AArch64/AArch64TargetMachine.cpp | |
parent | 369c03063376df9d24d521b0edd4ee0e72360e4d (diff) | |
download | bcm5719-llvm-c75dbbbdd6cff6a91f46e619a31f530f223cdfa0.tar.gz bcm5719-llvm-c75dbbbdd6cff6a91f46e619a31f530f223cdfa0.zip |
[AArch64] Add experimental PBQP support
This adds target specific support for using the PBQP register allocator on the
AArch64, for the A57 cpu.
By default, the PBQP allocator is not used, unless explicitely required
on the command line with "-aarch64-pbqp".
llvm-svn: 217504
Diffstat (limited to 'llvm/lib/Target/AArch64/AArch64TargetMachine.cpp')
-rw-r--r-- | llvm/lib/Target/AArch64/AArch64TargetMachine.cpp | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/llvm/lib/Target/AArch64/AArch64TargetMachine.cpp b/llvm/lib/Target/AArch64/AArch64TargetMachine.cpp index e867524226b..1f5978198e4 100644 --- a/llvm/lib/Target/AArch64/AArch64TargetMachine.cpp +++ b/llvm/lib/Target/AArch64/AArch64TargetMachine.cpp @@ -13,6 +13,7 @@ #include "AArch64.h" #include "AArch64TargetMachine.h" #include "llvm/CodeGen/Passes.h" +#include "llvm/CodeGen/RegAllocRegistry.h" #include "llvm/PassManager.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/TargetRegistry.h" @@ -73,6 +74,10 @@ EnableCondOpt("aarch64-condopt", cl::desc("Enable the condition optimizer pass"), cl::init(true), cl::Hidden); +static cl::opt<bool> +EnablePBQP("aarch64-pbqp", cl::Hidden, + cl::desc("Use PBQP register allocator (experimental)"), + cl::init(false)); extern "C" void LLVMInitializeAArch64Target() { // Register the target. @@ -90,8 +95,14 @@ AArch64TargetMachine::AArch64TargetMachine(const Target &T, StringRef TT, CodeGenOpt::Level OL, bool LittleEndian) : LLVMTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL), - Subtarget(TT, CPU, FS, *this, LittleEndian) { + Subtarget(TT, CPU, FS, *this, LittleEndian), + usingPBQP(false) { initAsmInfo(); + + if (EnablePBQP && Subtarget.isCortexA57() && OL != CodeGenOpt::None) { + usingPBQP = true; + RegisterRegAlloc::setDefault(createAArch64A57PBQPRegAlloc); + } } void AArch64leTargetMachine::anchor() { } @@ -216,7 +227,8 @@ bool AArch64PassConfig::addPostRegAlloc() { if (TM->getOptLevel() != CodeGenOpt::None && EnableDeadRegisterElimination) addPass(createAArch64DeadRegisterDefinitions()); if (TM->getOptLevel() != CodeGenOpt::None && - TM->getSubtarget<AArch64Subtarget>().isCortexA57()) + TM->getSubtarget<AArch64Subtarget>().isCortexA57() && + !static_cast<const AArch64TargetMachine *>(TM)->isPBQPUsed()) // Improve performance for some FP/SIMD code for A57. addPass(createAArch64A57FPLoadBalancing()); return true; |