Home | History | Annotate | Download | only in quick
      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 "art_method-inl.h"
     22 #include "base/dumpable.h"
     23 #include "base/logging.h"
     24 #include "base/macros.h"
     25 #include "base/timing_logger.h"
     26 #include "compiler.h"
     27 #include "dex_file-inl.h"
     28 #include "dex_file_to_method_inliner_map.h"
     29 #include "dex/compiler_ir.h"
     30 #include "dex/dex_flags.h"
     31 #include "dex/mir_graph.h"
     32 #include "dex/pass_driver_me_opts.h"
     33 #include "dex/pass_driver_me_post_opt.h"
     34 #include "dex/pass_manager.h"
     35 #include "dex/quick/mir_to_lir.h"
     36 #include "dex/verified_method.h"
     37 #include "driver/compiler_driver.h"
     38 #include "driver/compiler_options.h"
     39 #include "elf_writer_quick.h"
     40 #include "jni/quick/jni_compiler.h"
     41 #include "mir_to_lir.h"
     42 #include "mirror/object.h"
     43 #include "runtime.h"
     44 
     45 // Specific compiler backends.
     46 #include "dex/quick/arm/backend_arm.h"
     47 #include "dex/quick/arm64/backend_arm64.h"
     48 #include "dex/quick/mips/backend_mips.h"
     49 #include "dex/quick/x86/backend_x86.h"
     50 
     51 namespace art {
     52 
     53 static_assert(0U == static_cast<size_t>(kNone),   "kNone not 0");
     54 static_assert(1U == static_cast<size_t>(kArm),    "kArm not 1");
     55 static_assert(2U == static_cast<size_t>(kArm64),  "kArm64 not 2");
     56 static_assert(3U == static_cast<size_t>(kThumb2), "kThumb2 not 3");
     57 static_assert(4U == static_cast<size_t>(kX86),    "kX86 not 4");
     58 static_assert(5U == static_cast<size_t>(kX86_64), "kX86_64 not 5");
     59 static_assert(6U == static_cast<size_t>(kMips),   "kMips not 6");
     60 static_assert(7U == static_cast<size_t>(kMips64), "kMips64 not 7");
     61 
     62 // Additional disabled optimizations (over generally disabled) per instruction set.
     63 static constexpr uint32_t kDisabledOptimizationsPerISA[] = {
     64     // 0 = kNone.
     65     ~0U,
     66     // 1 = kArm, unused (will use kThumb2).
     67     ~0U,
     68     // 2 = kArm64.
     69     0,
     70     // 3 = kThumb2.
     71     0,
     72     // 4 = kX86.
     73     (1 << kLoadStoreElimination) |
     74     0,
     75     // 5 = kX86_64.
     76     (1 << kLoadStoreElimination) |
     77     0,
     78     // 6 = kMips.
     79     (1 << kLoadStoreElimination) |
     80     (1 << kLoadHoisting) |
     81     (1 << kSuppressLoads) |
     82     (1 << kNullCheckElimination) |
     83     (1 << kPromoteRegs) |
     84     (1 << kTrackLiveTemps) |
     85     (1 << kSafeOptimizations) |
     86     (1 << kBBOpt) |
     87     (1 << kMatch) |
     88     (1 << kPromoteCompilerTemps) |
     89     0,
     90     // 7 = kMips64.
     91     (1 << kLoadStoreElimination) |
     92     (1 << kLoadHoisting) |
     93     (1 << kSuppressLoads) |
     94     (1 << kNullCheckElimination) |
     95     (1 << kPromoteRegs) |
     96     (1 << kTrackLiveTemps) |
     97     (1 << kSafeOptimizations) |
     98     (1 << kBBOpt) |
     99     (1 << kMatch) |
    100     (1 << kPromoteCompilerTemps) |
    101     0
    102 };
    103 static_assert(sizeof(kDisabledOptimizationsPerISA) == 8 * sizeof(uint32_t),
    104               "kDisabledOpts unexpected");
    105 
    106 // Supported shorty types per instruction set. null means that all are available.
    107 // Z : boolean
    108 // B : byte
    109 // S : short
    110 // C : char
    111 // I : int
    112 // J : long
    113 // F : float
    114 // D : double
    115 // L : reference(object, array)
    116 // V : void
    117 static const char* kSupportedTypes[] = {
    118     // 0 = kNone.
    119     "",
    120     // 1 = kArm, unused (will use kThumb2).
    121     "",
    122     // 2 = kArm64.
    123     nullptr,
    124     // 3 = kThumb2.
    125     nullptr,
    126     // 4 = kX86.
    127     nullptr,
    128     // 5 = kX86_64.
    129     nullptr,
    130     // 6 = kMips.
    131     nullptr,
    132     // 7 = kMips64.
    133     nullptr
    134 };
    135 static_assert(sizeof(kSupportedTypes) == 8 * sizeof(char*), "kSupportedTypes unexpected");
    136 
    137 static int kAllOpcodes[] = {
    138     Instruction::NOP,
    139     Instruction::MOVE,
    140     Instruction::MOVE_FROM16,
    141     Instruction::MOVE_16,
    142     Instruction::MOVE_WIDE,
    143     Instruction::MOVE_WIDE_FROM16,
    144     Instruction::MOVE_WIDE_16,
    145     Instruction::MOVE_OBJECT,
    146     Instruction::MOVE_OBJECT_FROM16,
    147     Instruction::MOVE_OBJECT_16,
    148     Instruction::MOVE_RESULT,
    149     Instruction::MOVE_RESULT_WIDE,
    150     Instruction::MOVE_RESULT_OBJECT,
    151     Instruction::MOVE_EXCEPTION,
    152     Instruction::RETURN_VOID,
    153     Instruction::RETURN,
    154     Instruction::RETURN_WIDE,
    155     Instruction::RETURN_OBJECT,
    156     Instruction::CONST_4,
    157     Instruction::CONST_16,
    158     Instruction::CONST,
    159     Instruction::CONST_HIGH16,
    160     Instruction::CONST_WIDE_16,
    161     Instruction::CONST_WIDE_32,
    162     Instruction::CONST_WIDE,
    163     Instruction::CONST_WIDE_HIGH16,
    164     Instruction::CONST_STRING,
    165     Instruction::CONST_STRING_JUMBO,
    166     Instruction::CONST_CLASS,
    167     Instruction::MONITOR_ENTER,
    168     Instruction::MONITOR_EXIT,
    169     Instruction::CHECK_CAST,
    170     Instruction::INSTANCE_OF,
    171     Instruction::ARRAY_LENGTH,
    172     Instruction::NEW_INSTANCE,
    173     Instruction::NEW_ARRAY,
    174     Instruction::FILLED_NEW_ARRAY,
    175     Instruction::FILLED_NEW_ARRAY_RANGE,
    176     Instruction::FILL_ARRAY_DATA,
    177     Instruction::THROW,
    178     Instruction::GOTO,
    179     Instruction::GOTO_16,
    180     Instruction::GOTO_32,
    181     Instruction::PACKED_SWITCH,
    182     Instruction::SPARSE_SWITCH,
    183     Instruction::CMPL_FLOAT,
    184     Instruction::CMPG_FLOAT,
    185     Instruction::CMPL_DOUBLE,
    186     Instruction::CMPG_DOUBLE,
    187     Instruction::CMP_LONG,
    188     Instruction::IF_EQ,
    189     Instruction::IF_NE,
    190     Instruction::IF_LT,
    191     Instruction::IF_GE,
    192     Instruction::IF_GT,
    193     Instruction::IF_LE,
    194     Instruction::IF_EQZ,
    195     Instruction::IF_NEZ,
    196     Instruction::IF_LTZ,
    197     Instruction::IF_GEZ,
    198     Instruction::IF_GTZ,
    199     Instruction::IF_LEZ,
    200     Instruction::UNUSED_3E,
    201     Instruction::UNUSED_3F,
    202     Instruction::UNUSED_40,
    203     Instruction::UNUSED_41,
    204     Instruction::UNUSED_42,
    205     Instruction::UNUSED_43,
    206     Instruction::AGET,
    207     Instruction::AGET_WIDE,
    208     Instruction::AGET_OBJECT,
    209     Instruction::AGET_BOOLEAN,
    210     Instruction::AGET_BYTE,
    211     Instruction::AGET_CHAR,
    212     Instruction::AGET_SHORT,
    213     Instruction::APUT,
    214     Instruction::APUT_WIDE,
    215     Instruction::APUT_OBJECT,
    216     Instruction::APUT_BOOLEAN,
    217     Instruction::APUT_BYTE,
    218     Instruction::APUT_CHAR,
    219     Instruction::APUT_SHORT,
    220     Instruction::IGET,
    221     Instruction::IGET_WIDE,
    222     Instruction::IGET_OBJECT,
    223     Instruction::IGET_BOOLEAN,
    224     Instruction::IGET_BYTE,
    225     Instruction::IGET_CHAR,
    226     Instruction::IGET_SHORT,
    227     Instruction::IPUT,
    228     Instruction::IPUT_WIDE,
    229     Instruction::IPUT_OBJECT,
    230     Instruction::IPUT_BOOLEAN,
    231     Instruction::IPUT_BYTE,
    232     Instruction::IPUT_CHAR,
    233     Instruction::IPUT_SHORT,
    234     Instruction::SGET,
    235     Instruction::SGET_WIDE,
    236     Instruction::SGET_OBJECT,
    237     Instruction::SGET_BOOLEAN,
    238     Instruction::SGET_BYTE,
    239     Instruction::SGET_CHAR,
    240     Instruction::SGET_SHORT,
    241     Instruction::SPUT,
    242     Instruction::SPUT_WIDE,
    243     Instruction::SPUT_OBJECT,
    244     Instruction::SPUT_BOOLEAN,
    245     Instruction::SPUT_BYTE,
    246     Instruction::SPUT_CHAR,
    247     Instruction::SPUT_SHORT,
    248     Instruction::INVOKE_VIRTUAL,
    249     Instruction::INVOKE_SUPER,
    250     Instruction::INVOKE_DIRECT,
    251     Instruction::INVOKE_STATIC,
    252     Instruction::INVOKE_INTERFACE,
    253     Instruction::RETURN_VOID_NO_BARRIER,
    254     Instruction::INVOKE_VIRTUAL_RANGE,
    255     Instruction::INVOKE_SUPER_RANGE,
    256     Instruction::INVOKE_DIRECT_RANGE,
    257     Instruction::INVOKE_STATIC_RANGE,
    258     Instruction::INVOKE_INTERFACE_RANGE,
    259     Instruction::UNUSED_79,
    260     Instruction::UNUSED_7A,
    261     Instruction::NEG_INT,
    262     Instruction::NOT_INT,
    263     Instruction::NEG_LONG,
    264     Instruction::NOT_LONG,
    265     Instruction::NEG_FLOAT,
    266     Instruction::NEG_DOUBLE,
    267     Instruction::INT_TO_LONG,
    268     Instruction::INT_TO_FLOAT,
    269     Instruction::INT_TO_DOUBLE,
    270     Instruction::LONG_TO_INT,
    271     Instruction::LONG_TO_FLOAT,
    272     Instruction::LONG_TO_DOUBLE,
    273     Instruction::FLOAT_TO_INT,
    274     Instruction::FLOAT_TO_LONG,
    275     Instruction::FLOAT_TO_DOUBLE,
    276     Instruction::DOUBLE_TO_INT,
    277     Instruction::DOUBLE_TO_LONG,
    278     Instruction::DOUBLE_TO_FLOAT,
    279     Instruction::INT_TO_BYTE,
    280     Instruction::INT_TO_CHAR,
    281     Instruction::INT_TO_SHORT,
    282     Instruction::ADD_INT,
    283     Instruction::SUB_INT,
    284     Instruction::MUL_INT,
    285     Instruction::DIV_INT,
    286     Instruction::REM_INT,
    287     Instruction::AND_INT,
    288     Instruction::OR_INT,
    289     Instruction::XOR_INT,
    290     Instruction::SHL_INT,
    291     Instruction::SHR_INT,
    292     Instruction::USHR_INT,
    293     Instruction::ADD_LONG,
    294     Instruction::SUB_LONG,
    295     Instruction::MUL_LONG,
    296     Instruction::DIV_LONG,
    297     Instruction::REM_LONG,
    298     Instruction::AND_LONG,
    299     Instruction::OR_LONG,
    300     Instruction::XOR_LONG,
    301     Instruction::SHL_LONG,
    302     Instruction::SHR_LONG,
    303     Instruction::USHR_LONG,
    304     Instruction::ADD_FLOAT,
    305     Instruction::SUB_FLOAT,
    306     Instruction::MUL_FLOAT,
    307     Instruction::DIV_FLOAT,
    308     Instruction::REM_FLOAT,
    309     Instruction::ADD_DOUBLE,
    310     Instruction::SUB_DOUBLE,
    311     Instruction::MUL_DOUBLE,
    312     Instruction::DIV_DOUBLE,
    313     Instruction::REM_DOUBLE,
    314     Instruction::ADD_INT_2ADDR,
    315     Instruction::SUB_INT_2ADDR,
    316     Instruction::MUL_INT_2ADDR,
    317     Instruction::DIV_INT_2ADDR,
    318     Instruction::REM_INT_2ADDR,
    319     Instruction::AND_INT_2ADDR,
    320     Instruction::OR_INT_2ADDR,
    321     Instruction::XOR_INT_2ADDR,
    322     Instruction::SHL_INT_2ADDR,
    323     Instruction::SHR_INT_2ADDR,
    324     Instruction::USHR_INT_2ADDR,
    325     Instruction::ADD_LONG_2ADDR,
    326     Instruction::SUB_LONG_2ADDR,
    327     Instruction::MUL_LONG_2ADDR,
    328     Instruction::DIV_LONG_2ADDR,
    329     Instruction::REM_LONG_2ADDR,
    330     Instruction::AND_LONG_2ADDR,
    331     Instruction::OR_LONG_2ADDR,
    332     Instruction::XOR_LONG_2ADDR,
    333     Instruction::SHL_LONG_2ADDR,
    334     Instruction::SHR_LONG_2ADDR,
    335     Instruction::USHR_LONG_2ADDR,
    336     Instruction::ADD_FLOAT_2ADDR,
    337     Instruction::SUB_FLOAT_2ADDR,
    338     Instruction::MUL_FLOAT_2ADDR,
    339     Instruction::DIV_FLOAT_2ADDR,
    340     Instruction::REM_FLOAT_2ADDR,
    341     Instruction::ADD_DOUBLE_2ADDR,
    342     Instruction::SUB_DOUBLE_2ADDR,
    343     Instruction::MUL_DOUBLE_2ADDR,
    344     Instruction::DIV_DOUBLE_2ADDR,
    345     Instruction::REM_DOUBLE_2ADDR,
    346     Instruction::ADD_INT_LIT16,
    347     Instruction::RSUB_INT,
    348     Instruction::MUL_INT_LIT16,
    349     Instruction::DIV_INT_LIT16,
    350     Instruction::REM_INT_LIT16,
    351     Instruction::AND_INT_LIT16,
    352     Instruction::OR_INT_LIT16,
    353     Instruction::XOR_INT_LIT16,
    354     Instruction::ADD_INT_LIT8,
    355     Instruction::RSUB_INT_LIT8,
    356     Instruction::MUL_INT_LIT8,
    357     Instruction::DIV_INT_LIT8,
    358     Instruction::REM_INT_LIT8,
    359     Instruction::AND_INT_LIT8,
    360     Instruction::OR_INT_LIT8,
    361     Instruction::XOR_INT_LIT8,
    362     Instruction::SHL_INT_LIT8,
    363     Instruction::SHR_INT_LIT8,
    364     Instruction::USHR_INT_LIT8,
    365     Instruction::IGET_QUICK,
    366     Instruction::IGET_WIDE_QUICK,
    367     Instruction::IGET_OBJECT_QUICK,
    368     Instruction::IPUT_QUICK,
    369     Instruction::IPUT_WIDE_QUICK,
    370     Instruction::IPUT_OBJECT_QUICK,
    371     Instruction::INVOKE_VIRTUAL_QUICK,
    372     Instruction::INVOKE_VIRTUAL_RANGE_QUICK,
    373     Instruction::IPUT_BOOLEAN_QUICK,
    374     Instruction::IPUT_BYTE_QUICK,
    375     Instruction::IPUT_CHAR_QUICK,
    376     Instruction::IPUT_SHORT_QUICK,
    377     Instruction::IGET_BOOLEAN_QUICK,
    378     Instruction::IGET_BYTE_QUICK,
    379     Instruction::IGET_CHAR_QUICK,
    380     Instruction::IGET_SHORT_QUICK,
    381     Instruction::UNUSED_F3,
    382     Instruction::UNUSED_F4,
    383     Instruction::UNUSED_F5,
    384     Instruction::UNUSED_F6,
    385     Instruction::UNUSED_F7,
    386     Instruction::UNUSED_F8,
    387     Instruction::UNUSED_F9,
    388     Instruction::UNUSED_FA,
    389     Instruction::UNUSED_FB,
    390     Instruction::UNUSED_FC,
    391     Instruction::UNUSED_FD,
    392     Instruction::UNUSED_FE,
    393     Instruction::UNUSED_FF,
    394     // ----- ExtendedMIROpcode -----
    395     kMirOpPhi,
    396     kMirOpCopy,
    397     kMirOpFusedCmplFloat,
    398     kMirOpFusedCmpgFloat,
    399     kMirOpFusedCmplDouble,
    400     kMirOpFusedCmpgDouble,
    401     kMirOpFusedCmpLong,
    402     kMirOpNop,
    403     kMirOpNullCheck,
    404     kMirOpRangeCheck,
    405     kMirOpDivZeroCheck,
    406     kMirOpCheck,
    407     kMirOpSelect,
    408 };
    409 
    410 static 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. null can be used when everything is supported. Size of the lists is
    426 // recorded below.
    427 static 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 };
    445 static_assert(sizeof(kUnsupportedOpcodes) == 8 * sizeof(int*), "kUnsupportedOpcodes unexpected");
    446 
    447 // Size of the arrays stored above.
    448 static 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 };
    466 static_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.
    471 static constexpr size_t kMaxAllowedDalvikRegisters = INT16_MAX / 2;
    472 
    473 static 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.
    492 bool 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 == nullptr) 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 
    552 void 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 
    562 void QuickCompiler::Init() {
    563   CHECK(GetCompilerDriver()->GetCompilerContext() == nullptr);
    564 }
    565 
    566 void QuickCompiler::UnInit() const {
    567   CHECK(GetCompilerDriver()->GetCompilerContext() == nullptr);
    568 }
    569 
    570 /* Default optimizer/debug setting for the compiler. */
    571 static 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 
    591 static 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 
    612 CompiledMethod* 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   if (driver->GetVerifiedMethod(&dex_file, method_idx)->HasRuntimeThrow()) {
    629     return nullptr;
    630   }
    631 
    632   DCHECK(driver->GetCompilerOptions().IsCompilationEnabled());
    633 
    634   Runtime* const runtime = Runtime::Current();
    635   ClassLinker* const class_linker = runtime->GetClassLinker();
    636   InstructionSet instruction_set = driver->GetInstructionSet();
    637   if (instruction_set == kArm) {
    638     instruction_set = kThumb2;
    639   }
    640   CompilationUnit cu(runtime->GetArenaPool(), instruction_set, driver, class_linker);
    641   cu.dex_file = &dex_file;
    642   cu.class_def_idx = class_def_idx;
    643   cu.method_idx = method_idx;
    644   cu.access_flags = access_flags;
    645   cu.invoke_type = invoke_type;
    646   cu.shorty = dex_file.GetMethodShorty(dex_file.GetMethodId(method_idx));
    647 
    648   CHECK((cu.instruction_set == kThumb2) ||
    649         (cu.instruction_set == kArm64) ||
    650         (cu.instruction_set == kX86) ||
    651         (cu.instruction_set == kX86_64) ||
    652         (cu.instruction_set == kMips) ||
    653         (cu.instruction_set == kMips64));
    654 
    655   // TODO: set this from command line
    656   constexpr bool compiler_flip_match = false;
    657   const std::string compiler_method_match = "";
    658 
    659   bool use_match = !compiler_method_match.empty();
    660   bool match = use_match && (compiler_flip_match ^
    661       (PrettyMethod(method_idx, dex_file).find(compiler_method_match) != std::string::npos));
    662   if (!use_match || match) {
    663     cu.disable_opt = kCompilerOptimizerDisableFlags;
    664     cu.enable_debug = kCompilerDebugFlags;
    665     cu.verbose = VLOG_IS_ON(compiler) ||
    666         (cu.enable_debug & (1 << kDebugVerbose));
    667   }
    668 
    669   if (driver->GetCompilerOptions().HasVerboseMethods()) {
    670     cu.verbose = driver->GetCompilerOptions().IsVerboseMethod(PrettyMethod(method_idx, dex_file));
    671   }
    672 
    673   if (cu.verbose) {
    674     cu.enable_debug |= (1 << kDebugCodegenDump);
    675   }
    676 
    677   /*
    678    * TODO: rework handling of optimization and debug flags.  Should we split out
    679    * MIR and backend flags?  Need command-line setting as well.
    680    */
    681 
    682   InitCompilationUnit(cu);
    683 
    684   cu.StartTimingSplit("BuildMIRGraph");
    685   cu.mir_graph.reset(new MIRGraph(&cu, &cu.arena));
    686 
    687   /*
    688    * After creation of the MIR graph, also create the code generator.
    689    * The reason we do this is that optimizations on the MIR graph may need to get information
    690    * that is only available if a CG exists.
    691    */
    692   cu.cg.reset(GetCodeGenerator(&cu, nullptr));
    693 
    694   /* Gathering opcode stats? */
    695   if (kCompilerDebugFlags & (1 << kDebugCountOpcodes)) {
    696     cu.mir_graph->EnableOpcodeCounting();
    697   }
    698 
    699   /* Build the raw MIR graph */
    700   cu.mir_graph->InlineMethod(code_item, access_flags, invoke_type, class_def_idx, method_idx,
    701                              class_loader, dex_file);
    702 
    703   if (!CanCompileMethod(method_idx, dex_file, &cu)) {
    704     VLOG(compiler)  << cu.instruction_set << ": Cannot compile method : "
    705         << PrettyMethod(method_idx, dex_file);
    706     cu.EndTiming();
    707     return nullptr;
    708   }
    709 
    710   cu.NewTimingSplit("MIROpt:CheckFilters");
    711   std::string skip_message;
    712   if (cu.mir_graph->SkipCompilation(&skip_message)) {
    713     VLOG(compiler) << cu.instruction_set << ": Skipping method : "
    714         << PrettyMethod(method_idx, dex_file) << "  Reason = " << skip_message;
    715     cu.EndTiming();
    716     return nullptr;
    717   }
    718 
    719   /* Create the pass driver and launch it */
    720   PassDriverMEOpts pass_driver(GetPreOptPassManager(), GetPostOptPassManager(), &cu);
    721   pass_driver.Launch();
    722 
    723   /* For non-leaf methods check if we should skip compilation when the profiler is enabled. */
    724   if (cu.compiler_driver->ProfilePresent()
    725       && !cu.mir_graph->MethodIsLeaf()
    726       && cu.mir_graph->SkipCompilationByName(PrettyMethod(method_idx, dex_file))) {
    727     cu.EndTiming();
    728     return nullptr;
    729   }
    730 
    731   if (cu.enable_debug & (1 << kDebugDumpCheckStats)) {
    732     cu.mir_graph->DumpCheckStats();
    733   }
    734 
    735   if (kCompilerDebugFlags & (1 << kDebugCountOpcodes)) {
    736     cu.mir_graph->ShowOpcodeStats();
    737   }
    738 
    739   /* Reassociate sreg names with original Dalvik vreg names. */
    740   cu.mir_graph->RemapRegLocations();
    741 
    742   /* Free Arenas from the cu.arena_stack for reuse by the cu.arena in the codegen. */
    743   if (cu.enable_debug & (1 << kDebugShowMemoryUsage)) {
    744     if (cu.arena_stack.PeakBytesAllocated() > 1 * 1024 * 1024) {
    745       MemStats stack_stats(cu.arena_stack.GetPeakStats());
    746       LOG(INFO) << PrettyMethod(method_idx, dex_file) << " " << Dumpable<MemStats>(stack_stats);
    747     }
    748   }
    749   cu.arena_stack.Reset();
    750 
    751   CompiledMethod* result = nullptr;
    752 
    753   if (cu.mir_graph->PuntToInterpreter()) {
    754     VLOG(compiler) << cu.instruction_set << ": Punted method to interpreter: "
    755         << PrettyMethod(method_idx, dex_file);
    756     cu.EndTiming();
    757     return nullptr;
    758   }
    759 
    760   cu.cg->Materialize();
    761 
    762   cu.NewTimingSplit("Dedupe");  /* deduping takes up the vast majority of time in GetCompiledMethod(). */
    763   result = cu.cg->GetCompiledMethod();
    764   cu.NewTimingSplit("Cleanup");
    765 
    766   if (result) {
    767     VLOG(compiler) << cu.instruction_set << ": Compiled " << PrettyMethod(method_idx, dex_file);
    768   } else {
    769     VLOG(compiler) << cu.instruction_set << ": Deferred " << PrettyMethod(method_idx, dex_file);
    770   }
    771 
    772   if (cu.enable_debug & (1 << kDebugShowMemoryUsage)) {
    773     if (cu.arena.BytesAllocated() > (1 * 1024 *1024)) {
    774       MemStats mem_stats(cu.arena.GetMemStats());
    775       LOG(INFO) << PrettyMethod(method_idx, dex_file) << " " << Dumpable<MemStats>(mem_stats);
    776     }
    777   }
    778 
    779   if (cu.enable_debug & (1 << kDebugShowSummaryMemoryUsage)) {
    780     LOG(INFO) << "MEMINFO " << cu.arena.BytesAllocated() << " " << cu.mir_graph->GetNumBlocks()
    781                     << " " << PrettyMethod(method_idx, dex_file);
    782   }
    783 
    784   cu.EndTiming();
    785   driver->GetTimingsLogger()->AddLogger(cu.timings);
    786   return result;
    787 }
    788 
    789 CompiledMethod* QuickCompiler::JniCompile(uint32_t access_flags,
    790                                           uint32_t method_idx,
    791                                           const DexFile& dex_file) const {
    792   return ArtQuickJniCompileMethod(GetCompilerDriver(), access_flags, method_idx, dex_file);
    793 }
    794 
    795 uintptr_t QuickCompiler::GetEntryPointOf(ArtMethod* method) const {
    796   return reinterpret_cast<uintptr_t>(method->GetEntryPointFromQuickCompiledCodePtrSize(
    797       InstructionSetPointerSize(GetCompilerDriver()->GetInstructionSet())));
    798 }
    799 
    800 Mir2Lir* QuickCompiler::GetCodeGenerator(CompilationUnit* cu, void* compilation_unit) {
    801   UNUSED(compilation_unit);
    802   Mir2Lir* mir_to_lir = nullptr;
    803   switch (cu->instruction_set) {
    804     case kThumb2:
    805       mir_to_lir = ArmCodeGenerator(cu, cu->mir_graph.get(), &cu->arena);
    806       break;
    807     case kArm64:
    808       mir_to_lir = Arm64CodeGenerator(cu, cu->mir_graph.get(), &cu->arena);
    809       break;
    810     case kMips:
    811       // Fall-through.
    812     case kMips64:
    813       mir_to_lir = MipsCodeGenerator(cu, cu->mir_graph.get(), &cu->arena);
    814       break;
    815     case kX86:
    816       // Fall-through.
    817     case kX86_64:
    818       mir_to_lir = X86CodeGenerator(cu, cu->mir_graph.get(), &cu->arena);
    819       break;
    820     default:
    821       LOG(FATAL) << "Unexpected instruction set: " << cu->instruction_set;
    822   }
    823 
    824   /* The number of compiler temporaries depends on backend so set it up now if possible */
    825   if (mir_to_lir) {
    826     size_t max_temps = mir_to_lir->GetMaxPossibleCompilerTemps();
    827     bool set_max = cu->mir_graph->SetMaxAvailableNonSpecialCompilerTemps(max_temps);
    828     CHECK(set_max);
    829   }
    830   return mir_to_lir;
    831 }
    832 
    833 QuickCompiler::QuickCompiler(CompilerDriver* driver) : Compiler(driver, 100) {
    834   const auto& compiler_options = driver->GetCompilerOptions();
    835   auto* pass_manager_options = compiler_options.GetPassManagerOptions();
    836   pre_opt_pass_manager_.reset(new PassManager(*pass_manager_options));
    837   CHECK(pre_opt_pass_manager_.get() != nullptr);
    838   PassDriverMEOpts::SetupPasses(pre_opt_pass_manager_.get());
    839   pre_opt_pass_manager_->CreateDefaultPassList();
    840   if (pass_manager_options->GetPrintPassOptions()) {
    841     PassDriverMEOpts::PrintPassOptions(pre_opt_pass_manager_.get());
    842   }
    843   // TODO: Different options for pre vs post opts?
    844   post_opt_pass_manager_.reset(new PassManager(PassManagerOptions()));
    845   CHECK(post_opt_pass_manager_.get() != nullptr);
    846   PassDriverMEPostOpt::SetupPasses(post_opt_pass_manager_.get());
    847   post_opt_pass_manager_->CreateDefaultPassList();
    848   if (pass_manager_options->GetPrintPassOptions()) {
    849     PassDriverMEPostOpt::PrintPassOptions(post_opt_pass_manager_.get());
    850   }
    851 }
    852 
    853 QuickCompiler::~QuickCompiler() {
    854 }
    855 
    856 Compiler* CreateQuickCompiler(CompilerDriver* driver) {
    857   return QuickCompiler::Create(driver);
    858 }
    859 
    860 Compiler* QuickCompiler::Create(CompilerDriver* driver) {
    861   return new QuickCompiler(driver);
    862 }
    863 
    864 }  // namespace art
    865