/// Return true if the optimized regalloc pipeline is enabled.
bool getOptimizeRegAlloc() const;
+ /// Return true if the default global register allocator is in use and
+ /// has not be overriden on the command line with '-regalloc=...'
+ bool usingDefaultRegAlloc() const;
+
/// Add common target configurable passes that perform LLVM IR to IR
/// transforms following machine independent optimization.
virtual void addIRPasses();
return createTargetRegisterAllocator(Optimized);
}
+/// Return true if the default global register allocator is in use and
+/// has not be overriden on the command line with '-regalloc=...'
+bool TargetPassConfig::usingDefaultRegAlloc() const {
+ return RegAlloc == &useDefaultRegisterAllocator;
+}
+
/// Add the minimum set of target-independent passes that are required for
/// register allocation. No coalescing or scheduling.
void TargetPassConfig::addFastRegAlloc(FunctionPass *RegAllocPass) {
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));
-
static cl::opt<bool>
EnableA53Fix835769("aarch64-fix-cortex-a53-835769", cl::Hidden,
cl::desc("Work around Cortex-A53 erratum 835769"),
CodeGenOpt::Level OL,
bool LittleEndian)
: LLVMTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL),
- Subtarget(TT, CPU, FS, *this, LittleEndian), isLittle(LittleEndian),
- usingPBQP(false) {
+ Subtarget(TT, CPU, FS, *this, LittleEndian), isLittle(LittleEndian) {
initAsmInfo();
-
- if (EnablePBQP && Subtarget.isCortexA57() && OL != CodeGenOpt::None) {
- usingPBQP = true;
- RegisterRegAlloc::setDefault(createDefaultPBQPRegisterAllocator);
- }
}
const AArch64Subtarget *
addPass(createAArch64DeadRegisterDefinitions());
if (TM->getOptLevel() != CodeGenOpt::None &&
TM->getSubtarget<AArch64Subtarget>().isCortexA57() &&
- !static_cast<const AArch64TargetMachine *>(TM)->isPBQPUsed())
+ usingDefaultRegAlloc())
// Improve performance for some FP/SIMD code for A57.
addPass(createAArch64A57FPLoadBalancing());
return true;
/// \brief Register AArch64 analysis passes with a pass manager.
void addAnalysisPasses(PassManagerBase &PM) override;
- /// \brief Query if the PBQP register allocator is being used
- bool isPBQPUsed() const { return usingPBQP; }
-
private:
bool isLittle;
- bool usingPBQP;
};
// AArch64leTargetMachine - AArch64 little endian target machine.
-; RUN: llc -mtriple=aarch64-linux-gnu -mcpu=cortex-a57 -aarch64-pbqp -o - %s | FileCheck %s
+; RUN: llc -mtriple=aarch64-linux-gnu -mcpu=cortex-a57 -regalloc=pbqp -pbqp-coalescing -o - %s | FileCheck %s
define i32 @foo(i32 %a) {
; CHECK-LABEL: foo:
; CHECK: bl bar
-; CHECK-NEXT: bl baz
+; CHECK: bl baz
%call = call i32 @bar(i32 %a)
%call1 = call i32 @baz(i32 %call)
ret i32 %call1