diff options
author | Brian Carlstrom <bdc@google.com> | 2014-02-10 23:48:36 -0800 |
---|---|---|
committer | Brian Carlstrom <bdc@google.com> | 2014-02-24 14:24:12 -0800 |
commit | 6449c62e40ef3a9bb75f664f922555affb532ee4 (patch) | |
tree | 2f1b2120bd648c95dea32b68c8e168e42c8e24fd /compiler/dex/mir_analysis.cc | |
parent | 3fcf18e25241253f23efbeebe77b2a4c4a7c54d3 (diff) | |
download | art-6449c62e40ef3a9bb75f664f922555affb532ee4.zip art-6449c62e40ef3a9bb75f664f922555affb532ee4.tar.gz art-6449c62e40ef3a9bb75f664f922555affb532ee4.tar.bz2 |
Create CompilerOptions
Package up most compiler related options in CompilerOptions. Details include:
- Includes compiler filter, method thresholds, SEA IR mode.
- Excludes those needed during Runtime::Init such as CompilerCallbacks and VerificationResults.
- Pass CompilerOptions to CompilerDriver.
- Remove CompilerOptions from Runtime.
- Add ability to pass options for app and image dex2oat to runtime via
-Xcompiler-option and -Ximage-compiler-option respectively.
Other
- Replace 2x CompilerCallbacks implementations with one.
- Factor out execv code for use by both image and oat generation.
- More OatFile error_msg reporting.
- DCHECK for SuspendAll found trying to run valgrind.
Change-Id: Iecb57da907be0c856d00c3cd634b5042a229e620
Diffstat (limited to 'compiler/dex/mir_analysis.cc')
-rw-r--r-- | compiler/dex/mir_analysis.cc | 39 |
1 files changed, 21 insertions, 18 deletions
diff --git a/compiler/dex/mir_analysis.cc b/compiler/dex/mir_analysis.cc index ab55333..7ce8f69 100644 --- a/compiler/dex/mir_analysis.cc +++ b/compiler/dex/mir_analysis.cc @@ -18,6 +18,7 @@ #include "dataflow_iterator-inl.h" #include "dex/quick/dex_file_method_inliner.h" #include "dex/quick/dex_file_to_method_inliner_map.h" +#include "driver/compiler_options.h" namespace art { @@ -958,7 +959,7 @@ bool MIRGraph::ComputeSkipCompilation(MethodStats* stats, bool skip_default) { } // Complex, logic-intensive? - if ((GetNumDalvikInsns() > Runtime::Current()->GetSmallMethodThreshold()) && + if (cu_->compiler_driver->GetCompilerOptions().IsSmallMethod(GetNumDalvikInsns()) && stats->branch_ratio > 0.3) { return false; } @@ -984,7 +985,7 @@ bool MIRGraph::ComputeSkipCompilation(MethodStats* stats, bool skip_default) { } // If significant in size and high proportion of expensive operations, skip. - if ((GetNumDalvikInsns() > Runtime::Current()->GetSmallMethodThreshold()) && + if (cu_->compiler_driver->GetCompilerOptions().IsSmallMethod(GetNumDalvikInsns()) && (stats->heavyweight_ratio > 0.3)) { return true; } @@ -996,12 +997,14 @@ bool MIRGraph::ComputeSkipCompilation(MethodStats* stats, bool skip_default) { * Will eventually want this to be a bit more sophisticated and happen at verification time. * Ultimate goal is to drive with profile data. */ -bool MIRGraph::SkipCompilation(Runtime::CompilerFilter compiler_filter) { - if (compiler_filter == Runtime::kEverything) { +bool MIRGraph::SkipCompilation() { + const CompilerOptions& compiler_options = cu_->compiler_driver->GetCompilerOptions(); + CompilerOptions::CompilerFilter compiler_filter = compiler_options.GetCompilerFilter(); + if (compiler_filter == CompilerOptions::kEverything) { return false; } - if (compiler_filter == Runtime::kInterpretOnly) { + if (compiler_filter == CompilerOptions::kInterpretOnly) { LOG(WARNING) << "InterpretOnly should ideally be filtered out prior to parsing."; return true; } @@ -1010,17 +1013,17 @@ bool MIRGraph::SkipCompilation(Runtime::CompilerFilter compiler_filter) { size_t small_cutoff = 0; size_t default_cutoff = 0; switch (compiler_filter) { - case Runtime::kBalanced: - small_cutoff = Runtime::Current()->GetSmallMethodThreshold(); - default_cutoff = Runtime::Current()->GetLargeMethodThreshold(); + case CompilerOptions::kBalanced: + small_cutoff = compiler_options.GetSmallMethodThreshold(); + default_cutoff = compiler_options.GetLargeMethodThreshold(); break; - case Runtime::kSpace: - small_cutoff = Runtime::Current()->GetTinyMethodThreshold(); - default_cutoff = Runtime::Current()->GetSmallMethodThreshold(); + case CompilerOptions::kSpace: + small_cutoff = compiler_options.GetTinyMethodThreshold(); + default_cutoff = compiler_options.GetSmallMethodThreshold(); break; - case Runtime::kSpeed: - small_cutoff = Runtime::Current()->GetHugeMethodThreshold(); - default_cutoff = Runtime::Current()->GetHugeMethodThreshold(); + case CompilerOptions::kSpeed: + small_cutoff = compiler_options.GetHugeMethodThreshold(); + default_cutoff = compiler_options.GetHugeMethodThreshold(); break; default: LOG(FATAL) << "Unexpected compiler_filter_: " << compiler_filter; @@ -1033,17 +1036,17 @@ bool MIRGraph::SkipCompilation(Runtime::CompilerFilter compiler_filter) { * Filter 1: Huge methods are likely to be machine generated, but some aren't. * If huge, assume we won't compile, but allow futher analysis to turn it back on. */ - if (GetNumDalvikInsns() > Runtime::Current()->GetHugeMethodThreshold()) { + if (compiler_options.IsHugeMethod(GetNumDalvikInsns())) { skip_compilation = true; // If we're got a huge number of basic blocks, don't bother with further analysis. - if (static_cast<size_t>(num_blocks_) > (Runtime::Current()->GetHugeMethodThreshold() / 2)) { + if (static_cast<size_t>(num_blocks_) > (compiler_options.GetHugeMethodThreshold() / 2)) { return true; } - } else if (GetNumDalvikInsns() > Runtime::Current()->GetLargeMethodThreshold() && + } else if (compiler_options.IsLargeMethod(GetNumDalvikInsns()) && /* If it's large and contains no branches, it's likely to be machine generated initialization */ (GetBranchCount() == 0)) { return true; - } else if (compiler_filter == Runtime::kSpeed) { + } else if (compiler_filter == CompilerOptions::kSpeed) { // If not huge, compile. return false; } |