summaryrefslogtreecommitdiff
path: root/compiler/optimizing/optimization.cc
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/optimizing/optimization.cc')
-rw-r--r--compiler/optimizing/optimization.cc42
1 files changed, 23 insertions, 19 deletions
diff --git a/compiler/optimizing/optimization.cc b/compiler/optimizing/optimization.cc
index 70246604a9..2cac38b715 100644
--- a/compiler/optimizing/optimization.cc
+++ b/compiler/optimizing/optimization.cc
@@ -17,6 +17,7 @@
#include "optimization.h"
#ifdef ART_ENABLE_CODEGEN_arm
+#include "critical_native_abi_fixup_arm.h"
#include "instruction_simplifier_arm.h"
#endif
#ifdef ART_ENABLE_CODEGEN_arm64
@@ -48,7 +49,6 @@
#include "instruction_simplifier.h"
#include "intrinsics.h"
#include "licm.h"
-#include "load_store_analysis.h"
#include "load_store_elimination.h"
#include "loop_optimization.h"
#include "scheduler.h"
@@ -66,8 +66,6 @@ const char* OptimizationPassName(OptimizationPass pass) {
return SideEffectsAnalysis::kSideEffectsAnalysisPassName;
case OptimizationPass::kInductionVarAnalysis:
return HInductionVarAnalysis::kInductionPassName;
- case OptimizationPass::kLoadStoreAnalysis:
- return LoadStoreAnalysis::kLoadStoreAnalysisPassName;
case OptimizationPass::kGlobalValueNumbering:
return GVNOptimization::kGlobalValueNumberingPassName;
case OptimizationPass::kInvariantCodeMotion:
@@ -86,6 +84,7 @@ const char* OptimizationPassName(OptimizationPass pass) {
return HInliner::kInlinerPassName;
case OptimizationPass::kSelectGenerator:
return HSelectGenerator::kSelectGeneratorPassName;
+ case OptimizationPass::kAggressiveInstructionSimplifier:
case OptimizationPass::kInstructionSimplifier:
return InstructionSimplifier::kInstructionSimplifierPassName;
case OptimizationPass::kCHAGuardOptimization:
@@ -99,6 +98,8 @@ const char* OptimizationPassName(OptimizationPass pass) {
#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:
@@ -138,7 +139,6 @@ OptimizationPass OptimizationPassByName(const std::string& pass_name) {
X(OptimizationPass::kInliner);
X(OptimizationPass::kInstructionSimplifier);
X(OptimizationPass::kInvariantCodeMotion);
- X(OptimizationPass::kLoadStoreAnalysis);
X(OptimizationPass::kLoadStoreElimination);
X(OptimizationPass::kLoopOptimization);
X(OptimizationPass::kScheduling);
@@ -146,6 +146,7 @@ OptimizationPass OptimizationPassByName(const std::string& pass_name) {
X(OptimizationPass::kSideEffectsAnalysis);
#ifdef ART_ENABLE_CODEGEN_arm
X(OptimizationPass::kInstructionSimplifierArm);
+ X(OptimizationPass::kCriticalNativeAbiFixupArm);
#endif
#ifdef ART_ENABLE_CODEGEN_arm64
X(OptimizationPass::kInstructionSimplifierArm64);
@@ -167,8 +168,7 @@ ArenaVector<HOptimization*> ConstructOptimizations(
HGraph* graph,
OptimizingCompilerStats* stats,
CodeGenerator* codegen,
- const DexCompilationUnit& dex_compilation_unit,
- VariableSizedHandleScope* handles) {
+ const DexCompilationUnit& dex_compilation_unit) {
ArenaVector<HOptimization*> optimizations(allocator->Adapter());
// Some optimizations require SideEffectsAnalysis or HInductionVarAnalysis
@@ -176,7 +176,6 @@ ArenaVector<HOptimization*> ConstructOptimizations(
// name list or fails fatally if no such analysis can be found.
SideEffectsAnalysis* most_recent_side_effects = nullptr;
HInductionVarAnalysis* most_recent_induction = nullptr;
- LoadStoreAnalysis* most_recent_lsa = nullptr;
// Loop over the requested optimizations.
for (size_t i = 0; i < length; i++) {
@@ -197,9 +196,6 @@ ArenaVector<HOptimization*> ConstructOptimizations(
case OptimizationPass::kInductionVarAnalysis:
opt = most_recent_induction = new (allocator) HInductionVarAnalysis(graph, pass_name);
break;
- case OptimizationPass::kLoadStoreAnalysis:
- opt = most_recent_lsa = new (allocator) LoadStoreAnalysis(graph, pass_name);
- break;
//
// Passes that need prior analysis.
//
@@ -214,18 +210,13 @@ ArenaVector<HOptimization*> ConstructOptimizations(
case OptimizationPass::kLoopOptimization:
CHECK(most_recent_induction != nullptr);
opt = new (allocator) HLoopOptimization(
- graph, &codegen->GetCompilerOptions(), most_recent_induction, stats, pass_name);
+ graph, *codegen, most_recent_induction, stats, pass_name);
break;
case OptimizationPass::kBoundsCheckElimination:
CHECK(most_recent_side_effects != nullptr && most_recent_induction != nullptr);
opt = new (allocator) BoundsCheckElimination(
graph, *most_recent_side_effects, most_recent_induction, pass_name);
break;
- case OptimizationPass::kLoadStoreElimination:
- CHECK(most_recent_side_effects != nullptr && most_recent_induction != nullptr);
- opt = new (allocator) LoadStoreElimination(
- graph, *most_recent_side_effects, *most_recent_lsa, stats, pass_name);
- break;
//
// Regular passes.
//
@@ -243,7 +234,6 @@ ArenaVector<HOptimization*> ConstructOptimizations(
codegen,
dex_compilation_unit, // outer_compilation_unit
dex_compilation_unit, // outermost_compilation_unit
- handles,
stats,
accessor.RegistersSize(),
/* total_number_of_instructions= */ 0,
@@ -253,11 +243,18 @@ ArenaVector<HOptimization*> ConstructOptimizations(
break;
}
case OptimizationPass::kSelectGenerator:
- opt = new (allocator) HSelectGenerator(graph, handles, stats, pass_name);
+ opt = new (allocator) HSelectGenerator(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;
@@ -267,6 +264,9 @@ ArenaVector<HOptimization*> ConstructOptimizations(
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::kScheduling:
opt = new (allocator) HInstructionScheduling(
graph, codegen->GetCompilerOptions().GetInstructionSet(), codegen, pass_name);
@@ -279,6 +279,10 @@ ArenaVector<HOptimization*> ConstructOptimizations(
DCHECK(alt_name == nullptr) << "arch-specific pass does not support alternative name";
opt = new (allocator) arm::InstructionSimplifierArm(graph, 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:
@@ -311,7 +315,7 @@ ArenaVector<HOptimization*> ConstructOptimizations(
// Add each next optimization to result vector.
CHECK(opt != nullptr);
- DCHECK_STREQ(pass_name, opt->GetPassName()); // sanity
+ DCHECK_STREQ(pass_name, opt->GetPassName()); // Consistency check.
optimizations.push_back(opt);
}