From b5f62b3dc5ac2731ba8ad53cdf3d9bdb14fbf86b Mon Sep 17 00:00:00 2001 From: Nicolas Geoffray Date: Thu, 30 Oct 2014 10:58:41 +0000 Subject: Support for CONST_STRING in optimizing compiler. Change-Id: Iab8517bdadd1d15ffbe570010f093660be7c51aa --- compiler/compiler.cc | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) (limited to 'compiler/compiler.cc') diff --git a/compiler/compiler.cc b/compiler/compiler.cc index 36213ca417..744bafa0fe 100644 --- a/compiler/compiler.cc +++ b/compiler/compiler.cc @@ -79,4 +79,26 @@ Compiler* Compiler::Create(CompilerDriver* driver, Compiler::Kind kind) { } } +bool Compiler::IsPathologicalCase(const DexFile::CodeItem& code_item, + uint32_t method_idx, + const DexFile& dex_file) { + /* + * 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 Quick 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 true; + } + 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 true; + } + return false; +} + } // namespace art -- cgit v1.2.3-59-g8ed1b