perf(cpu): tune Release JIT compilation (#301)

This commit is contained in:
Bruno 2026-09-27 13:23:08 +02:00 committed by GitHub
parent 8855290cfa
commit c5325c2ff3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with 28 additions and 7 deletions

View File

@ -62,7 +62,7 @@
<PreprocessKeepComments>false</PreprocessKeepComments>
<StringPooling>true</StringPooling>
<MinimalRebuild>false</MinimalRebuild>
<ExceptionHandling>Async</ExceptionHandling>
<ExceptionHandling>Sync</ExceptionHandling>
<BasicRuntimeChecks>Default</BasicRuntimeChecks>
<StructMemberAlignment>Default</StructMemberAlignment>
<BufferSecurityCheck>false</BufferSecurityCheck>

View File

@ -3,14 +3,15 @@
<ItemDefinitionGroup>
<ClCompile>
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<Optimization>MinSpace</Optimization>
<Optimization>MaxSpeed</Optimization>
<InlineFunctionExpansion>Default</InlineFunctionExpansion>
<IntrinsicFunctions>true</IntrinsicFunctions>
<FavorSizeOrSpeed>Size</FavorSizeOrSpeed>
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
<OmitFramePointers>false</OmitFramePointers>
<EnableFiberSafeOptimizations>false</EnableFiberSafeOptimizations>
<WholeProgramOptimization>false</WholeProgramOptimization>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<AdditionalOptions>/Gw %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<Midl>
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>

View File

@ -238,9 +238,14 @@ std::shared_ptr<Dynarmic::A32::Jit> ArmDynarmic32::MakeJit(IKernelProcess & proc
config.check_halt_on_memory_access = true;
}
#if !defined(NDEBUG)
config.optimizations &= ~Dynarmic::OptimizationFlag::DisableVerification;
#endif
// Safe optimizations
if (cpuSettings.cpu_debug_mode)
{
config.optimizations &= ~Dynarmic::OptimizationFlag::DisableVerification;
if (!cpuSettings.cpuopt_page_tables)
{
config.page_table = nullptr;

View File

@ -369,9 +369,14 @@ std::shared_ptr<Dynarmic::A64::Jit> ArmDynarmic64::MakeJit(IKernelProcess & proc
config.check_halt_on_memory_access = true;
}
#if !defined(NDEBUG)
config.optimizations &= ~Dynarmic::OptimizationFlag::DisableVerification;
#endif
// Safe optimizations
if (cpuSettings.cpu_debug_mode)
{
config.optimizations &= ~Dynarmic::OptimizationFlag::DisableVerification;
if (!cpuSettings.cpuopt_page_tables)
{
config.page_table = nullptr;

View File

@ -176,7 +176,9 @@ IR::Block A32AddressSpace::GenerateIR(IR::LocationDescriptor descriptor) const {
Optimization::DeadCodeElimination(ir_block);
}
Optimization::IdentityRemovalPass(ir_block);
Optimization::VerificationPass(ir_block);
if (!conf.HasOptimization(OptimizationFlag::DisableVerification)) {
Optimization::VerificationPass(ir_block);
}
return ir_block;
}

View File

@ -345,7 +345,9 @@ IR::Block A64AddressSpace::GenerateIR(IR::LocationDescriptor descriptor) const {
if (conf.HasOptimization(OptimizationFlag::MiscIROpt)) {
Optimization::A64MergeInterpretBlocksPass(ir_block, conf.callbacks);
}
Optimization::VerificationPass(ir_block);
if (!conf.HasOptimization(OptimizationFlag::DisableVerification)) {
Optimization::VerificationPass(ir_block);
}
return ir_block;
}

View File

@ -226,7 +226,9 @@ private:
Optimization::DeadCodeElimination(ir_block);
}
Optimization::IdentityRemovalPass(ir_block);
Optimization::VerificationPass(ir_block);
if (!conf.HasOptimization(OptimizationFlag::DisableVerification)) {
Optimization::VerificationPass(ir_block);
}
return emitter.Emit(ir_block);
}

View File

@ -295,7 +295,9 @@ private:
if (conf.HasOptimization(OptimizationFlag::MiscIROpt)) {
Optimization::A64MergeInterpretBlocksPass(ir_block, conf.callbacks);
}
Optimization::VerificationPass(ir_block);
if (!conf.HasOptimization(OptimizationFlag::DisableVerification)) {
Optimization::VerificationPass(ir_block);
}
return emitter.Emit(ir_block).entrypoint;
}

View File

@ -32,6 +32,8 @@ enum class OptimizationFlag : std::uint32_t {
ConstProp = 0x00000010,
/// This is enables miscellaneous safe IR optimizations.
MiscIROpt = 0x00000020,
/// Disable IR verification passes after translation and optimization.
DisableVerification = 0x00000080,
/// This is an UNSAFE optimization that reduces accuracy of fused multiply-add operations.
/// This unfuses fused instructions to improve performance on host CPUs without FMA support.