summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/AArch64/AArch64TargetMachine.cpp
diff options
context:
space:
mode:
authorArnaud A. de Grandmaison <arnaud.degrandmaison@arm.com>2014-09-10 14:06:10 +0000
committerArnaud A. de Grandmaison <arnaud.degrandmaison@arm.com>2014-09-10 14:06:10 +0000
commitc75dbbbdd6cff6a91f46e619a31f530f223cdfa0 (patch)
tree9e911c4b8908e1cb95798d4bc4bd049df9589406 /llvm/lib/Target/AArch64/AArch64TargetMachine.cpp
parent369c03063376df9d24d521b0edd4ee0e72360e4d (diff)
downloadbcm5719-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.cpp16
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;
OpenPOWER on IntegriCloud