// Decide between default or alternative pass name.
namespace art HIDDEN {
constchar* OptimizationPassName(OptimizationPass pass) { switch (pass) { case OptimizationPass::kInductionVarAnalysis: return HInductionVarAnalysis::kInductionPassName; case OptimizationPass::kGlobalValueNumbering: return GVNOptimization::kGlobalValueNumberingPassName; case OptimizationPass::kInvariantCodeMotion: return LICM::kLoopInvariantCodeMotionPassName; case OptimizationPass::kLoopOptimization: return HLoopOptimization::kLoopOptimizationPassName; case OptimizationPass::kBoundsCheckElimination: return BoundsCheckElimination::kBoundsCheckEliminationPassName; case OptimizationPass::kLoadStoreElimination: return LoadStoreElimination::kLoadStoreEliminationPassName; case OptimizationPass::kConstantFolding: return HConstantFolding::kConstantFoldingPassName; case OptimizationPass::kDeadCodeElimination: return HDeadCodeElimination::kDeadCodeEliminationPassName; case OptimizationPass::kEnvironmentInputElimination: return HEnvironmentInputElimination::kEnvironmentInputEliminationPassName; case OptimizationPass::kInliner: return HInliner::kInlinerPassName; case OptimizationPass::kControlFlowSimplifier: return HControlFlowSimplifier::kControlFlowSimplifierPassName; case OptimizationPass::kAggressiveInstructionSimplifier: case OptimizationPass::kInstructionSimplifier: return InstructionSimplifier::kInstructionSimplifierPassName; case OptimizationPass::kCHAGuardOptimization: return CHAGuardOptimization::kCHAGuardOptimizationPassName; case OptimizationPass::kCodeSinking: return CodeSinking::kCodeSinkingPassName; case OptimizationPass::kConstructorFenceRedundancyElimination: return ConstructorFenceRedundancyElimination::kCFREPassName; case OptimizationPass::kReferenceTypePropagation: return ReferenceTypePropagation::kReferenceTypePropagationPassName; case OptimizationPass::kScheduling: return HInstructionScheduling::kInstructionSchedulingPassName; case OptimizationPass::kWriteBarrierElimination: return WriteBarrierElimination::kWBEPassName; #ifdef ART_ENABLE_CODEGEN_arm case OptimizationPass::kInstructionSimplifierArm: return arm::InstructionSimplifierArm::kInstructionSimplifierArmPassName; case OptimizationPass::kCriticalNativeAbiFixupArm: return arm::CriticalNativeAbiFixupArm::kCriticalNativeAbiFixupArmPassName; #endif #ifdef ART_ENABLE_CODEGEN_arm64 case OptimizationPass::kInstructionSimplifierArm64: return arm64::InstructionSimplifierArm64::kInstructionSimplifierArm64PassName; #endif #ifdef ART_ENABLE_CODEGEN_riscv64 case OptimizationPass::kCriticalNativeAbiFixupRiscv64: return riscv64::CriticalNativeAbiFixupRiscv64::kCriticalNativeAbiFixupRiscv64PassName; case OptimizationPass::kInstructionSimplifierRiscv64: return riscv64::InstructionSimplifierRiscv64::kInstructionSimplifierRiscv64PassName; #endif #ifdef ART_ENABLE_CODEGEN_x86 case OptimizationPass::kPcRelativeFixupsX86: return x86::PcRelativeFixups::kPcRelativeFixupsX86PassName; case OptimizationPass::kInstructionSimplifierX86: return x86::InstructionSimplifierX86::kInstructionSimplifierX86PassName; #endif #ifdef ART_ENABLE_CODEGEN_x86_64 case OptimizationPass::kInstructionSimplifierX86_64: return x86_64::InstructionSimplifierX86_64::kInstructionSimplifierX86_64PassName; #endif #ifdefined(ART_ENABLE_CODEGEN_x86) || defined(ART_ENABLE_CODEGEN_x86_64) case OptimizationPass::kX86MemoryOperandGeneration: return x86::X86MemoryOperandGeneration::kX86MemoryOperandGenerationPassName; #endif case OptimizationPass::kNone:
LOG(FATAL) << "kNone does not represent an actual pass";
UNREACHABLE();
}
}
#define X(x) if (pass_name == OptimizationPassName((x))) return (x)
// Some optimizations require HInductionVarAnalysis // instances. This method uses the nearest instance preceeding it in the pass // name list or fails fatally if no such analysis can be found.
HInductionVarAnalysis* most_recent_induction = nullptr;
// Loop over the requested optimizations. for (size_t i = 0; i < length; i++) {
OptimizationPass pass = definitions[i].pass; constchar* alt_name = definitions[i].pass_name; constchar* pass_name = alt_name != nullptr
? alt_name
: OptimizationPassName(pass);
HOptimization* opt = nullptr;
switch (pass) { // // Analysis passes (kept in most recent for subsequent passes). // case OptimizationPass::kInductionVarAnalysis:
opt = most_recent_induction = new (allocator) HInductionVarAnalysis(graph, stats, pass_name); break; // // Passes that need prior analysis. // case OptimizationPass::kGlobalValueNumbering:
opt = new (allocator) GVNOptimization(graph, pass_name); break; case OptimizationPass::kInvariantCodeMotion:
opt = new (allocator) LICM(graph, stats, pass_name); break; case OptimizationPass::kLoopOptimization:
CHECK(most_recent_induction != nullptr);
opt = new (allocator) HLoopOptimization(
graph, *codegen, most_recent_induction, stats, pass_name); break; case OptimizationPass::kBoundsCheckElimination:
CHECK(most_recent_induction != nullptr);
opt = new (allocator) BoundsCheckElimination(graph, most_recent_induction, pass_name); break; // // Regular passes. // case OptimizationPass::kConstantFolding:
opt = new (allocator)
HConstantFolding(graph, codegen->GetCompilerOptions(), stats, pass_name); break; case OptimizationPass::kDeadCodeElimination:
opt = new (allocator) HDeadCodeElimination(graph, stats, pass_name); break; case OptimizationPass::kInliner: {
CodeItemDataAccessor accessor(*dex_compilation_unit.GetDexFile(),
dex_compilation_unit.GetCodeItem());
opt = new (allocator) HInliner(graph, // outer_graph
graph, // outermost_graph
codegen,
dex_compilation_unit, // outer_compilation_unit
dex_compilation_unit, // outermost_compilation_unit
stats,
accessor.RegistersSize(), /* total_number_of_instructions= */ 0, /* parent= */ nullptr, /* caller_environment= */ nullptr, /* depth= */ 0, /* try_catch_inlining_allowed= */ true,
pass_name); break;
} case OptimizationPass::kControlFlowSimplifier:
opt = new (allocator) HControlFlowSimplifier(graph, stats, pass_name); break; case OptimizationPass::kInstructionSimplifier:
opt = new (allocator) InstructionSimplifier(graph, codegen, stats, pass_name); break; case OptimizationPass::kAggressiveInstructionSimplifier:
opt = new (allocator) InstructionSimplifier(graph,
codegen,
stats,
pass_name, /* use_all_optimizations_ = */ true); break; case OptimizationPass::kCHAGuardOptimization:
opt = new (allocator) CHAGuardOptimization(graph, pass_name); break; case OptimizationPass::kCodeSinking:
opt = new (allocator) CodeSinking(graph, stats, pass_name); break; case OptimizationPass::kConstructorFenceRedundancyElimination:
opt = new (allocator) ConstructorFenceRedundancyElimination(graph, stats, pass_name); break; case OptimizationPass::kLoadStoreElimination:
opt = new (allocator) LoadStoreElimination(graph, stats, pass_name); break; case OptimizationPass::kReferenceTypePropagation:
opt = new (allocator) ReferenceTypePropagation(
graph, dex_compilation_unit.GetDexCache(), /* is_first_run= */ false, pass_name); break; case OptimizationPass::kWriteBarrierElimination:
opt = new (allocator) WriteBarrierElimination(graph, stats, pass_name); break; case OptimizationPass::kScheduling:
opt = new (allocator) HInstructionScheduling(
graph, codegen->GetCompilerOptions().GetInstructionSet(), codegen, pass_name); break; case art::OptimizationPass::kEnvironmentInputElimination:
opt = new (allocator) HEnvironmentInputElimination(graph, stats, pass_name); break; // // Arch-specific passes. // #ifdef ART_ENABLE_CODEGEN_arm case OptimizationPass::kInstructionSimplifierArm:
DCHECK(alt_name == nullptr) << "arch-specific pass does not support alternative name";
opt = new (allocator) arm::InstructionSimplifierArm(graph, codegen, stats); break; case OptimizationPass::kCriticalNativeAbiFixupArm:
DCHECK(alt_name == nullptr) << "arch-specific pass does not support alternative name";
opt = new (allocator) arm::CriticalNativeAbiFixupArm(graph, stats); break; #endif #ifdef ART_ENABLE_CODEGEN_arm64 case OptimizationPass::kInstructionSimplifierArm64:
DCHECK(alt_name == nullptr) << "arch-specific pass does not support alternative name";
opt = new (allocator) arm64::InstructionSimplifierArm64(graph, codegen, stats); break; #endif #ifdef ART_ENABLE_CODEGEN_riscv64 case OptimizationPass::kCriticalNativeAbiFixupRiscv64:
DCHECK(alt_name == nullptr) << "arch-specific pass does not support alternative name";
opt = new (allocator) riscv64::CriticalNativeAbiFixupRiscv64(graph, stats); break; case OptimizationPass::kInstructionSimplifierRiscv64:
DCHECK(alt_name == nullptr) << "arch-specific pass does not support alternative name";
opt = new (allocator) riscv64::InstructionSimplifierRiscv64(graph, stats); break; #endif #ifdef ART_ENABLE_CODEGEN_x86 case OptimizationPass::kPcRelativeFixupsX86:
DCHECK(alt_name == nullptr) << "arch-specific pass does not support alternative name";
opt = new (allocator) x86::PcRelativeFixups(graph, codegen, stats); break; case OptimizationPass::kX86MemoryOperandGeneration:
DCHECK(alt_name == nullptr) << "arch-specific pass does not support alternative name";
opt = new (allocator) x86::X86MemoryOperandGeneration(graph, codegen, stats); break; case OptimizationPass::kInstructionSimplifierX86:
opt = new (allocator) x86::InstructionSimplifierX86(graph, codegen, stats); break; #endif #ifdef ART_ENABLE_CODEGEN_x86_64 case OptimizationPass::kInstructionSimplifierX86_64:
opt = new (allocator) x86_64::InstructionSimplifierX86_64(graph, codegen, stats); break; #endif case OptimizationPass::kNone:
LOG(FATAL) << "kNone does not represent an actual pass";
UNREACHABLE();
} // switch
// Add each next optimization to result vector.
CHECK(opt != nullptr);
DCHECK_STREQ(pass_name, opt->GetPassName()); // Consistency check.
optimizations.push_back(opt);
}
return optimizations;
}
} // namespace art
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.1 Sekunden
(vorverarbeitet am 2026-06-29)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.