From c75dbbbdd6cff6a91f46e619a31f530f223cdfa0 Mon Sep 17 00:00:00 2001 From: "Arnaud A. de Grandmaison" Date: Wed, 10 Sep 2014 14:06:10 +0000 Subject: [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 --- llvm/lib/Target/AArch64/AArch64TargetMachine.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) (limited to 'llvm/lib/Target/AArch64/AArch64TargetMachine.cpp') 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 +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().isCortexA57()) + TM->getSubtarget().isCortexA57() && + !static_cast(TM)->isPBQPUsed()) // Improve performance for some FP/SIMD code for A57. addPass(createAArch64A57FPLoadBalancing()); return true; -- cgit v1.2.3