mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2026-04-25 21:18:19 +00:00
Adding an A15 specific optimization pass for interactions between S/D/Q registers. The pass handles all the required transformations pre-regalloc.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@177169 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -28,6 +28,11 @@ EnableGlobalMerge("global-merge", cl::Hidden,
|
||||
cl::desc("Enable global merge pass"),
|
||||
cl::init(true));
|
||||
|
||||
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));
|
||||
|
||||
extern "C" void LLVMInitializeARMTarget() {
|
||||
// Register the target.
|
||||
RegisterTargetMachine<ARMTargetMachine> X(TheARMTarget);
|
||||
@@ -164,6 +169,12 @@ bool ARMPassConfig::addPreRegAlloc() {
|
||||
addPass(createARMLoadStoreOptimizationPass(true));
|
||||
if (getOptLevel() != CodeGenOpt::None && getARMSubtarget().isLikeA9())
|
||||
addPass(createMLxExpansionPass());
|
||||
// Since the A15SDOptimizer pass can insert VDUP instructions, it can only be
|
||||
// enabled when NEON is available.
|
||||
if (getOptLevel() != CodeGenOpt::None && getARMSubtarget().isCortexA15() &&
|
||||
getARMSubtarget().hasNEON() && !DisableA15SDOptimization) {
|
||||
addPass(createA15SDOptimizerPass());
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -174,7 +185,8 @@ bool ARMPassConfig::addPreSched2() {
|
||||
addPass(createARMLoadStoreOptimizationPass());
|
||||
printAndVerify("After ARM load / store optimizer");
|
||||
}
|
||||
if (getARMSubtarget().hasNEON())
|
||||
if ((DisableA15SDOptimization || !getARMSubtarget().isCortexA15()) &&
|
||||
getARMSubtarget().hasNEON())
|
||||
addPass(createExecutionDependencyFixPass(&ARM::DPRRegClass));
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user