compiler_ir.h revision fa57c47f1b72916371a9c2d5c1389219bce655b4
167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee/* 267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * Copyright (C) 2011 The Android Open Source Project 367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * 467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * Licensed under the Apache License, Version 2.0 (the "License"); 567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * you may not use this file except in compliance with the License. 667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * You may obtain a copy of the License at 767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * 867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * http://www.apache.org/licenses/LICENSE-2.0 967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * 1067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * Unless required by applicable law or agreed to in writing, software 1167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * distributed under the License is distributed on an "AS IS" BASIS, 1267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * See the License for the specific language governing permissions and 1467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * limitations under the License. 1567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee */ 1667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee 1767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee#ifndef ART_SRC_COMPILER_COMPILER_IR_H_ 1867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee#define ART_SRC_COMPILER_COMPILER_IR_H_ 1967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee 20a0e180632411f7fe0edf454e571c42209ee7b540Elliott Hughes#include <vector> 21eaf09bc65f9a10d12befcdb239156938c9bceef2buzbee#include "dex_instruction.h" 22eaf09bc65f9a10d12befcdb239156938c9bceef2buzbee#include "compiler.h" 23efc6369224b036a1fb77849f7ae65b3492c832c0buzbee#include "compiler_utility.h" 2431a4a6f5717f645da6b97ccc1e420ae1e1c71ce0buzbee#include "oat_compilation_unit.h" 25a0e180632411f7fe0edf454e571c42209ee7b540Elliott Hughes#include "safe_map.h" 262cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee#include "greenland/ir_builder.h" 272cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee#include "llvm/Module.h" 28cbd6d44c0a94f3d26671b5325aa21bbf1335ffe8buzbee#include "compiler_enums.h" 2967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee 3011d1b0c31ddd710d26068da8e0e4621002205b4bElliott Hughesnamespace art { 3111d1b0c31ddd710d26068da8e0e4621002205b4bElliott Hughes 32fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee#define SLOW_FIELD_PATH (cu->enable_debug & (1 << kDebugSlowFieldPath)) 33fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee#define SLOW_INVOKE_PATH (cu->enable_debug & (1 << kDebugSlowInvokePath)) 34fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee#define SLOW_STRING_PATH (cu->enable_debug & (1 << kDebugSlowStringPath)) 35fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee#define SLOW_TYPE_PATH (cu->enable_debug & (1 << kDebugSlowTypePath)) 36fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee#define EXERCISE_SLOWEST_STRING_PATH (cu->enable_debug & \ 37a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee (1 << kDebugSlowestStringPath)) 3831a4a6f5717f645da6b97ccc1e420ae1e1c71ce0buzbee 39fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee// Minimum field size to contain Dalvik v_reg number 40ca7a5e484ac02927247cc77ad40f291bf6613ed5buzbee#define VREG_NUM_WIDTH 16 41ca7a5e484ac02927247cc77ad40f291bf6613ed5buzbee 42eaf09bc65f9a10d12befcdb239156938c9bceef2buzbeestruct ArenaBitVector; 43eaf09bc65f9a10d12befcdb239156938c9bceef2buzbeestruct LIR; 44eaf09bc65f9a10d12befcdb239156938c9bceef2buzbeeclass LLVMInfo; 45eaf09bc65f9a10d12befcdb239156938c9bceef2buzbee 46719ace4734f519c67fd2c1ff7a232c079309a615Elliott Hughesstruct PromotionMap { 47fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee RegLocationType core_location:3; 48fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee uint8_t core_reg; 49fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee RegLocationType fp_location:3; 5052a77fc135f0e0df57ee24641c3f5ae415ff7bd6buzbee uint8_t FpReg; 51fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee bool first_in_pair; 52719ace4734f519c67fd2c1ff7a232c079309a615Elliott Hughes}; 5367bc236a207852d652f6ddeab0a90efc1bd111bbbuzbee 54719ace4734f519c67fd2c1ff7a232c079309a615Elliott Hughesstruct RegLocation { 55a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee RegLocationType location:3; 56a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee unsigned wide:1; 57a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee unsigned defined:1; // Do we know the type? 58fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee unsigned is_const:1; // Constant, value in cu->constant_values[] 59a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee unsigned fp:1; // Floating point? 60a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee unsigned core:1; // Non-floating point? 61bff2465abb4b0c097623c82f18a1307ea890bff1buzbee unsigned ref:1; // Something GC cares about 62fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee unsigned high_word:1; // High word of pair? 63a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee unsigned home:1; // Does this represent the home location? 64fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee uint8_t low_reg; // First physical register 65fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee uint8_t high_reg; // 2nd physical register (if wide) 66fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee int32_t s_reg_low; // SSA name for low Dalvik word 67fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee int32_t orig_sreg; // TODO: remove after Bitcode gen complete 68fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee // and consolodate usage w/ s_reg_low 69e196567b50a084b163937ea9605b51ee1e48adebbuzbee}; 70e196567b50a084b163937ea9605b51ee1e48adebbuzbee 71e196567b50a084b163937ea9605b51ee1e48adebbuzbeestruct CompilerTemp { 72fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee int s_reg; 73a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee ArenaBitVector* bv; 74719ace4734f519c67fd2c1ff7a232c079309a615Elliott Hughes}; 7567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee 763b3dbddcbc7a7bee505a608061304f9b26a91750buzbeestruct CallInfo { 77fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee int num_arg_words; // Note: word count, not arg count 7815bf9804820b73765899e4b3e0d8a1fa15e0dbd3buzbee RegLocation* args; // One for each word of arguments 7915bf9804820b73765899e4b3e0d8a1fa15e0dbd3buzbee RegLocation result; // Eventual target of MOVE_RESULT 80fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee int opt_flags; 8115bf9804820b73765899e4b3e0d8a1fa15e0dbd3buzbee InvokeType type; 82fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee uint32_t dex_idx; 833b3dbddcbc7a7bee505a608061304f9b26a91750buzbee uint32_t index; // Method idx for invokes, type idx for FilledNewArray 84fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee uintptr_t direct_code; 85fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee uintptr_t direct_method; 8615bf9804820b73765899e4b3e0d8a1fa15e0dbd3buzbee RegLocation target; // Target of following move_result 87fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee bool skip_this; 88fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee bool is_range; 8915bf9804820b73765899e4b3e0d8a1fa15e0dbd3buzbee int offset; // Dalvik offset 9015bf9804820b73765899e4b3e0d8a1fa15e0dbd3buzbee}; 9115bf9804820b73765899e4b3e0d8a1fa15e0dbd3buzbee 92e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee /* 93e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * Data structure tracking the mapping between a Dalvik register (pair) and a 94e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * native register (pair). The idea is to reuse the previously loaded value 95e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * if possible, otherwise to keep the value in a native register as long as 96e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * possible. 97e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee */ 98719ace4734f519c67fd2c1ff7a232c079309a615Elliott Hughesstruct RegisterInfo { 99a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee int reg; // Reg number 100fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee bool in_use; // Has it been allocated? 101fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee bool is_temp; // Can allocate as temp? 102a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee bool pair; // Part of a register pair? 103a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee int partner; // If pair, other reg of pair 104a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee bool live; // Is there an associated SSA name? 105a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee bool dirty; // If live, is it dirty? 106fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee int s_reg; // Name of live value 107fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee LIR *def_start; // Starting inst in last def sequence 108fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee LIR *def_end; // Ending inst in last def sequence 109719ace4734f519c67fd2c1ff7a232c079309a615Elliott Hughes}; 110e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee 111719ace4734f519c67fd2c1ff7a232c079309a615Elliott Hughesstruct RegisterPool { 112fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee int num_core_regs; 113fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee RegisterInfo *core_regs; 114fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee int next_core_reg; 115fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee int num_fp_regs; 116a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee RegisterInfo *FPRegs; 117fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee int next_fp_reg; 118719ace4734f519c67fd2c1ff7a232c079309a615Elliott Hughes}; 119e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee 12067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee#define INVALID_SREG (-1) 1213ddc0d1108a00e14b60c60edcdeff3b81f9e35f9buzbee#define INVALID_VREG (0xFFFFU) 12267bc236a207852d652f6ddeab0a90efc1bd111bbbuzbee#define INVALID_REG (0xFF) 123b046e16d8b8da318d6055f9308950131f1255e08buzbee#define INVALID_OFFSET (0xDEADF00FU) 12467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee 125e196567b50a084b163937ea9605b51ee1e48adebbuzbee/* SSA encodings for special registers */ 1269c044ce5f76e9bfa17c4c1979e9f8c99ae100695buzbee#define SSA_METHOD_BASEREG (-2) 127e196567b50a084b163937ea9605b51ee1e48adebbuzbee/* First compiler temp basereg, grows smaller */ 1289c044ce5f76e9bfa17c4c1979e9f8c99ae100695buzbee#define SSA_CTEMP_BASEREG (SSA_METHOD_BASEREG - 1) 129e196567b50a084b163937ea9605b51ee1e48adebbuzbee 13099ba9640caf4c995b81295bd724dafa338a53c5bbuzbee/* 13199ba9640caf4c995b81295bd724dafa338a53c5bbuzbee * Some code patterns cause the generation of excessively large 13299ba9640caf4c995b81295bd724dafa338a53c5bbuzbee * methods - in particular initialization sequences. There isn't much 13399ba9640caf4c995b81295bd724dafa338a53c5bbuzbee * benefit in optimizing these methods, and the cost can be very high. 13499ba9640caf4c995b81295bd724dafa338a53c5bbuzbee * We attempt to identify these cases, and avoid performing most dataflow 13599ba9640caf4c995b81295bd724dafa338a53c5bbuzbee * analysis. Two thresholds are used - one for known initializers and one 1365abfa3ea35781464df8fae60aaf03f48a295e965buzbee * for everything else. 13799ba9640caf4c995b81295bd724dafa338a53c5bbuzbee */ 1385abfa3ea35781464df8fae60aaf03f48a295e965buzbee#define MANY_BLOCKS_INITIALIZER 1000 /* Threshold for switching dataflow off */ 1395abfa3ea35781464df8fae60aaf03f48a295e965buzbee#define MANY_BLOCKS 4000 /* Non-initializer threshold */ 14099ba9640caf4c995b81295bd724dafa338a53c5bbuzbee 14131a4a6f5717f645da6b97ccc1e420ae1e1c71ce0buzbee/* Utility macros to traverse the LIR list */ 14231a4a6f5717f645da6b97ccc1e420ae1e1c71ce0buzbee#define NEXT_LIR(lir) (lir->next) 14331a4a6f5717f645da6b97ccc1e420ae1e1c71ce0buzbee#define PREV_LIR(lir) (lir->prev) 14431a4a6f5717f645da6b97ccc1e420ae1e1c71ce0buzbee 145fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee/* Defines for alias_info (tracks Dalvik register references) */ 146ec13743da80a80c1817cf6660c28917fc28846bcbuzbee#define DECODE_ALIAS_INFO_REG(X) (X & 0xffff) 147ec13743da80a80c1817cf6660c28917fc28846bcbuzbee#define DECODE_ALIAS_INFO_WIDE_FLAG (0x80000000) 148ec13743da80a80c1817cf6660c28917fc28846bcbuzbee#define DECODE_ALIAS_INFO_WIDE(X) ((X & DECODE_ALIAS_INFO_WIDE_FLAG) ? 1 : 0) 149ec13743da80a80c1817cf6660c28917fc28846bcbuzbee#define ENCODE_ALIAS_INFO(REG, ISWIDE) (REG | (ISWIDE ? DECODE_ALIAS_INFO_WIDE_FLAG : 0)) 150ec13743da80a80c1817cf6660c28917fc28846bcbuzbee 151ec13743da80a80c1817cf6660c28917fc28846bcbuzbee/* Common resource macros */ 152ec13743da80a80c1817cf6660c28917fc28846bcbuzbee#define ENCODE_CCODE (1ULL << kCCode) 153ec13743da80a80c1817cf6660c28917fc28846bcbuzbee#define ENCODE_FP_STATUS (1ULL << kFPStatus) 154ec13743da80a80c1817cf6660c28917fc28846bcbuzbee 155ec13743da80a80c1817cf6660c28917fc28846bcbuzbee/* Abstract memory locations */ 156ec13743da80a80c1817cf6660c28917fc28846bcbuzbee#define ENCODE_DALVIK_REG (1ULL << kDalvikReg) 157ec13743da80a80c1817cf6660c28917fc28846bcbuzbee#define ENCODE_LITERAL (1ULL << kLiteral) 158ec13743da80a80c1817cf6660c28917fc28846bcbuzbee#define ENCODE_HEAP_REF (1ULL << kHeapRef) 159ec13743da80a80c1817cf6660c28917fc28846bcbuzbee#define ENCODE_MUST_NOT_ALIAS (1ULL << kMustNotAlias) 160ec13743da80a80c1817cf6660c28917fc28846bcbuzbee 161ec13743da80a80c1817cf6660c28917fc28846bcbuzbee#define ENCODE_ALL (~0ULL) 162ec13743da80a80c1817cf6660c28917fc28846bcbuzbee#define ENCODE_MEM (ENCODE_DALVIK_REG | ENCODE_LITERAL | \ 163ec13743da80a80c1817cf6660c28917fc28846bcbuzbee ENCODE_HEAP_REF | ENCODE_MUST_NOT_ALIAS) 164ec13743da80a80c1817cf6660c28917fc28846bcbuzbee 165fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee#define is_pseudo_opcode(opcode) (static_cast<int>(opcode) < 0) 1661bc37c60da71c923ea9a2e99d31ba1b3d76d79a8buzbee 167719ace4734f519c67fd2c1ff7a232c079309a615Elliott Hughesstruct LIR { 168a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee int offset; // Offset of this instruction 169fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee int dalvik_offset; // Offset of Dalvik opcode 170a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee LIR* next; 171a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee LIR* prev; 172a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee LIR* target; 173a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee int opcode; 174a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee int operands[5]; // [0..4] = [dest, src1, src2, extra, extra2] 175a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee struct { 176fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee bool is_nop:1; // LIR is optimized away 177a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee bool pcRelFixup:1; // May need pc-relative fixup 178a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee unsigned int size:5; // in bytes 179f5f5a12a74c6cc465d2757b4d77843fb1cbdac8fbuzbee unsigned int unused:25; 180a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee } flags; 181fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee int alias_info; // For Dalvik register & litpool disambiguation 182fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee uint64_t use_mask; // Resource mask for use 183fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee uint64_t def_mask; // Resource mask for def 184719ace4734f519c67fd2c1ff7a232c079309a615Elliott Hughes}; 18567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee 186fa57c47f1b72916371a9c2d5c1389219bce655b4buzbeeextern const char* extended_mir_op_names[kMirOpLast - kMirOpFirst]; 18767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee 18867bf885d62b1473c833bece1c9e0bb624e6ba391buzbeestruct SSARepresentation; 18967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee 19067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee#define MIR_IGNORE_NULL_CHECK (1 << kMIRIgnoreNullCheck) 19167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee#define MIR_NULL_CHECK_ONLY (1 << kMIRNullCheckOnly) 19267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee#define MIR_IGNORE_RANGE_CHECK (1 << kMIRIgnoreRangeCheck) 19367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee#define MIR_RANGE_CHECK_ONLY (1 << kMIRRangeCheckOnly) 19467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee#define MIR_INLINED (1 << kMIRInlined) 19567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee#define MIR_INLINED_PRED (1 << kMIRInlinedPred) 19667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee#define MIR_CALLEE (1 << kMIRCallee) 197c1f45048b90a85018c6b063c31bc088dc3dd993dbuzbee#define MIR_IGNORE_SUSPEND_CHECK (1 << kMIRIgnoreSuspendCheck) 198e196567b50a084b163937ea9605b51ee1e48adebbuzbee#define MIR_DUP (1 << kMIRDup) 199239c4e72b5a69754e1d6879be5ba1f85150655c1buzbee#define MIR_MARK (1 << kMIRMark) 20067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee 201d1643e41ef242ae656f667bf3c8b0324635cefd3buzbeestruct Checkstats { 202fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee int null_checks; 203fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee int null_checks_eliminated; 204fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee int range_checks; 205fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee int range_checks_eliminated; 206d1643e41ef242ae656f667bf3c8b0324635cefd3buzbee}; 207d1643e41ef242ae656f667bf3c8b0324635cefd3buzbee 208719ace4734f519c67fd2c1ff7a232c079309a615Elliott Hughesstruct MIR { 209a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee DecodedInstruction dalvikInsn; 210a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee unsigned int width; 211a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee unsigned int offset; 212a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee MIR* prev; 213a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee MIR* next; 214fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee SSARepresentation* ssa_rep; 215fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee int optimization_flags; 216a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee union { 217a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee // Used to quickly locate all Phi opcodes 218fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee MIR* phi_next; 219c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee // Establish link between two halves of throwing instructions 220fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee MIR* throw_insn; 221a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee } meta; 222719ace4734f519c67fd2c1ff7a232c079309a615Elliott Hughes}; 22367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee 22467bf885d62b1473c833bece1c9e0bb624e6ba391buzbeestruct BasicBlockDataFlow; 22567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee 226719ace4734f519c67fd2c1ff7a232c079309a615Elliott Hughesstruct BasicBlock { 227a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee int id; 228fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee int dfs_id; 229a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee bool visited; 230a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee bool hidden; 231fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee bool catch_entry; 232fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee bool explicit_throw; 233fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee bool conditional_branch; 234fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee bool has_return; 235fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee uint16_t start_offset; 236fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee uint16_t nesting_depth; 237fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee BBType block_type; 238fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee MIR* first_mir_insn; 239fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee MIR* last_mir_insn; 240fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee BasicBlock* fall_through; 241a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee BasicBlock* taken; 242fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee BasicBlock* i_dom; // Immediate dominator 243fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee BasicBlockDataFlow* data_flow_info; 244a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee GrowableList* predecessors; 245a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee ArenaBitVector* dominators; 246fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee ArenaBitVector* i_dominated; // Set nodes being immediately dominated 247fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee ArenaBitVector* dom_frontier; // Dominance frontier 248a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee struct { // For one-to-many successors like 249fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee BlockListType block_list_type; // switch and exception handling 250a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee GrowableList blocks; 251fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee } successor_block_list; 252719ace4734f519c67fd2c1ff7a232c079309a615Elliott Hughes}; 25367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee 25467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee/* 255fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee * The "blocks" field in "successor_block_list" points to an array of 25667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * elements with the type "SuccessorBlockInfo". 25767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * For catch blocks, key is type index for the exception. 25867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * For swtich blocks, key is the case value. 25967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee */ 260719ace4734f519c67fd2c1ff7a232c079309a615Elliott Hughesstruct SuccessorBlockInfo { 261a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee BasicBlock* block; 262a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee int key; 263719ace4734f519c67fd2c1ff7a232c079309a615Elliott Hughes}; 26467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee 26567bf885d62b1473c833bece1c9e0bb624e6ba391buzbeestruct LoopAnalysis; 26667bf885d62b1473c833bece1c9e0bb624e6ba391buzbeestruct RegisterPool; 267ba938cbb8d73a0dcf151dfaec4662496da6afdbfbuzbeestruct ArenaMemBlock; 268ba938cbb8d73a0dcf151dfaec4662496da6afdbfbuzbeestruct Memstats; 26967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee 2705b53710b4abcf8f35c91a963a475b72cb34757e6buzbee#define NOTVISITED (-1) 2715b53710b4abcf8f35c91a963a475b72cb34757e6buzbee 272719ace4734f519c67fd2c1ff7a232c079309a615Elliott Hughesstruct CompilationUnit { 273e52e49b32f5cf862a414da63e5dbd2eb04ad758eElliott Hughes CompilationUnit() 274fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee : num_blocks(0), 275a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee compiler(NULL), 276a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee class_linker(NULL), 277a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee dex_file(NULL), 278a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee class_loader(NULL), 279a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee method_idx(0), 280a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee code_item(NULL), 281a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee access_flags(0), 28208f753d5859936f8d3524e9e4faa6cee353873eaIan Rogers invoke_type(kDirect), 283a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee shorty(NULL), 284fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee first_lir_insn(NULL), 285fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee last_lir_insn(NULL), 286fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee literal_list(NULL), 287fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee method_literal_list(NULL), 288fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee code_literal_list(NULL), 289fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee disable_opt(0), 290fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee enable_debug(0), 291fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee data_offset(0), 292fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee total_size(0), 293fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee assembler_status(kSuccess), 294fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee assembler_retries(0), 295fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee verbose(false), 296fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee has_loop(false), 297fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee has_invoke(false), 298fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee qd_mode(false), 299fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee reg_pool(NULL), 300fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee instruction_set(kNone), 301fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee num_ssa_regs(0), 302fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee ssa_base_vregs(NULL), 303fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee ssa_subscripts(NULL), 304fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee ssa_strings(NULL), 305fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee vreg_to_ssa_map(NULL), 306fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee ssa_last_defs(NULL), 307fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee is_constant_v(NULL), 308fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee constant_values(NULL), 309fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee phi_alias_map(NULL), 310fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee phi_list(NULL), 311fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee reg_location(NULL), 312fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee promotion_map(NULL), 313fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee method_sreg(0), 314fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee num_reachable_blocks(0), 315fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee num_dalvik_registers(0), 316fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee entry_block(NULL), 317fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee exit_block(NULL), 318fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee cur_block(NULL), 319fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee i_dom_list(NULL), 320fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee try_block_addr(NULL), 321fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee def_block_matrix(NULL), 322fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee temp_block_v(NULL), 323fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee temp_dalvik_register_v(NULL), 324fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee temp_ssa_register_v(NULL), 325fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee temp_ssa_block_id_v(NULL), 326fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee block_label_list(NULL), 327fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee num_ins(0), 328fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee num_outs(0), 329fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee num_regs(0), 330fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee num_core_spills(0), 331fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee num_fp_spills(0), 332fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee num_compiler_temps(0), 333fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee frame_size(0), 334fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee core_spill_mask(0U), 335fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee fp_spill_mask(0U), 336a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee attrs(0U), 337fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee current_dalvik_offset(0), 338a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee insns(NULL), 339fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee insns_size(0U), 340fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee disable_dataflow(false), 341fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee def_count(0), 342fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee compiler_flip_match(false), 343fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee arena_head(NULL), 344fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee current_arena(NULL), 345fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee num_arena_blocks(0), 346a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee mstats(NULL), 347d1643e41ef242ae656f667bf3c8b0324635cefd3buzbee checkstats(NULL), 348fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee gen_bitcode(false), 3492cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee context(NULL), 3502cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee module(NULL), 3512cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee func(NULL), 3522cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee intrinsic_helper(NULL), 3532cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee irb(NULL), 354fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee placeholder_bb(NULL), 355fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee entry_bb(NULL), 356fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee entryTarget_bb(NULL), 357fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee temp_name(0), 358fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee num_shadow_frame_entries(0), 359fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee shadow_map(NULL), 3602cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee#ifndef NDEBUG 361fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee live_sreg(0), 362e52e49b32f5cf862a414da63e5dbd2eb04ad758eElliott Hughes#endif 363fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee opcode_count(NULL) {} 364a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 365fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee int num_blocks; 366fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee GrowableList block_list; 367a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee Compiler* compiler; // Compiler driving this compiler 368a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee ClassLinker* class_linker; // Linker to resolve fields and methods 369a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee const DexFile* dex_file; // DexFile containing the method being compiled 37000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers jobject class_loader; // compiling method's class loader 371a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee uint32_t method_idx; // compiling method's index into method_ids of DexFile 372a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee const DexFile::CodeItem* code_item; // compiling method's DexFile code_item 373a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee uint32_t access_flags; // compiling method's access flags 37408f753d5859936f8d3524e9e4faa6cee353873eaIan Rogers InvokeType invoke_type; // compiling method's invocation type 375a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee const char* shorty; // compiling method's shorty 376fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee LIR* first_lir_insn; 377fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee LIR* last_lir_insn; 378fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee LIR* literal_list; // Constants 379fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee LIR* method_literal_list; // Method literals requiring patching 380fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee LIR* code_literal_list; // Code literals requiring patching 381fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee uint32_t disable_opt; // opt_control_vector flags 382fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee uint32_t enable_debug; // debugControlVector flags 383fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee int data_offset; // starting offset of literal pool 384fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee int total_size; // header + code size 385fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee AssemblerStatus assembler_status; // Success or fix and retry 386fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee int assembler_retries; 387fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee std::vector<uint8_t> code_buffer; 388a5b3024aed77a8204d5fb48ba7f763fb8c60fa76Bill Buzbee /* 389a5b3024aed77a8204d5fb48ba7f763fb8c60fa76Bill Buzbee * Holds mapping from native PC to dex PC for safepoints where we may deoptimize. 390a5b3024aed77a8204d5fb48ba7f763fb8c60fa76Bill Buzbee * Native PC is on the return address of the safepointed operation. Dex PC is for 391a5b3024aed77a8204d5fb48ba7f763fb8c60fa76Bill Buzbee * the instruction being executed at the safepoint. 392a5b3024aed77a8204d5fb48ba7f763fb8c60fa76Bill Buzbee */ 393a5b3024aed77a8204d5fb48ba7f763fb8c60fa76Bill Buzbee std::vector<uint32_t> pc2dexMappingTable; 394a5b3024aed77a8204d5fb48ba7f763fb8c60fa76Bill Buzbee /* 395a5b3024aed77a8204d5fb48ba7f763fb8c60fa76Bill Buzbee * Holds mapping from Dex PC to native PC for catch entry points. Native PC and Dex PC 396a5b3024aed77a8204d5fb48ba7f763fb8c60fa76Bill Buzbee * immediately preceed the instruction. 397a5b3024aed77a8204d5fb48ba7f763fb8c60fa76Bill Buzbee */ 398a5b3024aed77a8204d5fb48ba7f763fb8c60fa76Bill Buzbee std::vector<uint32_t> dex2pcMappingTable; 399fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee std::vector<uint32_t> combined_mapping_table; 400fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee std::vector<uint32_t> core_vmap_table; 401fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee std::vector<uint32_t> fp_vmap_table; 402fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee std::vector<uint8_t> native_gc_map; 403fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee bool verbose; 404fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee bool has_loop; // Contains a loop 405fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee bool has_invoke; // Contains an invoke instruction 406fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee bool qd_mode; // Compile for code size/compile time 407fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee RegisterPool* reg_pool; 408fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee InstructionSet instruction_set; 409fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee /* Number of total regs used in the whole cu after SSA transformation */ 410fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee int num_ssa_regs; 411a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee /* Map SSA reg i to the base virtual register/subscript */ 412fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee GrowableList* ssa_base_vregs; 413fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee GrowableList* ssa_subscripts; 414fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee GrowableList* ssa_strings; 415a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 416a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee /* The following are new data structures to support SSA representations */ 417a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee /* Map original Dalvik virtual reg i to the current SSA name */ 418fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee int* vreg_to_ssa_map; // length == method->registers_size 419fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee int* ssa_last_defs; // length == method->registers_size 420fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee ArenaBitVector* is_constant_v; // length == num_ssa_reg 421fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee int* constant_values; // length == num_ssa_reg 422fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee int* phi_alias_map; // length == num_ssa_reg 423fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee MIR* phi_list; 424a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 425a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee /* Use counts of ssa names */ 426fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee GrowableList use_counts; // Weighted by nesting depth 427fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee GrowableList raw_use_counts; // Not weighted 428a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 429a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee /* Optimization support */ 430fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee GrowableList loop_headers; 431a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 432a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee /* Map SSA names to location */ 433fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee RegLocation* reg_location; 434a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 435fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee /* Keep track of Dalvik v_reg to physical register mappings */ 436fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee PromotionMap* promotion_map; 437a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 438a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee /* SSA name for Method* */ 439fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee int method_sreg; 440fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee RegLocation method_loc; // Describes location of method* 441fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee 442fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee int num_reachable_blocks; 443fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee int num_dalvik_registers; // method->registers_size 444fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee BasicBlock* entry_block; 445fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee BasicBlock* exit_block; 446fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee BasicBlock* cur_block; 447fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee GrowableList dfs_order; 448fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee GrowableList dfs_post_order; 449fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee GrowableList dom_post_order_traversal; 450fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee GrowableList throw_launchpads; 451fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee GrowableList suspend_launchpads; 452fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee GrowableList intrinsic_launchpads; 453fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee GrowableList compiler_temps; 454fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee int* i_dom_list; 455fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee ArenaBitVector* try_block_addr; 456fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee ArenaBitVector** def_block_matrix; // num_dalvik_register x num_blocks 457fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee ArenaBitVector* temp_block_v; 458fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee ArenaBitVector* temp_dalvik_register_v; 459fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee ArenaBitVector* temp_ssa_register_v; // num_ssa_regs 460fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee int* temp_ssa_block_id_v; // working storage for Phi labels 461fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee LIR* block_label_list; 462a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee /* 463a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee * Frame layout details. 464a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee * NOTE: for debug support it will be necessary to add a structure 465a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee * to map the Dalvik virtual registers to the promoted registers. 466a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee * NOTE: "num" fields are in 4-byte words, "Size" and "Offset" in bytes. 467a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee */ 468fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee int num_ins; 469fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee int num_outs; 470fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee int num_regs; // Unlike num_dalvik_registers, does not include ins 471fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee int num_core_spills; 472fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee int num_fp_spills; 473fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee int num_compiler_temps; 474fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee int frame_size; 475fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee unsigned int core_spill_mask; 476fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee unsigned int fp_spill_mask; 477a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee unsigned int attrs; 478a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee /* 479a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee * CLEANUP/RESTRUCTURE: The code generation utilities don't have a built-in 480a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee * mechanism to propagate the original Dalvik opcode address to the 481a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee * associated generated instructions. For the trace compiler, this wasn't 482a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee * necessary because the interpreter handled all throws and debugging 483a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee * requests. For now we'll handle this by placing the Dalvik offset 484a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee * in the CompilationUnit struct before codegen for each instruction. 485a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee * The low-level LIR creation utilites will pull it from here. Should 486a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee * be rewritten. 487a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee */ 488fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee int current_dalvik_offset; 489fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee GrowableList switch_tables; 490fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee GrowableList fill_array_data; 491eaf09bc65f9a10d12befcdb239156938c9bceef2buzbee const uint16_t* insns; 492fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee uint32_t insns_size; 493fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee bool disable_dataflow; // Skip dataflow analysis if possible 494fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee SafeMap<unsigned int, BasicBlock*> block_map; // FindBlock lookup cache 495fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee SafeMap<unsigned int, unsigned int> block_id_map; // Block collapse lookup cache 496fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee SafeMap<unsigned int, LIR*> boundary_map; // boundary lookup cache 497fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee int def_count; // Used to estimate number of SSA names 498a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 499a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee // If non-empty, apply optimizer/debug flags only to matching methods. 500fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee std::string compiler_method_match; 501fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee // Flips sense of compiler_method_match - apply flags if doesn't match. 502fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee bool compiler_flip_match; 503fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee ArenaMemBlock* arena_head; 504fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee ArenaMemBlock* current_arena; 505fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee int num_arena_blocks; 506a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee Memstats* mstats; 507d1643e41ef242ae656f667bf3c8b0324635cefd3buzbee Checkstats* checkstats; 508fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee bool gen_bitcode; 5094df2bbdfe6602ce5f141b7b44028b95faa0bd8efbuzbee LLVMInfo* llvm_info; 5102cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee llvm::LLVMContext* context; 5112cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee llvm::Module* module; 5122cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee llvm::Function* func; 5132cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee greenland::IntrinsicHelper* intrinsic_helper; 5142cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee greenland::IRBuilder* irb; 515fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee llvm::BasicBlock* placeholder_bb; 516fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee llvm::BasicBlock* entry_bb; 517fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee llvm::BasicBlock* entryTarget_bb; 5182cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee std::string bitcode_filename; 519fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee GrowableList llvm_values; 520fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee int32_t temp_name; 521fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee SafeMap<llvm::BasicBlock*, LIR*> block_to_label_map; // llvm bb -> LIR label 522fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee SafeMap<int32_t, llvm::BasicBlock*> id_to_block_map; // block id -> llvm bb 523fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee SafeMap<llvm::Value*, RegLocation> loc_map; // llvm Value to loc rec 524fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee int num_shadow_frame_entries; 525fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee int* shadow_map; 526fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee std::set<llvm::BasicBlock*> llvm_blocks; 5273d661949dba4a2f3311e6f74a3c42b5addf1f534buzbee#ifndef NDEBUG 528a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee /* 529a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee * Sanity checking for the register temp tracking. The same ssa 530a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee * name should never be associated with one temp register per 531a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee * instruction compilation. 532a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee */ 533fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee int live_sreg; 5343d661949dba4a2f3311e6f74a3c42b5addf1f534buzbee#endif 5356459e7cb35ca83ffc2f266dddeb83673bc07ecd4buzbee std::set<uint32_t> catches; 536fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee int* opcode_count; // Count Dalvik opcodes for tuning 537719ace4734f519c67fd2c1ff7a232c079309a615Elliott Hughes}; 53867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee 539719ace4734f519c67fd2c1ff7a232c079309a615Elliott Hughesstruct SwitchTable { 540a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee int offset; 541eaf09bc65f9a10d12befcdb239156938c9bceef2buzbee const uint16_t* table; // Original dex table 542a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee int vaddr; // Dalvik offset of switch opcode 543a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee LIR* anchor; // Reference instruction for relative offsets 544a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee LIR** targets; // Array of case targets 545719ace4734f519c67fd2c1ff7a232c079309a615Elliott Hughes}; 5465de3494e4297c0d480409da3fecee39173f1d4e1buzbee 547719ace4734f519c67fd2c1ff7a232c079309a615Elliott Hughesstruct FillArrayData { 548a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee int offset; 549eaf09bc65f9a10d12befcdb239156938c9bceef2buzbee const uint16_t* table; // Original dex table 550a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee int size; 551a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee int vaddr; // Dalvik offset of FILL_ARRAY_DATA opcode 552719ace4734f519c67fd2c1ff7a232c079309a615Elliott Hughes}; 5535de3494e4297c0d480409da3fecee39173f1d4e1buzbee 55416da88c70c4bdbd97b8482be8b42103a52f22d59buzbee#define MAX_PATTERN_LEN 5 55516da88c70c4bdbd97b8482be8b42103a52f22d59buzbee 55616da88c70c4bdbd97b8482be8b42103a52f22d59buzbeestruct CodePattern { 557a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee const Instruction::Code opcodes[MAX_PATTERN_LEN]; 558fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee const SpecialCaseHandler handler_code; 55916da88c70c4bdbd97b8482be8b42103a52f22d59buzbee}; 56016da88c70c4bdbd97b8482be8b42103a52f22d59buzbee 561fa57c47f1b72916371a9c2d5c1389219bce655b4buzbeestatic const CodePattern special_patterns[] = { 562a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee {{Instruction::RETURN_VOID}, kNullMethod}, 563a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee {{Instruction::CONST, Instruction::RETURN}, kConstFunction}, 564a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee {{Instruction::CONST_4, Instruction::RETURN}, kConstFunction}, 565a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee {{Instruction::CONST_4, Instruction::RETURN_OBJECT}, kConstFunction}, 566a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee {{Instruction::CONST_16, Instruction::RETURN}, kConstFunction}, 567a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee {{Instruction::IGET, Instruction:: RETURN}, kIGet}, 568a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee {{Instruction::IGET_BOOLEAN, Instruction::RETURN}, kIGetBoolean}, 569a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee {{Instruction::IGET_OBJECT, Instruction::RETURN_OBJECT}, kIGetObject}, 570a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee {{Instruction::IGET_BYTE, Instruction::RETURN}, kIGetByte}, 571a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee {{Instruction::IGET_CHAR, Instruction::RETURN}, kIGetChar}, 572a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee {{Instruction::IGET_SHORT, Instruction::RETURN}, kIGetShort}, 573a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee {{Instruction::IGET_WIDE, Instruction::RETURN_WIDE}, kIGetWide}, 574a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee {{Instruction::IPUT, Instruction::RETURN_VOID}, kIPut}, 575a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee {{Instruction::IPUT_BOOLEAN, Instruction::RETURN_VOID}, kIPutBoolean}, 576a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee {{Instruction::IPUT_OBJECT, Instruction::RETURN_VOID}, kIPutObject}, 577a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee {{Instruction::IPUT_BYTE, Instruction::RETURN_VOID}, kIPutByte}, 578a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee {{Instruction::IPUT_CHAR, Instruction::RETURN_VOID}, kIPutChar}, 579a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee {{Instruction::IPUT_SHORT, Instruction::RETURN_VOID}, kIPutShort}, 580a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee {{Instruction::IPUT_WIDE, Instruction::RETURN_VOID}, kIPutWide}, 581a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee {{Instruction::RETURN}, kIdentity}, 582a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee {{Instruction::RETURN_OBJECT}, kIdentity}, 583a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee {{Instruction::RETURN_WIDE}, kIdentity}, 58416da88c70c4bdbd97b8482be8b42103a52f22d59buzbee}; 5855de3494e4297c0d480409da3fecee39173f1d4e1buzbee 586fa57c47f1b72916371a9c2d5c1389219bce655b4buzbeeBasicBlock* NewMemBB(CompilationUnit* cu, BBType block_type, int block_id); 58767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee 58852a77fc135f0e0df57ee24641c3f5ae415ff7bd6buzbeevoid AppendMIR(BasicBlock* bb, MIR* mir); 58967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee 59052a77fc135f0e0df57ee24641c3f5ae415ff7bd6buzbeevoid PrependMIR(BasicBlock* bb, MIR* mir); 59167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee 592fa57c47f1b72916371a9c2d5c1389219bce655b4buzbeevoid InsertMIRAfter(BasicBlock* bb, MIR* current_mir, MIR* new_mir); 59367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee 594fa57c47f1b72916371a9c2d5c1389219bce655b4buzbeevoid AppendLIR(CompilationUnit* cu, LIR* lir); 59567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee 596fa57c47f1b72916371a9c2d5c1389219bce655b4buzbeevoid InsertLIRBefore(LIR* current_lir, LIR* new_lir); 59767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee 598fa57c47f1b72916371a9c2d5c1389219bce655b4buzbeevoid InsertLIRAfter(LIR* current_lir, LIR* new_lir); 59967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee 600fa57c47f1b72916371a9c2d5c1389219bce655b4buzbeeMIR* FindMoveResult(CompilationUnit* cu, BasicBlock* bb, MIR* mir); 60167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee/* Debug Utilities */ 602fa57c47f1b72916371a9c2d5c1389219bce655b4buzbeevoid DumpCompilationUnit(CompilationUnit* cu); 60367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee 60411d1b0c31ddd710d26068da8e0e4621002205b4bElliott Hughes} // namespace art 60511d1b0c31ddd710d26068da8e0e4621002205b4bElliott Hughes 60667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee#endif // ART_SRC_COMPILER_COMPILER_IR_H_ 607