quick_compiler.cc revision 3773cd046b1c34569f4711666788bf8a389c7857
1/* 2 * Copyright (C) 2014 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#include "quick_compiler.h" 18 19#include <cstdint> 20 21#include "base/dumpable.h" 22#include "base/logging.h" 23#include "base/macros.h" 24#include "base/timing_logger.h" 25#include "compiler.h" 26#include "dex_file-inl.h" 27#include "dex_file_to_method_inliner_map.h" 28#include "dex/compiler_ir.h" 29#include "dex/dex_flags.h" 30#include "dex/mir_graph.h" 31#include "dex/pass_driver_me_opts.h" 32#include "dex/pass_driver_me_post_opt.h" 33#include "dex/pass_manager.h" 34#include "dex/quick/mir_to_lir.h" 35#include "driver/compiler_driver.h" 36#include "driver/compiler_options.h" 37#include "elf_writer_quick.h" 38#include "jni/quick/jni_compiler.h" 39#include "mir_to_lir.h" 40#include "mirror/art_method-inl.h" 41#include "mirror/object.h" 42#include "runtime.h" 43 44// Specific compiler backends. 45#include "dex/quick/arm/backend_arm.h" 46#include "dex/quick/arm64/backend_arm64.h" 47#include "dex/quick/mips/backend_mips.h" 48#include "dex/quick/x86/backend_x86.h" 49 50namespace art { 51 52static_assert(0U == static_cast<size_t>(kNone), "kNone not 0"); 53static_assert(1U == static_cast<size_t>(kArm), "kArm not 1"); 54static_assert(2U == static_cast<size_t>(kArm64), "kArm64 not 2"); 55static_assert(3U == static_cast<size_t>(kThumb2), "kThumb2 not 3"); 56static_assert(4U == static_cast<size_t>(kX86), "kX86 not 4"); 57static_assert(5U == static_cast<size_t>(kX86_64), "kX86_64 not 5"); 58static_assert(6U == static_cast<size_t>(kMips), "kMips not 6"); 59static_assert(7U == static_cast<size_t>(kMips64), "kMips64 not 7"); 60 61// Additional disabled optimizations (over generally disabled) per instruction set. 62static constexpr uint32_t kDisabledOptimizationsPerISA[] = { 63 // 0 = kNone. 64 ~0U, 65 // 1 = kArm, unused (will use kThumb2). 66 ~0U, 67 // 2 = kArm64. 68 0, 69 // 3 = kThumb2. 70 0, 71 // 4 = kX86. 72 (1 << kLoadStoreElimination) | 73 0, 74 // 5 = kX86_64. 75 (1 << kLoadStoreElimination) | 76 0, 77 // 6 = kMips. 78 (1 << kLoadStoreElimination) | 79 (1 << kLoadHoisting) | 80 (1 << kSuppressLoads) | 81 (1 << kNullCheckElimination) | 82 (1 << kPromoteRegs) | 83 (1 << kTrackLiveTemps) | 84 (1 << kSafeOptimizations) | 85 (1 << kBBOpt) | 86 (1 << kMatch) | 87 (1 << kPromoteCompilerTemps) | 88 0, 89 // 7 = kMips64. 90 (1 << kLoadStoreElimination) | 91 (1 << kLoadHoisting) | 92 (1 << kSuppressLoads) | 93 (1 << kNullCheckElimination) | 94 (1 << kPromoteRegs) | 95 (1 << kTrackLiveTemps) | 96 (1 << kSafeOptimizations) | 97 (1 << kBBOpt) | 98 (1 << kMatch) | 99 (1 << kPromoteCompilerTemps) | 100 0 101}; 102static_assert(sizeof(kDisabledOptimizationsPerISA) == 8 * sizeof(uint32_t), 103 "kDisabledOpts unexpected"); 104 105// Supported shorty types per instruction set. nullptr means that all are available. 106// Z : boolean 107// B : byte 108// S : short 109// C : char 110// I : int 111// J : long 112// F : float 113// D : double 114// L : reference(object, array) 115// V : void 116static const char* kSupportedTypes[] = { 117 // 0 = kNone. 118 "", 119 // 1 = kArm, unused (will use kThumb2). 120 "", 121 // 2 = kArm64. 122 nullptr, 123 // 3 = kThumb2. 124 nullptr, 125 // 4 = kX86. 126 nullptr, 127 // 5 = kX86_64. 128 nullptr, 129 // 6 = kMips. 130 nullptr, 131 // 7 = kMips64. 132 nullptr 133}; 134static_assert(sizeof(kSupportedTypes) == 8 * sizeof(char*), "kSupportedTypes unexpected"); 135 136static int kAllOpcodes[] = { 137 Instruction::NOP, 138 Instruction::MOVE, 139 Instruction::MOVE_FROM16, 140 Instruction::MOVE_16, 141 Instruction::MOVE_WIDE, 142 Instruction::MOVE_WIDE_FROM16, 143 Instruction::MOVE_WIDE_16, 144 Instruction::MOVE_OBJECT, 145 Instruction::MOVE_OBJECT_FROM16, 146 Instruction::MOVE_OBJECT_16, 147 Instruction::MOVE_RESULT, 148 Instruction::MOVE_RESULT_WIDE, 149 Instruction::MOVE_RESULT_OBJECT, 150 Instruction::MOVE_EXCEPTION, 151 Instruction::RETURN_VOID, 152 Instruction::RETURN, 153 Instruction::RETURN_WIDE, 154 Instruction::RETURN_OBJECT, 155 Instruction::CONST_4, 156 Instruction::CONST_16, 157 Instruction::CONST, 158 Instruction::CONST_HIGH16, 159 Instruction::CONST_WIDE_16, 160 Instruction::CONST_WIDE_32, 161 Instruction::CONST_WIDE, 162 Instruction::CONST_WIDE_HIGH16, 163 Instruction::CONST_STRING, 164 Instruction::CONST_STRING_JUMBO, 165 Instruction::CONST_CLASS, 166 Instruction::MONITOR_ENTER, 167 Instruction::MONITOR_EXIT, 168 Instruction::CHECK_CAST, 169 Instruction::INSTANCE_OF, 170 Instruction::ARRAY_LENGTH, 171 Instruction::NEW_INSTANCE, 172 Instruction::NEW_ARRAY, 173 Instruction::FILLED_NEW_ARRAY, 174 Instruction::FILLED_NEW_ARRAY_RANGE, 175 Instruction::FILL_ARRAY_DATA, 176 Instruction::THROW, 177 Instruction::GOTO, 178 Instruction::GOTO_16, 179 Instruction::GOTO_32, 180 Instruction::PACKED_SWITCH, 181 Instruction::SPARSE_SWITCH, 182 Instruction::CMPL_FLOAT, 183 Instruction::CMPG_FLOAT, 184 Instruction::CMPL_DOUBLE, 185 Instruction::CMPG_DOUBLE, 186 Instruction::CMP_LONG, 187 Instruction::IF_EQ, 188 Instruction::IF_NE, 189 Instruction::IF_LT, 190 Instruction::IF_GE, 191 Instruction::IF_GT, 192 Instruction::IF_LE, 193 Instruction::IF_EQZ, 194 Instruction::IF_NEZ, 195 Instruction::IF_LTZ, 196 Instruction::IF_GEZ, 197 Instruction::IF_GTZ, 198 Instruction::IF_LEZ, 199 Instruction::UNUSED_3E, 200 Instruction::UNUSED_3F, 201 Instruction::UNUSED_40, 202 Instruction::UNUSED_41, 203 Instruction::UNUSED_42, 204 Instruction::UNUSED_43, 205 Instruction::AGET, 206 Instruction::AGET_WIDE, 207 Instruction::AGET_OBJECT, 208 Instruction::AGET_BOOLEAN, 209 Instruction::AGET_BYTE, 210 Instruction::AGET_CHAR, 211 Instruction::AGET_SHORT, 212 Instruction::APUT, 213 Instruction::APUT_WIDE, 214 Instruction::APUT_OBJECT, 215 Instruction::APUT_BOOLEAN, 216 Instruction::APUT_BYTE, 217 Instruction::APUT_CHAR, 218 Instruction::APUT_SHORT, 219 Instruction::IGET, 220 Instruction::IGET_WIDE, 221 Instruction::IGET_OBJECT, 222 Instruction::IGET_BOOLEAN, 223 Instruction::IGET_BYTE, 224 Instruction::IGET_CHAR, 225 Instruction::IGET_SHORT, 226 Instruction::IPUT, 227 Instruction::IPUT_WIDE, 228 Instruction::IPUT_OBJECT, 229 Instruction::IPUT_BOOLEAN, 230 Instruction::IPUT_BYTE, 231 Instruction::IPUT_CHAR, 232 Instruction::IPUT_SHORT, 233 Instruction::SGET, 234 Instruction::SGET_WIDE, 235 Instruction::SGET_OBJECT, 236 Instruction::SGET_BOOLEAN, 237 Instruction::SGET_BYTE, 238 Instruction::SGET_CHAR, 239 Instruction::SGET_SHORT, 240 Instruction::SPUT, 241 Instruction::SPUT_WIDE, 242 Instruction::SPUT_OBJECT, 243 Instruction::SPUT_BOOLEAN, 244 Instruction::SPUT_BYTE, 245 Instruction::SPUT_CHAR, 246 Instruction::SPUT_SHORT, 247 Instruction::INVOKE_VIRTUAL, 248 Instruction::INVOKE_SUPER, 249 Instruction::INVOKE_DIRECT, 250 Instruction::INVOKE_STATIC, 251 Instruction::INVOKE_INTERFACE, 252 Instruction::RETURN_VOID_NO_BARRIER, 253 Instruction::INVOKE_VIRTUAL_RANGE, 254 Instruction::INVOKE_SUPER_RANGE, 255 Instruction::INVOKE_DIRECT_RANGE, 256 Instruction::INVOKE_STATIC_RANGE, 257 Instruction::INVOKE_INTERFACE_RANGE, 258 Instruction::UNUSED_79, 259 Instruction::UNUSED_7A, 260 Instruction::NEG_INT, 261 Instruction::NOT_INT, 262 Instruction::NEG_LONG, 263 Instruction::NOT_LONG, 264 Instruction::NEG_FLOAT, 265 Instruction::NEG_DOUBLE, 266 Instruction::INT_TO_LONG, 267 Instruction::INT_TO_FLOAT, 268 Instruction::INT_TO_DOUBLE, 269 Instruction::LONG_TO_INT, 270 Instruction::LONG_TO_FLOAT, 271 Instruction::LONG_TO_DOUBLE, 272 Instruction::FLOAT_TO_INT, 273 Instruction::FLOAT_TO_LONG, 274 Instruction::FLOAT_TO_DOUBLE, 275 Instruction::DOUBLE_TO_INT, 276 Instruction::DOUBLE_TO_LONG, 277 Instruction::DOUBLE_TO_FLOAT, 278 Instruction::INT_TO_BYTE, 279 Instruction::INT_TO_CHAR, 280 Instruction::INT_TO_SHORT, 281 Instruction::ADD_INT, 282 Instruction::SUB_INT, 283 Instruction::MUL_INT, 284 Instruction::DIV_INT, 285 Instruction::REM_INT, 286 Instruction::AND_INT, 287 Instruction::OR_INT, 288 Instruction::XOR_INT, 289 Instruction::SHL_INT, 290 Instruction::SHR_INT, 291 Instruction::USHR_INT, 292 Instruction::ADD_LONG, 293 Instruction::SUB_LONG, 294 Instruction::MUL_LONG, 295 Instruction::DIV_LONG, 296 Instruction::REM_LONG, 297 Instruction::AND_LONG, 298 Instruction::OR_LONG, 299 Instruction::XOR_LONG, 300 Instruction::SHL_LONG, 301 Instruction::SHR_LONG, 302 Instruction::USHR_LONG, 303 Instruction::ADD_FLOAT, 304 Instruction::SUB_FLOAT, 305 Instruction::MUL_FLOAT, 306 Instruction::DIV_FLOAT, 307 Instruction::REM_FLOAT, 308 Instruction::ADD_DOUBLE, 309 Instruction::SUB_DOUBLE, 310 Instruction::MUL_DOUBLE, 311 Instruction::DIV_DOUBLE, 312 Instruction::REM_DOUBLE, 313 Instruction::ADD_INT_2ADDR, 314 Instruction::SUB_INT_2ADDR, 315 Instruction::MUL_INT_2ADDR, 316 Instruction::DIV_INT_2ADDR, 317 Instruction::REM_INT_2ADDR, 318 Instruction::AND_INT_2ADDR, 319 Instruction::OR_INT_2ADDR, 320 Instruction::XOR_INT_2ADDR, 321 Instruction::SHL_INT_2ADDR, 322 Instruction::SHR_INT_2ADDR, 323 Instruction::USHR_INT_2ADDR, 324 Instruction::ADD_LONG_2ADDR, 325 Instruction::SUB_LONG_2ADDR, 326 Instruction::MUL_LONG_2ADDR, 327 Instruction::DIV_LONG_2ADDR, 328 Instruction::REM_LONG_2ADDR, 329 Instruction::AND_LONG_2ADDR, 330 Instruction::OR_LONG_2ADDR, 331 Instruction::XOR_LONG_2ADDR, 332 Instruction::SHL_LONG_2ADDR, 333 Instruction::SHR_LONG_2ADDR, 334 Instruction::USHR_LONG_2ADDR, 335 Instruction::ADD_FLOAT_2ADDR, 336 Instruction::SUB_FLOAT_2ADDR, 337 Instruction::MUL_FLOAT_2ADDR, 338 Instruction::DIV_FLOAT_2ADDR, 339 Instruction::REM_FLOAT_2ADDR, 340 Instruction::ADD_DOUBLE_2ADDR, 341 Instruction::SUB_DOUBLE_2ADDR, 342 Instruction::MUL_DOUBLE_2ADDR, 343 Instruction::DIV_DOUBLE_2ADDR, 344 Instruction::REM_DOUBLE_2ADDR, 345 Instruction::ADD_INT_LIT16, 346 Instruction::RSUB_INT, 347 Instruction::MUL_INT_LIT16, 348 Instruction::DIV_INT_LIT16, 349 Instruction::REM_INT_LIT16, 350 Instruction::AND_INT_LIT16, 351 Instruction::OR_INT_LIT16, 352 Instruction::XOR_INT_LIT16, 353 Instruction::ADD_INT_LIT8, 354 Instruction::RSUB_INT_LIT8, 355 Instruction::MUL_INT_LIT8, 356 Instruction::DIV_INT_LIT8, 357 Instruction::REM_INT_LIT8, 358 Instruction::AND_INT_LIT8, 359 Instruction::OR_INT_LIT8, 360 Instruction::XOR_INT_LIT8, 361 Instruction::SHL_INT_LIT8, 362 Instruction::SHR_INT_LIT8, 363 Instruction::USHR_INT_LIT8, 364 Instruction::IGET_QUICK, 365 Instruction::IGET_WIDE_QUICK, 366 Instruction::IGET_OBJECT_QUICK, 367 Instruction::IPUT_QUICK, 368 Instruction::IPUT_WIDE_QUICK, 369 Instruction::IPUT_OBJECT_QUICK, 370 Instruction::INVOKE_VIRTUAL_QUICK, 371 Instruction::INVOKE_VIRTUAL_RANGE_QUICK, 372 Instruction::IPUT_BOOLEAN_QUICK, 373 Instruction::IPUT_BYTE_QUICK, 374 Instruction::IPUT_CHAR_QUICK, 375 Instruction::IPUT_SHORT_QUICK, 376 Instruction::IGET_BOOLEAN_QUICK, 377 Instruction::IGET_BYTE_QUICK, 378 Instruction::IGET_CHAR_QUICK, 379 Instruction::IGET_SHORT_QUICK, 380 Instruction::UNUSED_F3, 381 Instruction::UNUSED_F4, 382 Instruction::UNUSED_F5, 383 Instruction::UNUSED_F6, 384 Instruction::UNUSED_F7, 385 Instruction::UNUSED_F8, 386 Instruction::UNUSED_F9, 387 Instruction::UNUSED_FA, 388 Instruction::UNUSED_FB, 389 Instruction::UNUSED_FC, 390 Instruction::UNUSED_FD, 391 Instruction::UNUSED_FE, 392 Instruction::UNUSED_FF, 393 // ----- ExtendedMIROpcode ----- 394 kMirOpPhi, 395 kMirOpCopy, 396 kMirOpFusedCmplFloat, 397 kMirOpFusedCmpgFloat, 398 kMirOpFusedCmplDouble, 399 kMirOpFusedCmpgDouble, 400 kMirOpFusedCmpLong, 401 kMirOpNop, 402 kMirOpNullCheck, 403 kMirOpRangeCheck, 404 kMirOpDivZeroCheck, 405 kMirOpCheck, 406 kMirOpCheckPart2, 407 kMirOpSelect, 408}; 409 410static int kInvokeOpcodes[] = { 411 Instruction::INVOKE_VIRTUAL, 412 Instruction::INVOKE_SUPER, 413 Instruction::INVOKE_DIRECT, 414 Instruction::INVOKE_STATIC, 415 Instruction::INVOKE_INTERFACE, 416 Instruction::INVOKE_VIRTUAL_RANGE, 417 Instruction::INVOKE_SUPER_RANGE, 418 Instruction::INVOKE_DIRECT_RANGE, 419 Instruction::INVOKE_STATIC_RANGE, 420 Instruction::INVOKE_INTERFACE_RANGE, 421 Instruction::INVOKE_VIRTUAL_QUICK, 422 Instruction::INVOKE_VIRTUAL_RANGE_QUICK, 423}; 424 425// Unsupported opcodes. nullptr can be used when everything is supported. Size of the lists is 426// recorded below. 427static const int* kUnsupportedOpcodes[] = { 428 // 0 = kNone. 429 kAllOpcodes, 430 // 1 = kArm, unused (will use kThumb2). 431 kAllOpcodes, 432 // 2 = kArm64. 433 nullptr, 434 // 3 = kThumb2. 435 nullptr, 436 // 4 = kX86. 437 nullptr, 438 // 5 = kX86_64. 439 nullptr, 440 // 6 = kMips. 441 nullptr, 442 // 7 = kMips64. 443 nullptr 444}; 445static_assert(sizeof(kUnsupportedOpcodes) == 8 * sizeof(int*), "kUnsupportedOpcodes unexpected"); 446 447// Size of the arrays stored above. 448static const size_t kUnsupportedOpcodesSize[] = { 449 // 0 = kNone. 450 arraysize(kAllOpcodes), 451 // 1 = kArm, unused (will use kThumb2). 452 arraysize(kAllOpcodes), 453 // 2 = kArm64. 454 0, 455 // 3 = kThumb2. 456 0, 457 // 4 = kX86. 458 0, 459 // 5 = kX86_64. 460 0, 461 // 6 = kMips. 462 0, 463 // 7 = kMips64. 464 0 465}; 466static_assert(sizeof(kUnsupportedOpcodesSize) == 8 * sizeof(size_t), 467 "kUnsupportedOpcodesSize unexpected"); 468 469// The maximum amount of Dalvik register in a method for which we will start compiling. Tries to 470// avoid an abort when we need to manage more SSA registers than we can. 471static constexpr size_t kMaxAllowedDalvikRegisters = INT16_MAX / 2; 472 473static bool CanCompileShorty(const char* shorty, InstructionSet instruction_set) { 474 const char* supported_types = kSupportedTypes[instruction_set]; 475 if (supported_types == nullptr) { 476 // Everything available. 477 return true; 478 } 479 480 uint32_t shorty_size = strlen(shorty); 481 CHECK_GE(shorty_size, 1u); 482 483 for (uint32_t i = 0; i < shorty_size; i++) { 484 if (strchr(supported_types, shorty[i]) == nullptr) { 485 return false; 486 } 487 } 488 return true; 489} 490 491// Skip the method that we do not support currently. 492bool QuickCompiler::CanCompileMethod(uint32_t method_idx, const DexFile& dex_file, 493 CompilationUnit* cu) const { 494 // This is a limitation in mir_graph. See MirGraph::SetNumSSARegs. 495 if (cu->mir_graph->GetNumOfCodeAndTempVRs() > kMaxAllowedDalvikRegisters) { 496 VLOG(compiler) << "Too many dalvik registers : " << cu->mir_graph->GetNumOfCodeAndTempVRs(); 497 return false; 498 } 499 500 // Check whether we do have limitations at all. 501 if (kSupportedTypes[cu->instruction_set] == nullptr && 502 kUnsupportedOpcodesSize[cu->instruction_set] == 0U) { 503 return true; 504 } 505 506 // Check if we can compile the prototype. 507 const char* shorty = dex_file.GetMethodShorty(dex_file.GetMethodId(method_idx)); 508 if (!CanCompileShorty(shorty, cu->instruction_set)) { 509 VLOG(compiler) << "Unsupported shorty : " << shorty; 510 return false; 511 } 512 513 const int *unsupport_list = kUnsupportedOpcodes[cu->instruction_set]; 514 int unsupport_list_size = kUnsupportedOpcodesSize[cu->instruction_set]; 515 516 for (unsigned int idx = 0; idx < cu->mir_graph->GetNumBlocks(); idx++) { 517 BasicBlock* bb = cu->mir_graph->GetBasicBlock(idx); 518 if (bb == NULL) continue; 519 if (bb->block_type == kDead) continue; 520 for (MIR* mir = bb->first_mir_insn; mir != nullptr; mir = mir->next) { 521 int opcode = mir->dalvikInsn.opcode; 522 // Check if we support the byte code. 523 if (std::find(unsupport_list, unsupport_list + unsupport_list_size, opcode) 524 != unsupport_list + unsupport_list_size) { 525 if (!MIR::DecodedInstruction::IsPseudoMirOp(opcode)) { 526 VLOG(compiler) << "Unsupported dalvik byte code : " 527 << mir->dalvikInsn.opcode; 528 } else { 529 VLOG(compiler) << "Unsupported extended MIR opcode : " 530 << MIRGraph::extended_mir_op_names_[opcode - kMirOpFirst]; 531 } 532 return false; 533 } 534 // Check if it invokes a prototype that we cannot support. 535 if (std::find(kInvokeOpcodes, kInvokeOpcodes + arraysize(kInvokeOpcodes), opcode) 536 != kInvokeOpcodes + arraysize(kInvokeOpcodes)) { 537 uint32_t invoke_method_idx = mir->dalvikInsn.vB; 538 const char* invoke_method_shorty = dex_file.GetMethodShorty( 539 dex_file.GetMethodId(invoke_method_idx)); 540 if (!CanCompileShorty(invoke_method_shorty, cu->instruction_set)) { 541 VLOG(compiler) << "Unsupported to invoke '" 542 << PrettyMethod(invoke_method_idx, dex_file) 543 << "' with shorty : " << invoke_method_shorty; 544 return false; 545 } 546 } 547 } 548 } 549 return true; 550} 551 552void QuickCompiler::InitCompilationUnit(CompilationUnit& cu) const { 553 // Disable optimizations according to instruction set. 554 cu.disable_opt |= kDisabledOptimizationsPerISA[cu.instruction_set]; 555 if (Runtime::Current()->UseJit()) { 556 // Disable these optimizations for JIT until quickened byte codes are done being implemented. 557 // TODO: Find a cleaner way to do this. 558 cu.disable_opt |= 1u << kLocalValueNumbering; 559 } 560} 561 562void QuickCompiler::Init() { 563 CHECK(GetCompilerDriver()->GetCompilerContext() == nullptr); 564} 565 566void QuickCompiler::UnInit() const { 567 CHECK(GetCompilerDriver()->GetCompilerContext() == nullptr); 568} 569 570/* Default optimizer/debug setting for the compiler. */ 571static uint32_t kCompilerOptimizerDisableFlags = 0 | // Disable specific optimizations 572 // (1 << kLoadStoreElimination) | 573 // (1 << kLoadHoisting) | 574 // (1 << kSuppressLoads) | 575 // (1 << kNullCheckElimination) | 576 // (1 << kClassInitCheckElimination) | 577 // (1 << kGlobalValueNumbering) | 578 (1 << kGvnDeadCodeElimination) | 579 // (1 << kLocalValueNumbering) | 580 // (1 << kPromoteRegs) | 581 // (1 << kTrackLiveTemps) | 582 // (1 << kSafeOptimizations) | 583 // (1 << kBBOpt) | 584 // (1 << kSuspendCheckElimination) | 585 // (1 << kMatch) | 586 // (1 << kPromoteCompilerTemps) | 587 // (1 << kSuppressExceptionEdges) | 588 // (1 << kSuppressMethodInlining) | 589 0; 590 591static uint32_t kCompilerDebugFlags = 0 | // Enable debug/testing modes 592 // (1 << kDebugDisplayMissingTargets) | 593 // (1 << kDebugVerbose) | 594 // (1 << kDebugDumpCFG) | 595 // (1 << kDebugSlowFieldPath) | 596 // (1 << kDebugSlowInvokePath) | 597 // (1 << kDebugSlowStringPath) | 598 // (1 << kDebugSlowestFieldPath) | 599 // (1 << kDebugSlowestStringPath) | 600 // (1 << kDebugExerciseResolveMethod) | 601 // (1 << kDebugVerifyDataflow) | 602 // (1 << kDebugShowMemoryUsage) | 603 // (1 << kDebugShowNops) | 604 // (1 << kDebugCountOpcodes) | 605 // (1 << kDebugDumpCheckStats) | 606 // (1 << kDebugShowSummaryMemoryUsage) | 607 // (1 << kDebugShowFilterStats) | 608 // (1 << kDebugTimings) | 609 // (1 << kDebugCodegenDump) | 610 0; 611 612CompiledMethod* QuickCompiler::Compile(const DexFile::CodeItem* code_item, 613 uint32_t access_flags, 614 InvokeType invoke_type, 615 uint16_t class_def_idx, 616 uint32_t method_idx, 617 jobject class_loader, 618 const DexFile& dex_file) const { 619 // TODO: check method fingerprint here to determine appropriate backend type. Until then, use 620 // build default. 621 CompilerDriver* driver = GetCompilerDriver(); 622 623 VLOG(compiler) << "Compiling " << PrettyMethod(method_idx, dex_file) << "..."; 624 if (Compiler::IsPathologicalCase(*code_item, method_idx, dex_file)) { 625 return nullptr; 626 } 627 628 DCHECK(driver->GetCompilerOptions().IsCompilationEnabled()); 629 630 Runtime* const runtime = Runtime::Current(); 631 ClassLinker* const class_linker = runtime->GetClassLinker(); 632 InstructionSet instruction_set = driver->GetInstructionSet(); 633 if (instruction_set == kArm) { 634 instruction_set = kThumb2; 635 } 636 CompilationUnit cu(runtime->GetArenaPool(), instruction_set, driver, class_linker); 637 cu.dex_file = &dex_file; 638 cu.class_def_idx = class_def_idx; 639 cu.method_idx = method_idx; 640 cu.access_flags = access_flags; 641 cu.invoke_type = invoke_type; 642 cu.shorty = dex_file.GetMethodShorty(dex_file.GetMethodId(method_idx)); 643 644 CHECK((cu.instruction_set == kThumb2) || 645 (cu.instruction_set == kArm64) || 646 (cu.instruction_set == kX86) || 647 (cu.instruction_set == kX86_64) || 648 (cu.instruction_set == kMips) || 649 (cu.instruction_set == kMips64)); 650 651 // TODO: set this from command line 652 constexpr bool compiler_flip_match = false; 653 const std::string compiler_method_match = ""; 654 655 bool use_match = !compiler_method_match.empty(); 656 bool match = use_match && (compiler_flip_match ^ 657 (PrettyMethod(method_idx, dex_file).find(compiler_method_match) != std::string::npos)); 658 if (!use_match || match) { 659 cu.disable_opt = kCompilerOptimizerDisableFlags; 660 cu.enable_debug = kCompilerDebugFlags; 661 cu.verbose = VLOG_IS_ON(compiler) || 662 (cu.enable_debug & (1 << kDebugVerbose)); 663 } 664 665 if (driver->GetCompilerOptions().HasVerboseMethods()) { 666 cu.verbose = driver->GetCompilerOptions().IsVerboseMethod(PrettyMethod(method_idx, dex_file)); 667 } 668 669 if (cu.verbose) { 670 cu.enable_debug |= (1 << kDebugCodegenDump); 671 } 672 673 /* 674 * TODO: rework handling of optimization and debug flags. Should we split out 675 * MIR and backend flags? Need command-line setting as well. 676 */ 677 678 InitCompilationUnit(cu); 679 680 cu.StartTimingSplit("BuildMIRGraph"); 681 cu.mir_graph.reset(new MIRGraph(&cu, &cu.arena)); 682 683 /* 684 * After creation of the MIR graph, also create the code generator. 685 * The reason we do this is that optimizations on the MIR graph may need to get information 686 * that is only available if a CG exists. 687 */ 688 cu.cg.reset(GetCodeGenerator(&cu, nullptr)); 689 690 /* Gathering opcode stats? */ 691 if (kCompilerDebugFlags & (1 << kDebugCountOpcodes)) { 692 cu.mir_graph->EnableOpcodeCounting(); 693 } 694 695 /* Build the raw MIR graph */ 696 cu.mir_graph->InlineMethod(code_item, access_flags, invoke_type, class_def_idx, method_idx, 697 class_loader, dex_file); 698 699 if (!CanCompileMethod(method_idx, dex_file, &cu)) { 700 VLOG(compiler) << cu.instruction_set << ": Cannot compile method : " 701 << PrettyMethod(method_idx, dex_file); 702 cu.EndTiming(); 703 return nullptr; 704 } 705 706 cu.NewTimingSplit("MIROpt:CheckFilters"); 707 std::string skip_message; 708 if (cu.mir_graph->SkipCompilation(&skip_message)) { 709 VLOG(compiler) << cu.instruction_set << ": Skipping method : " 710 << PrettyMethod(method_idx, dex_file) << " Reason = " << skip_message; 711 cu.EndTiming(); 712 return nullptr; 713 } 714 715 /* Create the pass driver and launch it */ 716 PassDriverMEOpts pass_driver(GetPreOptPassManager(), GetPostOptPassManager(), &cu); 717 pass_driver.Launch(); 718 719 /* For non-leaf methods check if we should skip compilation when the profiler is enabled. */ 720 if (cu.compiler_driver->ProfilePresent() 721 && !cu.mir_graph->MethodIsLeaf() 722 && cu.mir_graph->SkipCompilationByName(PrettyMethod(method_idx, dex_file))) { 723 cu.EndTiming(); 724 return nullptr; 725 } 726 727 if (cu.enable_debug & (1 << kDebugDumpCheckStats)) { 728 cu.mir_graph->DumpCheckStats(); 729 } 730 731 if (kCompilerDebugFlags & (1 << kDebugCountOpcodes)) { 732 cu.mir_graph->ShowOpcodeStats(); 733 } 734 735 /* Reassociate sreg names with original Dalvik vreg names. */ 736 cu.mir_graph->RemapRegLocations(); 737 738 /* Free Arenas from the cu.arena_stack for reuse by the cu.arena in the codegen. */ 739 if (cu.enable_debug & (1 << kDebugShowMemoryUsage)) { 740 if (cu.arena_stack.PeakBytesAllocated() > 1 * 1024 * 1024) { 741 MemStats stack_stats(cu.arena_stack.GetPeakStats()); 742 LOG(INFO) << PrettyMethod(method_idx, dex_file) << " " << Dumpable<MemStats>(stack_stats); 743 } 744 } 745 cu.arena_stack.Reset(); 746 747 CompiledMethod* result = nullptr; 748 749 if (cu.mir_graph->PuntToInterpreter()) { 750 VLOG(compiler) << cu.instruction_set << ": Punted method to interpreter: " 751 << PrettyMethod(method_idx, dex_file); 752 cu.EndTiming(); 753 return nullptr; 754 } 755 756 cu.cg->Materialize(); 757 758 cu.NewTimingSplit("Dedupe"); /* deduping takes up the vast majority of time in GetCompiledMethod(). */ 759 result = cu.cg->GetCompiledMethod(); 760 cu.NewTimingSplit("Cleanup"); 761 762 if (result) { 763 VLOG(compiler) << cu.instruction_set << ": Compiled " << PrettyMethod(method_idx, dex_file); 764 } else { 765 VLOG(compiler) << cu.instruction_set << ": Deferred " << PrettyMethod(method_idx, dex_file); 766 } 767 768 if (cu.enable_debug & (1 << kDebugShowMemoryUsage)) { 769 if (cu.arena.BytesAllocated() > (1 * 1024 *1024)) { 770 MemStats mem_stats(cu.arena.GetMemStats()); 771 LOG(INFO) << PrettyMethod(method_idx, dex_file) << " " << Dumpable<MemStats>(mem_stats); 772 } 773 } 774 775 if (cu.enable_debug & (1 << kDebugShowSummaryMemoryUsage)) { 776 LOG(INFO) << "MEMINFO " << cu.arena.BytesAllocated() << " " << cu.mir_graph->GetNumBlocks() 777 << " " << PrettyMethod(method_idx, dex_file); 778 } 779 780 cu.EndTiming(); 781 driver->GetTimingsLogger()->AddLogger(cu.timings); 782 return result; 783} 784 785CompiledMethod* QuickCompiler::JniCompile(uint32_t access_flags, 786 uint32_t method_idx, 787 const DexFile& dex_file) const { 788 return ArtQuickJniCompileMethod(GetCompilerDriver(), access_flags, method_idx, dex_file); 789} 790 791uintptr_t QuickCompiler::GetEntryPointOf(mirror::ArtMethod* method) const { 792 return reinterpret_cast<uintptr_t>(method->GetEntryPointFromQuickCompiledCodePtrSize( 793 InstructionSetPointerSize(GetCompilerDriver()->GetInstructionSet()))); 794} 795 796Mir2Lir* QuickCompiler::GetCodeGenerator(CompilationUnit* cu, void* compilation_unit) { 797 UNUSED(compilation_unit); 798 Mir2Lir* mir_to_lir = nullptr; 799 switch (cu->instruction_set) { 800 case kThumb2: 801 mir_to_lir = ArmCodeGenerator(cu, cu->mir_graph.get(), &cu->arena); 802 break; 803 case kArm64: 804 mir_to_lir = Arm64CodeGenerator(cu, cu->mir_graph.get(), &cu->arena); 805 break; 806 case kMips: 807 // Fall-through. 808 case kMips64: 809 mir_to_lir = MipsCodeGenerator(cu, cu->mir_graph.get(), &cu->arena); 810 break; 811 case kX86: 812 // Fall-through. 813 case kX86_64: 814 mir_to_lir = X86CodeGenerator(cu, cu->mir_graph.get(), &cu->arena); 815 break; 816 default: 817 LOG(FATAL) << "Unexpected instruction set: " << cu->instruction_set; 818 } 819 820 /* The number of compiler temporaries depends on backend so set it up now if possible */ 821 if (mir_to_lir) { 822 size_t max_temps = mir_to_lir->GetMaxPossibleCompilerTemps(); 823 bool set_max = cu->mir_graph->SetMaxAvailableNonSpecialCompilerTemps(max_temps); 824 CHECK(set_max); 825 } 826 return mir_to_lir; 827} 828 829QuickCompiler::QuickCompiler(CompilerDriver* driver) : Compiler(driver, 100) { 830 const auto& compiler_options = driver->GetCompilerOptions(); 831 auto* pass_manager_options = compiler_options.GetPassManagerOptions(); 832 pre_opt_pass_manager_.reset(new PassManager(*pass_manager_options)); 833 CHECK(pre_opt_pass_manager_.get() != nullptr); 834 PassDriverMEOpts::SetupPasses(pre_opt_pass_manager_.get()); 835 pre_opt_pass_manager_->CreateDefaultPassList(); 836 if (pass_manager_options->GetPrintPassOptions()) { 837 PassDriverMEOpts::PrintPassOptions(pre_opt_pass_manager_.get()); 838 } 839 // TODO: Different options for pre vs post opts? 840 post_opt_pass_manager_.reset(new PassManager(PassManagerOptions())); 841 CHECK(post_opt_pass_manager_.get() != nullptr); 842 PassDriverMEPostOpt::SetupPasses(post_opt_pass_manager_.get()); 843 post_opt_pass_manager_->CreateDefaultPassList(); 844 if (pass_manager_options->GetPrintPassOptions()) { 845 PassDriverMEPostOpt::PrintPassOptions(post_opt_pass_manager_.get()); 846 } 847} 848 849QuickCompiler::~QuickCompiler() { 850} 851 852Compiler* CreateQuickCompiler(CompilerDriver* driver) { 853 return QuickCompiler::Create(driver); 854} 855 856Compiler* QuickCompiler::Create(CompilerDriver* driver) { 857 return new QuickCompiler(driver); 858} 859 860} // namespace art 861