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