summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author buzbee <buzbee@google.com> 2014-09-17 13:23:58 -0700
committer Brian Carlstrom <bdc@google.com> 2014-09-17 20:38:27 -0700
commit497d62e65e703a8875ca5001b34a9740ec93b36f (patch)
tree6c699982ec4d46b8a2d7e454c2827914244a7c6e
parente70547c69a4428e32b7182386a6de166e5b3d22b (diff)
ART: skip compilation of huge methods.
Besides not being worthwhile to compile, it huge methods could cause overflow of some internal compiler structures. internal b/17524219 (cherry picked from commit bf5d818f7e59ce33521ad81bbab68b1e7a09e0ba) Change-Id: If99b47c3191c69feee319c9d73537e827ba0cc1d
-rw-r--r--compiler/dex/frontend.cc15
1 files changed, 13 insertions, 2 deletions
diff --git a/compiler/dex/frontend.cc b/compiler/dex/frontend.cc
index b267841fde..07f30334f2 100644
--- a/compiler/dex/frontend.cc
+++ b/compiler/dex/frontend.cc
@@ -82,11 +82,22 @@ static CompiledMethod* CompileMethod(CompilerDriver& driver,
jobject class_loader, const DexFile& dex_file,
void* llvm_compilation_unit) {
VLOG(compiler) << "Compiling " << PrettyMethod(method_idx, dex_file) << "...";
- if (code_item->insns_size_in_code_units_ >= 0x10000) {
- LOG(INFO) << "Method size exceeds compiler limits: " << code_item->insns_size_in_code_units_
+ /*
+ * Skip compilation for pathologically large methods - either by instruction count or num vregs.
+ * Dalvik uses 16-bit uints for instruction and register counts. We'll limit to a quarter
+ * of that, which also guarantees we cannot overflow our 16-bit internal SSA name space.
+ */
+ if (code_item->insns_size_in_code_units_ >= UINT16_MAX / 4) {
+ LOG(INFO) << "Method exceeds compiler instruction limit: "
+ << code_item->insns_size_in_code_units_
<< " in " << PrettyMethod(method_idx, dex_file);
return NULL;
}
+ if (code_item->registers_size_ >= UINT16_MAX / 4) {
+ LOG(INFO) << "Method exceeds compiler virtual register limit: "
+ << code_item->registers_size_ << " in " << PrettyMethod(method_idx, dex_file);
+ return NULL;
+ }
if (!driver.GetCompilerOptions().IsCompilationEnabled()) {
return nullptr;