annotate src/share/vm/ci/ciTypeFlow.hpp @ 1941:79d04223b8a5

Added caching for resolved types and resolved fields. This is crucial, because the local load elimination will lead to wrong results, if field equality (of two RiField objects with the same object and the same RiType) is not given. The caching makes sure that the default equals implementation is sufficient.
author Thomas Wuerthinger <wuerthinger@ssw.jku.at>
date Tue, 28 Dec 2010 18:33:26 +0100
parents c18cbe5936b8
children f95d63e2154a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 380
diff changeset
2 * Copyright (c) 2000, 2008, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 380
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 380
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 380
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
a61af66fc99e Initial load
duke
parents:
diff changeset
25
a61af66fc99e Initial load
duke
parents:
diff changeset
26 class ciTypeFlow : public ResourceObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
27 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
28 ciEnv* _env;
a61af66fc99e Initial load
duke
parents:
diff changeset
29 ciMethod* _method;
a61af66fc99e Initial load
duke
parents:
diff changeset
30 ciMethodBlocks* _methodBlocks;
a61af66fc99e Initial load
duke
parents:
diff changeset
31 int _osr_bci;
a61af66fc99e Initial load
duke
parents:
diff changeset
32
a61af66fc99e Initial load
duke
parents:
diff changeset
33 // information cached from the method:
a61af66fc99e Initial load
duke
parents:
diff changeset
34 int _max_locals;
a61af66fc99e Initial load
duke
parents:
diff changeset
35 int _max_stack;
a61af66fc99e Initial load
duke
parents:
diff changeset
36 int _code_size;
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
37 bool _has_irreducible_entry;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
38
a61af66fc99e Initial load
duke
parents:
diff changeset
39 const char* _failure_reason;
a61af66fc99e Initial load
duke
parents:
diff changeset
40
a61af66fc99e Initial load
duke
parents:
diff changeset
41 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
42 class StateVector;
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
43 class Loop;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
44 class Block;
a61af66fc99e Initial load
duke
parents:
diff changeset
45
a61af66fc99e Initial load
duke
parents:
diff changeset
46 // Build a type flow analyzer
a61af66fc99e Initial load
duke
parents:
diff changeset
47 // Do an OSR analysis if osr_bci >= 0.
a61af66fc99e Initial load
duke
parents:
diff changeset
48 ciTypeFlow(ciEnv* env, ciMethod* method, int osr_bci = InvocationEntryBci);
a61af66fc99e Initial load
duke
parents:
diff changeset
49
a61af66fc99e Initial load
duke
parents:
diff changeset
50 // Accessors
a61af66fc99e Initial load
duke
parents:
diff changeset
51 ciMethod* method() const { return _method; }
a61af66fc99e Initial load
duke
parents:
diff changeset
52 ciEnv* env() { return _env; }
a61af66fc99e Initial load
duke
parents:
diff changeset
53 Arena* arena() { return _env->arena(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
54 bool is_osr_flow() const{ return _osr_bci != InvocationEntryBci; }
a61af66fc99e Initial load
duke
parents:
diff changeset
55 int start_bci() const { return is_osr_flow()? _osr_bci: 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
56 int max_locals() const { return _max_locals; }
a61af66fc99e Initial load
duke
parents:
diff changeset
57 int max_stack() const { return _max_stack; }
a61af66fc99e Initial load
duke
parents:
diff changeset
58 int max_cells() const { return _max_locals + _max_stack; }
a61af66fc99e Initial load
duke
parents:
diff changeset
59 int code_size() const { return _code_size; }
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
60 bool has_irreducible_entry() const { return _has_irreducible_entry; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
61
a61af66fc99e Initial load
duke
parents:
diff changeset
62 // Represents information about an "active" jsr call. This
a61af66fc99e Initial load
duke
parents:
diff changeset
63 // class represents a call to the routine at some entry address
a61af66fc99e Initial load
duke
parents:
diff changeset
64 // with some distinct return address.
a61af66fc99e Initial load
duke
parents:
diff changeset
65 class JsrRecord : public ResourceObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
66 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
67 int _entry_address;
a61af66fc99e Initial load
duke
parents:
diff changeset
68 int _return_address;
a61af66fc99e Initial load
duke
parents:
diff changeset
69 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
70 JsrRecord(int entry_address, int return_address) {
a61af66fc99e Initial load
duke
parents:
diff changeset
71 _entry_address = entry_address;
a61af66fc99e Initial load
duke
parents:
diff changeset
72 _return_address = return_address;
a61af66fc99e Initial load
duke
parents:
diff changeset
73 }
a61af66fc99e Initial load
duke
parents:
diff changeset
74
a61af66fc99e Initial load
duke
parents:
diff changeset
75 int entry_address() const { return _entry_address; }
a61af66fc99e Initial load
duke
parents:
diff changeset
76 int return_address() const { return _return_address; }
a61af66fc99e Initial load
duke
parents:
diff changeset
77
a61af66fc99e Initial load
duke
parents:
diff changeset
78 void print_on(outputStream* st) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
79 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
80 st->print("%d->%d", entry_address(), return_address());
a61af66fc99e Initial load
duke
parents:
diff changeset
81 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
82 }
a61af66fc99e Initial load
duke
parents:
diff changeset
83 };
a61af66fc99e Initial load
duke
parents:
diff changeset
84
a61af66fc99e Initial load
duke
parents:
diff changeset
85 // A JsrSet represents some set of JsrRecords. This class
a61af66fc99e Initial load
duke
parents:
diff changeset
86 // is used to record a set of all jsr routines which we permit
a61af66fc99e Initial load
duke
parents:
diff changeset
87 // execution to return (ret) from.
a61af66fc99e Initial load
duke
parents:
diff changeset
88 //
a61af66fc99e Initial load
duke
parents:
diff changeset
89 // During abstract interpretation, JsrSets are used to determine
a61af66fc99e Initial load
duke
parents:
diff changeset
90 // whether two paths which reach a given block are unique, and
a61af66fc99e Initial load
duke
parents:
diff changeset
91 // should be cloned apart, or are compatible, and should merge
a61af66fc99e Initial load
duke
parents:
diff changeset
92 // together.
a61af66fc99e Initial load
duke
parents:
diff changeset
93 //
a61af66fc99e Initial load
duke
parents:
diff changeset
94 // Note that different amounts of effort can be expended determining
a61af66fc99e Initial load
duke
parents:
diff changeset
95 // if paths are compatible. <DISCUSSION>
a61af66fc99e Initial load
duke
parents:
diff changeset
96 class JsrSet : public ResourceObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
97 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
98 GrowableArray<JsrRecord*>* _set;
a61af66fc99e Initial load
duke
parents:
diff changeset
99
a61af66fc99e Initial load
duke
parents:
diff changeset
100 JsrRecord* record_at(int i) {
a61af66fc99e Initial load
duke
parents:
diff changeset
101 return _set->at(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
102 }
a61af66fc99e Initial load
duke
parents:
diff changeset
103
a61af66fc99e Initial load
duke
parents:
diff changeset
104 // Insert the given JsrRecord into the JsrSet, maintaining the order
a61af66fc99e Initial load
duke
parents:
diff changeset
105 // of the set and replacing any element with the same entry address.
a61af66fc99e Initial load
duke
parents:
diff changeset
106 void insert_jsr_record(JsrRecord* record);
a61af66fc99e Initial load
duke
parents:
diff changeset
107
a61af66fc99e Initial load
duke
parents:
diff changeset
108 // Remove the JsrRecord with the given return address from the JsrSet.
a61af66fc99e Initial load
duke
parents:
diff changeset
109 void remove_jsr_record(int return_address);
a61af66fc99e Initial load
duke
parents:
diff changeset
110
a61af66fc99e Initial load
duke
parents:
diff changeset
111 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
112 JsrSet(Arena* arena, int default_len = 4);
a61af66fc99e Initial load
duke
parents:
diff changeset
113
a61af66fc99e Initial load
duke
parents:
diff changeset
114 // Copy this JsrSet.
a61af66fc99e Initial load
duke
parents:
diff changeset
115 void copy_into(JsrSet* jsrs);
a61af66fc99e Initial load
duke
parents:
diff changeset
116
a61af66fc99e Initial load
duke
parents:
diff changeset
117 // Is this JsrSet compatible with some other JsrSet?
a61af66fc99e Initial load
duke
parents:
diff changeset
118 bool is_compatible_with(JsrSet* other);
a61af66fc99e Initial load
duke
parents:
diff changeset
119
a61af66fc99e Initial load
duke
parents:
diff changeset
120 // Apply the effect of a single bytecode to the JsrSet.
a61af66fc99e Initial load
duke
parents:
diff changeset
121 void apply_control(ciTypeFlow* analyzer,
a61af66fc99e Initial load
duke
parents:
diff changeset
122 ciBytecodeStream* str,
a61af66fc99e Initial load
duke
parents:
diff changeset
123 StateVector* state);
a61af66fc99e Initial load
duke
parents:
diff changeset
124
a61af66fc99e Initial load
duke
parents:
diff changeset
125 // What is the cardinality of this set?
a61af66fc99e Initial load
duke
parents:
diff changeset
126 int size() const { return _set->length(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
127
a61af66fc99e Initial load
duke
parents:
diff changeset
128 void print_on(outputStream* st) const PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
129 };
a61af66fc99e Initial load
duke
parents:
diff changeset
130
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
131 class LocalSet VALUE_OBJ_CLASS_SPEC {
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
132 private:
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
133 enum Constants { max = 63 };
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
134 uint64_t _bits;
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
135 public:
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
136 LocalSet() : _bits(0) {}
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
137 void add(uint32_t i) { if (i < (uint32_t)max) _bits |= (1LL << i); }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
138 void add(LocalSet* ls) { _bits |= ls->_bits; }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
139 bool test(uint32_t i) const { return i < (uint32_t)max ? (_bits>>i)&1U : true; }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
140 void clear() { _bits = 0; }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
141 void print_on(outputStream* st, int limit) const PRODUCT_RETURN;
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
142 };
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
143
0
a61af66fc99e Initial load
duke
parents:
diff changeset
144 // Used as a combined index for locals and temps
a61af66fc99e Initial load
duke
parents:
diff changeset
145 enum Cell {
303
fa4d1d240383 6741642: bad enum definition in ciTypeFlow.hpp
never
parents: 0
diff changeset
146 Cell_0, Cell_max = INT_MAX
0
a61af66fc99e Initial load
duke
parents:
diff changeset
147 };
a61af66fc99e Initial load
duke
parents:
diff changeset
148
a61af66fc99e Initial load
duke
parents:
diff changeset
149 // A StateVector summarizes the type information at some
a61af66fc99e Initial load
duke
parents:
diff changeset
150 // point in the program
a61af66fc99e Initial load
duke
parents:
diff changeset
151 class StateVector : public ResourceObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
152 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
153 ciType** _types;
a61af66fc99e Initial load
duke
parents:
diff changeset
154 int _stack_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
155 int _monitor_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
156 ciTypeFlow* _outer;
a61af66fc99e Initial load
duke
parents:
diff changeset
157
a61af66fc99e Initial load
duke
parents:
diff changeset
158 int _trap_bci;
a61af66fc99e Initial load
duke
parents:
diff changeset
159 int _trap_index;
a61af66fc99e Initial load
duke
parents:
diff changeset
160
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
161 LocalSet _def_locals; // For entire block
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
162
0
a61af66fc99e Initial load
duke
parents:
diff changeset
163 static ciType* type_meet_internal(ciType* t1, ciType* t2, ciTypeFlow* analyzer);
a61af66fc99e Initial load
duke
parents:
diff changeset
164
a61af66fc99e Initial load
duke
parents:
diff changeset
165 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
166 // Special elements in our type lattice.
a61af66fc99e Initial load
duke
parents:
diff changeset
167 enum {
a61af66fc99e Initial load
duke
parents:
diff changeset
168 T_TOP = T_VOID, // why not?
a61af66fc99e Initial load
duke
parents:
diff changeset
169 T_BOTTOM = T_CONFLICT,
a61af66fc99e Initial load
duke
parents:
diff changeset
170 T_LONG2 = T_SHORT, // 2nd word of T_LONG
a61af66fc99e Initial load
duke
parents:
diff changeset
171 T_DOUBLE2 = T_CHAR, // 2nd word of T_DOUBLE
a61af66fc99e Initial load
duke
parents:
diff changeset
172 T_NULL = T_BYTE // for now.
a61af66fc99e Initial load
duke
parents:
diff changeset
173 };
a61af66fc99e Initial load
duke
parents:
diff changeset
174 static ciType* top_type() { return ciType::make((BasicType)T_TOP); }
a61af66fc99e Initial load
duke
parents:
diff changeset
175 static ciType* bottom_type() { return ciType::make((BasicType)T_BOTTOM); }
a61af66fc99e Initial load
duke
parents:
diff changeset
176 static ciType* long2_type() { return ciType::make((BasicType)T_LONG2); }
a61af66fc99e Initial load
duke
parents:
diff changeset
177 static ciType* double2_type(){ return ciType::make((BasicType)T_DOUBLE2); }
a61af66fc99e Initial load
duke
parents:
diff changeset
178 static ciType* null_type() { return ciType::make((BasicType)T_NULL); }
a61af66fc99e Initial load
duke
parents:
diff changeset
179
a61af66fc99e Initial load
duke
parents:
diff changeset
180 static ciType* half_type(ciType* t) {
a61af66fc99e Initial load
duke
parents:
diff changeset
181 switch (t->basic_type()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
182 case T_LONG: return long2_type();
a61af66fc99e Initial load
duke
parents:
diff changeset
183 case T_DOUBLE: return double2_type();
a61af66fc99e Initial load
duke
parents:
diff changeset
184 default: ShouldNotReachHere(); return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
185 }
a61af66fc99e Initial load
duke
parents:
diff changeset
186 }
a61af66fc99e Initial load
duke
parents:
diff changeset
187
a61af66fc99e Initial load
duke
parents:
diff changeset
188 // The meet operation for our type lattice.
a61af66fc99e Initial load
duke
parents:
diff changeset
189 ciType* type_meet(ciType* t1, ciType* t2) {
a61af66fc99e Initial load
duke
parents:
diff changeset
190 return type_meet_internal(t1, t2, outer());
a61af66fc99e Initial load
duke
parents:
diff changeset
191 }
a61af66fc99e Initial load
duke
parents:
diff changeset
192
a61af66fc99e Initial load
duke
parents:
diff changeset
193 // Accessors
a61af66fc99e Initial load
duke
parents:
diff changeset
194 ciTypeFlow* outer() const { return _outer; }
a61af66fc99e Initial load
duke
parents:
diff changeset
195
a61af66fc99e Initial load
duke
parents:
diff changeset
196 int stack_size() const { return _stack_size; }
a61af66fc99e Initial load
duke
parents:
diff changeset
197 void set_stack_size(int ss) { _stack_size = ss; }
a61af66fc99e Initial load
duke
parents:
diff changeset
198
a61af66fc99e Initial load
duke
parents:
diff changeset
199 int monitor_count() const { return _monitor_count; }
a61af66fc99e Initial load
duke
parents:
diff changeset
200 void set_monitor_count(int mc) { _monitor_count = mc; }
a61af66fc99e Initial load
duke
parents:
diff changeset
201
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
202 LocalSet* def_locals() { return &_def_locals; }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
203 const LocalSet* def_locals() const { return &_def_locals; }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
204
0
a61af66fc99e Initial load
duke
parents:
diff changeset
205 static Cell start_cell() { return (Cell)0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
206 static Cell next_cell(Cell c) { return (Cell)(((int)c) + 1); }
a61af66fc99e Initial load
duke
parents:
diff changeset
207 Cell limit_cell() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
208 return (Cell)(outer()->max_locals() + stack_size());
a61af66fc99e Initial load
duke
parents:
diff changeset
209 }
a61af66fc99e Initial load
duke
parents:
diff changeset
210
a61af66fc99e Initial load
duke
parents:
diff changeset
211 // Cell creation
a61af66fc99e Initial load
duke
parents:
diff changeset
212 Cell local(int lnum) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
213 assert(lnum < outer()->max_locals(), "index check");
a61af66fc99e Initial load
duke
parents:
diff changeset
214 return (Cell)(lnum);
a61af66fc99e Initial load
duke
parents:
diff changeset
215 }
a61af66fc99e Initial load
duke
parents:
diff changeset
216
a61af66fc99e Initial load
duke
parents:
diff changeset
217 Cell stack(int snum) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
218 assert(snum < stack_size(), "index check");
a61af66fc99e Initial load
duke
parents:
diff changeset
219 return (Cell)(outer()->max_locals() + snum);
a61af66fc99e Initial load
duke
parents:
diff changeset
220 }
a61af66fc99e Initial load
duke
parents:
diff changeset
221
a61af66fc99e Initial load
duke
parents:
diff changeset
222 Cell tos() const { return stack(stack_size()-1); }
a61af66fc99e Initial load
duke
parents:
diff changeset
223
a61af66fc99e Initial load
duke
parents:
diff changeset
224 // For external use only:
a61af66fc99e Initial load
duke
parents:
diff changeset
225 ciType* local_type_at(int i) const { return type_at(local(i)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
226 ciType* stack_type_at(int i) const { return type_at(stack(i)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
227
a61af66fc99e Initial load
duke
parents:
diff changeset
228 // Accessors for the type of some Cell c
a61af66fc99e Initial load
duke
parents:
diff changeset
229 ciType* type_at(Cell c) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
230 assert(start_cell() <= c && c < limit_cell(), "out of bounds");
a61af66fc99e Initial load
duke
parents:
diff changeset
231 return _types[c];
a61af66fc99e Initial load
duke
parents:
diff changeset
232 }
a61af66fc99e Initial load
duke
parents:
diff changeset
233
a61af66fc99e Initial load
duke
parents:
diff changeset
234 void set_type_at(Cell c, ciType* type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
235 assert(start_cell() <= c && c < limit_cell(), "out of bounds");
a61af66fc99e Initial load
duke
parents:
diff changeset
236 _types[c] = type;
a61af66fc99e Initial load
duke
parents:
diff changeset
237 }
a61af66fc99e Initial load
duke
parents:
diff changeset
238
a61af66fc99e Initial load
duke
parents:
diff changeset
239 // Top-of-stack operations.
a61af66fc99e Initial load
duke
parents:
diff changeset
240 void set_type_at_tos(ciType* type) { set_type_at(tos(), type); }
a61af66fc99e Initial load
duke
parents:
diff changeset
241 ciType* type_at_tos() const { return type_at(tos()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
242
a61af66fc99e Initial load
duke
parents:
diff changeset
243 void push(ciType* type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
244 _stack_size++;
a61af66fc99e Initial load
duke
parents:
diff changeset
245 set_type_at_tos(type);
a61af66fc99e Initial load
duke
parents:
diff changeset
246 }
a61af66fc99e Initial load
duke
parents:
diff changeset
247 void pop() {
a61af66fc99e Initial load
duke
parents:
diff changeset
248 debug_only(set_type_at_tos(bottom_type()));
a61af66fc99e Initial load
duke
parents:
diff changeset
249 _stack_size--;
a61af66fc99e Initial load
duke
parents:
diff changeset
250 }
a61af66fc99e Initial load
duke
parents:
diff changeset
251 ciType* pop_value() {
a61af66fc99e Initial load
duke
parents:
diff changeset
252 ciType* t = type_at_tos();
a61af66fc99e Initial load
duke
parents:
diff changeset
253 pop();
a61af66fc99e Initial load
duke
parents:
diff changeset
254 return t;
a61af66fc99e Initial load
duke
parents:
diff changeset
255 }
a61af66fc99e Initial load
duke
parents:
diff changeset
256
a61af66fc99e Initial load
duke
parents:
diff changeset
257 // Convenience operations.
a61af66fc99e Initial load
duke
parents:
diff changeset
258 bool is_reference(ciType* type) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
259 return type == null_type() || !type->is_primitive_type();
a61af66fc99e Initial load
duke
parents:
diff changeset
260 }
a61af66fc99e Initial load
duke
parents:
diff changeset
261 bool is_int(ciType* type) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
262 return type->basic_type() == T_INT;
a61af66fc99e Initial load
duke
parents:
diff changeset
263 }
a61af66fc99e Initial load
duke
parents:
diff changeset
264 bool is_long(ciType* type) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
265 return type->basic_type() == T_LONG;
a61af66fc99e Initial load
duke
parents:
diff changeset
266 }
a61af66fc99e Initial load
duke
parents:
diff changeset
267 bool is_float(ciType* type) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
268 return type->basic_type() == T_FLOAT;
a61af66fc99e Initial load
duke
parents:
diff changeset
269 }
a61af66fc99e Initial load
duke
parents:
diff changeset
270 bool is_double(ciType* type) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
271 return type->basic_type() == T_DOUBLE;
a61af66fc99e Initial load
duke
parents:
diff changeset
272 }
a61af66fc99e Initial load
duke
parents:
diff changeset
273
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
274 void store_to_local(int lnum) {
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
275 _def_locals.add((uint) lnum);
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
276 }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
277
0
a61af66fc99e Initial load
duke
parents:
diff changeset
278 void push_translate(ciType* type);
a61af66fc99e Initial load
duke
parents:
diff changeset
279
a61af66fc99e Initial load
duke
parents:
diff changeset
280 void push_int() {
a61af66fc99e Initial load
duke
parents:
diff changeset
281 push(ciType::make(T_INT));
a61af66fc99e Initial load
duke
parents:
diff changeset
282 }
a61af66fc99e Initial load
duke
parents:
diff changeset
283 void pop_int() {
a61af66fc99e Initial load
duke
parents:
diff changeset
284 assert(is_int(type_at_tos()), "must be integer");
a61af66fc99e Initial load
duke
parents:
diff changeset
285 pop();
a61af66fc99e Initial load
duke
parents:
diff changeset
286 }
a61af66fc99e Initial load
duke
parents:
diff changeset
287 void check_int(Cell c) {
a61af66fc99e Initial load
duke
parents:
diff changeset
288 assert(is_int(type_at(c)), "must be integer");
a61af66fc99e Initial load
duke
parents:
diff changeset
289 }
a61af66fc99e Initial load
duke
parents:
diff changeset
290 void push_double() {
a61af66fc99e Initial load
duke
parents:
diff changeset
291 push(ciType::make(T_DOUBLE));
a61af66fc99e Initial load
duke
parents:
diff changeset
292 push(double2_type());
a61af66fc99e Initial load
duke
parents:
diff changeset
293 }
a61af66fc99e Initial load
duke
parents:
diff changeset
294 void pop_double() {
a61af66fc99e Initial load
duke
parents:
diff changeset
295 assert(type_at_tos() == double2_type(), "must be 2nd half");
a61af66fc99e Initial load
duke
parents:
diff changeset
296 pop();
a61af66fc99e Initial load
duke
parents:
diff changeset
297 assert(is_double(type_at_tos()), "must be double");
a61af66fc99e Initial load
duke
parents:
diff changeset
298 pop();
a61af66fc99e Initial load
duke
parents:
diff changeset
299 }
a61af66fc99e Initial load
duke
parents:
diff changeset
300 void push_float() {
a61af66fc99e Initial load
duke
parents:
diff changeset
301 push(ciType::make(T_FLOAT));
a61af66fc99e Initial load
duke
parents:
diff changeset
302 }
a61af66fc99e Initial load
duke
parents:
diff changeset
303 void pop_float() {
a61af66fc99e Initial load
duke
parents:
diff changeset
304 assert(is_float(type_at_tos()), "must be float");
a61af66fc99e Initial load
duke
parents:
diff changeset
305 pop();
a61af66fc99e Initial load
duke
parents:
diff changeset
306 }
a61af66fc99e Initial load
duke
parents:
diff changeset
307 void push_long() {
a61af66fc99e Initial load
duke
parents:
diff changeset
308 push(ciType::make(T_LONG));
a61af66fc99e Initial load
duke
parents:
diff changeset
309 push(long2_type());
a61af66fc99e Initial load
duke
parents:
diff changeset
310 }
a61af66fc99e Initial load
duke
parents:
diff changeset
311 void pop_long() {
a61af66fc99e Initial load
duke
parents:
diff changeset
312 assert(type_at_tos() == long2_type(), "must be 2nd half");
a61af66fc99e Initial load
duke
parents:
diff changeset
313 pop();
a61af66fc99e Initial load
duke
parents:
diff changeset
314 assert(is_long(type_at_tos()), "must be long");
a61af66fc99e Initial load
duke
parents:
diff changeset
315 pop();
a61af66fc99e Initial load
duke
parents:
diff changeset
316 }
a61af66fc99e Initial load
duke
parents:
diff changeset
317 void push_object(ciKlass* klass) {
a61af66fc99e Initial load
duke
parents:
diff changeset
318 push(klass);
a61af66fc99e Initial load
duke
parents:
diff changeset
319 }
a61af66fc99e Initial load
duke
parents:
diff changeset
320 void pop_object() {
a61af66fc99e Initial load
duke
parents:
diff changeset
321 assert(is_reference(type_at_tos()), "must be reference type");
a61af66fc99e Initial load
duke
parents:
diff changeset
322 pop();
a61af66fc99e Initial load
duke
parents:
diff changeset
323 }
a61af66fc99e Initial load
duke
parents:
diff changeset
324 void pop_array() {
a61af66fc99e Initial load
duke
parents:
diff changeset
325 assert(type_at_tos() == null_type() ||
a61af66fc99e Initial load
duke
parents:
diff changeset
326 type_at_tos()->is_array_klass(), "must be array type");
a61af66fc99e Initial load
duke
parents:
diff changeset
327 pop();
a61af66fc99e Initial load
duke
parents:
diff changeset
328 }
a61af66fc99e Initial load
duke
parents:
diff changeset
329 // pop_objArray and pop_typeArray narrow the tos to ciObjArrayKlass
a61af66fc99e Initial load
duke
parents:
diff changeset
330 // or ciTypeArrayKlass (resp.). In the rare case that an explicit
a61af66fc99e Initial load
duke
parents:
diff changeset
331 // null is popped from the stack, we return NULL. Caller beware.
a61af66fc99e Initial load
duke
parents:
diff changeset
332 ciObjArrayKlass* pop_objArray() {
a61af66fc99e Initial load
duke
parents:
diff changeset
333 ciType* array = pop_value();
a61af66fc99e Initial load
duke
parents:
diff changeset
334 if (array == null_type()) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
335 assert(array->is_obj_array_klass(), "must be object array type");
a61af66fc99e Initial load
duke
parents:
diff changeset
336 return array->as_obj_array_klass();
a61af66fc99e Initial load
duke
parents:
diff changeset
337 }
a61af66fc99e Initial load
duke
parents:
diff changeset
338 ciTypeArrayKlass* pop_typeArray() {
a61af66fc99e Initial load
duke
parents:
diff changeset
339 ciType* array = pop_value();
a61af66fc99e Initial load
duke
parents:
diff changeset
340 if (array == null_type()) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
341 assert(array->is_type_array_klass(), "must be prim array type");
a61af66fc99e Initial load
duke
parents:
diff changeset
342 return array->as_type_array_klass();
a61af66fc99e Initial load
duke
parents:
diff changeset
343 }
a61af66fc99e Initial load
duke
parents:
diff changeset
344 void push_null() {
a61af66fc99e Initial load
duke
parents:
diff changeset
345 push(null_type());
a61af66fc99e Initial load
duke
parents:
diff changeset
346 }
a61af66fc99e Initial load
duke
parents:
diff changeset
347 void do_null_assert(ciKlass* unloaded_klass);
a61af66fc99e Initial load
duke
parents:
diff changeset
348
a61af66fc99e Initial load
duke
parents:
diff changeset
349 // Helper convenience routines.
a61af66fc99e Initial load
duke
parents:
diff changeset
350 void do_aaload(ciBytecodeStream* str);
a61af66fc99e Initial load
duke
parents:
diff changeset
351 void do_checkcast(ciBytecodeStream* str);
a61af66fc99e Initial load
duke
parents:
diff changeset
352 void do_getfield(ciBytecodeStream* str);
a61af66fc99e Initial load
duke
parents:
diff changeset
353 void do_getstatic(ciBytecodeStream* str);
a61af66fc99e Initial load
duke
parents:
diff changeset
354 void do_invoke(ciBytecodeStream* str, bool has_receiver);
a61af66fc99e Initial load
duke
parents:
diff changeset
355 void do_jsr(ciBytecodeStream* str);
a61af66fc99e Initial load
duke
parents:
diff changeset
356 void do_ldc(ciBytecodeStream* str);
a61af66fc99e Initial load
duke
parents:
diff changeset
357 void do_multianewarray(ciBytecodeStream* str);
a61af66fc99e Initial load
duke
parents:
diff changeset
358 void do_new(ciBytecodeStream* str);
a61af66fc99e Initial load
duke
parents:
diff changeset
359 void do_newarray(ciBytecodeStream* str);
a61af66fc99e Initial load
duke
parents:
diff changeset
360 void do_putfield(ciBytecodeStream* str);
a61af66fc99e Initial load
duke
parents:
diff changeset
361 void do_putstatic(ciBytecodeStream* str);
a61af66fc99e Initial load
duke
parents:
diff changeset
362 void do_ret(ciBytecodeStream* str);
a61af66fc99e Initial load
duke
parents:
diff changeset
363
a61af66fc99e Initial load
duke
parents:
diff changeset
364 void overwrite_local_double_long(int index) {
a61af66fc99e Initial load
duke
parents:
diff changeset
365 // Invalidate the previous local if it contains first half of
a61af66fc99e Initial load
duke
parents:
diff changeset
366 // a double or long value since it's seconf half is being overwritten.
a61af66fc99e Initial load
duke
parents:
diff changeset
367 int prev_index = index - 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
368 if (prev_index >= 0 &&
a61af66fc99e Initial load
duke
parents:
diff changeset
369 (is_double(type_at(local(prev_index))) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
370 is_long(type_at(local(prev_index))))) {
a61af66fc99e Initial load
duke
parents:
diff changeset
371 set_type_at(local(prev_index), bottom_type());
a61af66fc99e Initial load
duke
parents:
diff changeset
372 }
a61af66fc99e Initial load
duke
parents:
diff changeset
373 }
a61af66fc99e Initial load
duke
parents:
diff changeset
374
a61af66fc99e Initial load
duke
parents:
diff changeset
375 void load_local_object(int index) {
a61af66fc99e Initial load
duke
parents:
diff changeset
376 ciType* type = type_at(local(index));
a61af66fc99e Initial load
duke
parents:
diff changeset
377 assert(is_reference(type), "must be reference type");
a61af66fc99e Initial load
duke
parents:
diff changeset
378 push(type);
a61af66fc99e Initial load
duke
parents:
diff changeset
379 }
a61af66fc99e Initial load
duke
parents:
diff changeset
380 void store_local_object(int index) {
a61af66fc99e Initial load
duke
parents:
diff changeset
381 ciType* type = pop_value();
a61af66fc99e Initial load
duke
parents:
diff changeset
382 assert(is_reference(type) || type->is_return_address(),
a61af66fc99e Initial load
duke
parents:
diff changeset
383 "must be reference type or return address");
a61af66fc99e Initial load
duke
parents:
diff changeset
384 overwrite_local_double_long(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
385 set_type_at(local(index), type);
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
386 store_to_local(index);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
387 }
a61af66fc99e Initial load
duke
parents:
diff changeset
388
a61af66fc99e Initial load
duke
parents:
diff changeset
389 void load_local_double(int index) {
a61af66fc99e Initial load
duke
parents:
diff changeset
390 ciType* type = type_at(local(index));
a61af66fc99e Initial load
duke
parents:
diff changeset
391 ciType* type2 = type_at(local(index+1));
a61af66fc99e Initial load
duke
parents:
diff changeset
392 assert(is_double(type), "must be double type");
a61af66fc99e Initial load
duke
parents:
diff changeset
393 assert(type2 == double2_type(), "must be 2nd half");
a61af66fc99e Initial load
duke
parents:
diff changeset
394 push(type);
a61af66fc99e Initial load
duke
parents:
diff changeset
395 push(double2_type());
a61af66fc99e Initial load
duke
parents:
diff changeset
396 }
a61af66fc99e Initial load
duke
parents:
diff changeset
397 void store_local_double(int index) {
a61af66fc99e Initial load
duke
parents:
diff changeset
398 ciType* type2 = pop_value();
a61af66fc99e Initial load
duke
parents:
diff changeset
399 ciType* type = pop_value();
a61af66fc99e Initial load
duke
parents:
diff changeset
400 assert(is_double(type), "must be double");
a61af66fc99e Initial load
duke
parents:
diff changeset
401 assert(type2 == double2_type(), "must be 2nd half");
a61af66fc99e Initial load
duke
parents:
diff changeset
402 overwrite_local_double_long(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
403 set_type_at(local(index), type);
a61af66fc99e Initial load
duke
parents:
diff changeset
404 set_type_at(local(index+1), type2);
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
405 store_to_local(index);
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
406 store_to_local(index+1);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
407 }
a61af66fc99e Initial load
duke
parents:
diff changeset
408
a61af66fc99e Initial load
duke
parents:
diff changeset
409 void load_local_float(int index) {
a61af66fc99e Initial load
duke
parents:
diff changeset
410 ciType* type = type_at(local(index));
a61af66fc99e Initial load
duke
parents:
diff changeset
411 assert(is_float(type), "must be float type");
a61af66fc99e Initial load
duke
parents:
diff changeset
412 push(type);
a61af66fc99e Initial load
duke
parents:
diff changeset
413 }
a61af66fc99e Initial load
duke
parents:
diff changeset
414 void store_local_float(int index) {
a61af66fc99e Initial load
duke
parents:
diff changeset
415 ciType* type = pop_value();
a61af66fc99e Initial load
duke
parents:
diff changeset
416 assert(is_float(type), "must be float type");
a61af66fc99e Initial load
duke
parents:
diff changeset
417 overwrite_local_double_long(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
418 set_type_at(local(index), type);
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
419 store_to_local(index);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
420 }
a61af66fc99e Initial load
duke
parents:
diff changeset
421
a61af66fc99e Initial load
duke
parents:
diff changeset
422 void load_local_int(int index) {
a61af66fc99e Initial load
duke
parents:
diff changeset
423 ciType* type = type_at(local(index));
a61af66fc99e Initial load
duke
parents:
diff changeset
424 assert(is_int(type), "must be int type");
a61af66fc99e Initial load
duke
parents:
diff changeset
425 push(type);
a61af66fc99e Initial load
duke
parents:
diff changeset
426 }
a61af66fc99e Initial load
duke
parents:
diff changeset
427 void store_local_int(int index) {
a61af66fc99e Initial load
duke
parents:
diff changeset
428 ciType* type = pop_value();
a61af66fc99e Initial load
duke
parents:
diff changeset
429 assert(is_int(type), "must be int type");
a61af66fc99e Initial load
duke
parents:
diff changeset
430 overwrite_local_double_long(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
431 set_type_at(local(index), type);
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
432 store_to_local(index);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
433 }
a61af66fc99e Initial load
duke
parents:
diff changeset
434
a61af66fc99e Initial load
duke
parents:
diff changeset
435 void load_local_long(int index) {
a61af66fc99e Initial load
duke
parents:
diff changeset
436 ciType* type = type_at(local(index));
a61af66fc99e Initial load
duke
parents:
diff changeset
437 ciType* type2 = type_at(local(index+1));
a61af66fc99e Initial load
duke
parents:
diff changeset
438 assert(is_long(type), "must be long type");
a61af66fc99e Initial load
duke
parents:
diff changeset
439 assert(type2 == long2_type(), "must be 2nd half");
a61af66fc99e Initial load
duke
parents:
diff changeset
440 push(type);
a61af66fc99e Initial load
duke
parents:
diff changeset
441 push(long2_type());
a61af66fc99e Initial load
duke
parents:
diff changeset
442 }
a61af66fc99e Initial load
duke
parents:
diff changeset
443 void store_local_long(int index) {
a61af66fc99e Initial load
duke
parents:
diff changeset
444 ciType* type2 = pop_value();
a61af66fc99e Initial load
duke
parents:
diff changeset
445 ciType* type = pop_value();
a61af66fc99e Initial load
duke
parents:
diff changeset
446 assert(is_long(type), "must be long");
a61af66fc99e Initial load
duke
parents:
diff changeset
447 assert(type2 == long2_type(), "must be 2nd half");
a61af66fc99e Initial load
duke
parents:
diff changeset
448 overwrite_local_double_long(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
449 set_type_at(local(index), type);
a61af66fc99e Initial load
duke
parents:
diff changeset
450 set_type_at(local(index+1), type2);
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
451 store_to_local(index);
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
452 store_to_local(index+1);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
453 }
a61af66fc99e Initial load
duke
parents:
diff changeset
454
a61af66fc99e Initial load
duke
parents:
diff changeset
455 // Stop interpretation of this path with a trap.
a61af66fc99e Initial load
duke
parents:
diff changeset
456 void trap(ciBytecodeStream* str, ciKlass* klass, int index);
a61af66fc99e Initial load
duke
parents:
diff changeset
457
a61af66fc99e Initial load
duke
parents:
diff changeset
458 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
459 StateVector(ciTypeFlow* outer);
a61af66fc99e Initial load
duke
parents:
diff changeset
460
a61af66fc99e Initial load
duke
parents:
diff changeset
461 // Copy our value into some other StateVector
a61af66fc99e Initial load
duke
parents:
diff changeset
462 void copy_into(StateVector* copy) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
463
a61af66fc99e Initial load
duke
parents:
diff changeset
464 // Meets this StateVector with another, destructively modifying this
a61af66fc99e Initial load
duke
parents:
diff changeset
465 // one. Returns true if any modification takes place.
a61af66fc99e Initial load
duke
parents:
diff changeset
466 bool meet(const StateVector* incoming);
a61af66fc99e Initial load
duke
parents:
diff changeset
467
a61af66fc99e Initial load
duke
parents:
diff changeset
468 // Ditto, except that the incoming state is coming from an exception.
a61af66fc99e Initial load
duke
parents:
diff changeset
469 bool meet_exception(ciInstanceKlass* exc, const StateVector* incoming);
a61af66fc99e Initial load
duke
parents:
diff changeset
470
a61af66fc99e Initial load
duke
parents:
diff changeset
471 // Apply the effect of one bytecode to this StateVector
a61af66fc99e Initial load
duke
parents:
diff changeset
472 bool apply_one_bytecode(ciBytecodeStream* stream);
a61af66fc99e Initial load
duke
parents:
diff changeset
473
a61af66fc99e Initial load
duke
parents:
diff changeset
474 // What is the bci of the trap?
a61af66fc99e Initial load
duke
parents:
diff changeset
475 int trap_bci() { return _trap_bci; }
a61af66fc99e Initial load
duke
parents:
diff changeset
476
a61af66fc99e Initial load
duke
parents:
diff changeset
477 // What is the index associated with the trap?
a61af66fc99e Initial load
duke
parents:
diff changeset
478 int trap_index() { return _trap_index; }
a61af66fc99e Initial load
duke
parents:
diff changeset
479
a61af66fc99e Initial load
duke
parents:
diff changeset
480 void print_cell_on(outputStream* st, Cell c) const PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
481 void print_on(outputStream* st) const PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
482 };
a61af66fc99e Initial load
duke
parents:
diff changeset
483
a61af66fc99e Initial load
duke
parents:
diff changeset
484 // Parameter for "find_block" calls:
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
485 // Describes the difference between a public and backedge copy.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
486 enum CreateOption {
a61af66fc99e Initial load
duke
parents:
diff changeset
487 create_public_copy,
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
488 create_backedge_copy,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
489 no_create
a61af66fc99e Initial load
duke
parents:
diff changeset
490 };
a61af66fc99e Initial load
duke
parents:
diff changeset
491
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
492 // Successor iterator
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
493 class SuccIter : public StackObj {
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
494 private:
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
495 Block* _pred;
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
496 int _index;
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
497 Block* _succ;
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
498 public:
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
499 SuccIter() : _pred(NULL), _index(-1), _succ(NULL) {}
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
500 SuccIter(Block* pred) : _pred(pred), _index(-1), _succ(NULL) { next(); }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
501 int index() { return _index; }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
502 Block* pred() { return _pred; } // Return predecessor
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
503 bool done() { return _index < 0; } // Finished?
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
504 Block* succ() { return _succ; } // Return current successor
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
505 void next(); // Advance
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
506 void set_succ(Block* succ); // Update current successor
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
507 bool is_normal_ctrl() { return index() < _pred->successors()->length(); }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
508 };
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
509
0
a61af66fc99e Initial load
duke
parents:
diff changeset
510 // A basic block
a61af66fc99e Initial load
duke
parents:
diff changeset
511 class Block : public ResourceObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
512 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
513 ciBlock* _ciblock;
a61af66fc99e Initial load
duke
parents:
diff changeset
514 GrowableArray<Block*>* _exceptions;
a61af66fc99e Initial load
duke
parents:
diff changeset
515 GrowableArray<ciInstanceKlass*>* _exc_klasses;
a61af66fc99e Initial load
duke
parents:
diff changeset
516 GrowableArray<Block*>* _successors;
a61af66fc99e Initial load
duke
parents:
diff changeset
517 StateVector* _state;
a61af66fc99e Initial load
duke
parents:
diff changeset
518 JsrSet* _jsrs;
a61af66fc99e Initial load
duke
parents:
diff changeset
519
a61af66fc99e Initial load
duke
parents:
diff changeset
520 int _trap_bci;
a61af66fc99e Initial load
duke
parents:
diff changeset
521 int _trap_index;
a61af66fc99e Initial load
duke
parents:
diff changeset
522
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
523 // pre_order, assigned at first visit. Used as block ID and "visited" tag
0
a61af66fc99e Initial load
duke
parents:
diff changeset
524 int _pre_order;
a61af66fc99e Initial load
duke
parents:
diff changeset
525
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
526 // A post-order, used to compute the reverse post order (RPO) provided to the client
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
527 int _post_order; // used to compute rpo
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
528
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
529 // Has this block been cloned for a loop backedge?
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
530 bool _backedge_copy;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
531
a61af66fc99e Initial load
duke
parents:
diff changeset
532 // A pointer used for our internal work list
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
533 Block* _next;
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
534 bool _on_work_list; // on the work list
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
535 Block* _rpo_next; // Reverse post order list
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
536
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
537 // Loop info
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
538 Loop* _loop; // nearest loop
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
539 bool _irreducible_entry; // entry to irreducible loop
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
540 bool _exception_entry; // entry to exception handler
0
a61af66fc99e Initial load
duke
parents:
diff changeset
541
a61af66fc99e Initial load
duke
parents:
diff changeset
542 ciBlock* ciblock() const { return _ciblock; }
a61af66fc99e Initial load
duke
parents:
diff changeset
543 StateVector* state() const { return _state; }
a61af66fc99e Initial load
duke
parents:
diff changeset
544
a61af66fc99e Initial load
duke
parents:
diff changeset
545 // Compute the exceptional successors and types for this Block.
a61af66fc99e Initial load
duke
parents:
diff changeset
546 void compute_exceptions();
a61af66fc99e Initial load
duke
parents:
diff changeset
547
a61af66fc99e Initial load
duke
parents:
diff changeset
548 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
549 // constructors
a61af66fc99e Initial load
duke
parents:
diff changeset
550 Block(ciTypeFlow* outer, ciBlock* ciblk, JsrSet* jsrs);
a61af66fc99e Initial load
duke
parents:
diff changeset
551
a61af66fc99e Initial load
duke
parents:
diff changeset
552 void set_trap(int trap_bci, int trap_index) {
a61af66fc99e Initial load
duke
parents:
diff changeset
553 _trap_bci = trap_bci;
a61af66fc99e Initial load
duke
parents:
diff changeset
554 _trap_index = trap_index;
a61af66fc99e Initial load
duke
parents:
diff changeset
555 assert(has_trap(), "");
a61af66fc99e Initial load
duke
parents:
diff changeset
556 }
a61af66fc99e Initial load
duke
parents:
diff changeset
557 bool has_trap() const { return _trap_bci != -1; }
a61af66fc99e Initial load
duke
parents:
diff changeset
558 int trap_bci() const { assert(has_trap(), ""); return _trap_bci; }
a61af66fc99e Initial load
duke
parents:
diff changeset
559 int trap_index() const { assert(has_trap(), ""); return _trap_index; }
a61af66fc99e Initial load
duke
parents:
diff changeset
560
a61af66fc99e Initial load
duke
parents:
diff changeset
561 // accessors
a61af66fc99e Initial load
duke
parents:
diff changeset
562 ciTypeFlow* outer() const { return state()->outer(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
563 int start() const { return _ciblock->start_bci(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
564 int limit() const { return _ciblock->limit_bci(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
565 int control() const { return _ciblock->control_bci(); }
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
566 JsrSet* jsrs() const { return _jsrs; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
567
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
568 bool is_backedge_copy() const { return _backedge_copy; }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
569 void set_backedge_copy(bool z);
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
570 int backedge_copy_count() const { return outer()->backedge_copy_count(ciblock()->index(), _jsrs); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
571
a61af66fc99e Initial load
duke
parents:
diff changeset
572 // access to entry state
a61af66fc99e Initial load
duke
parents:
diff changeset
573 int stack_size() const { return _state->stack_size(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
574 int monitor_count() const { return _state->monitor_count(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
575 ciType* local_type_at(int i) const { return _state->local_type_at(i); }
a61af66fc99e Initial load
duke
parents:
diff changeset
576 ciType* stack_type_at(int i) const { return _state->stack_type_at(i); }
a61af66fc99e Initial load
duke
parents:
diff changeset
577
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
578 // Data flow on locals
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
579 bool is_invariant_local(uint v) const {
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
580 assert(is_loop_head(), "only loop heads");
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
581 // Find outermost loop with same loop head
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
582 Loop* lp = loop();
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
583 while (lp->parent() != NULL) {
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
584 if (lp->parent()->head() != lp->head()) break;
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
585 lp = lp->parent();
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
586 }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
587 return !lp->def_locals()->test(v);
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
588 }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
589 LocalSet* def_locals() { return _state->def_locals(); }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
590 const LocalSet* def_locals() const { return _state->def_locals(); }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
591
0
a61af66fc99e Initial load
duke
parents:
diff changeset
592 // Get the successors for this Block.
a61af66fc99e Initial load
duke
parents:
diff changeset
593 GrowableArray<Block*>* successors(ciBytecodeStream* str,
a61af66fc99e Initial load
duke
parents:
diff changeset
594 StateVector* state,
a61af66fc99e Initial load
duke
parents:
diff changeset
595 JsrSet* jsrs);
a61af66fc99e Initial load
duke
parents:
diff changeset
596 GrowableArray<Block*>* successors() {
a61af66fc99e Initial load
duke
parents:
diff changeset
597 assert(_successors != NULL, "must be filled in");
a61af66fc99e Initial load
duke
parents:
diff changeset
598 return _successors;
a61af66fc99e Initial load
duke
parents:
diff changeset
599 }
a61af66fc99e Initial load
duke
parents:
diff changeset
600
a61af66fc99e Initial load
duke
parents:
diff changeset
601 // Get the exceptional successors for this Block.
a61af66fc99e Initial load
duke
parents:
diff changeset
602 GrowableArray<Block*>* exceptions() {
a61af66fc99e Initial load
duke
parents:
diff changeset
603 if (_exceptions == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
604 compute_exceptions();
a61af66fc99e Initial load
duke
parents:
diff changeset
605 }
a61af66fc99e Initial load
duke
parents:
diff changeset
606 return _exceptions;
a61af66fc99e Initial load
duke
parents:
diff changeset
607 }
a61af66fc99e Initial load
duke
parents:
diff changeset
608
a61af66fc99e Initial load
duke
parents:
diff changeset
609 // Get the exception klasses corresponding to the
a61af66fc99e Initial load
duke
parents:
diff changeset
610 // exceptional successors for this Block.
a61af66fc99e Initial load
duke
parents:
diff changeset
611 GrowableArray<ciInstanceKlass*>* exc_klasses() {
a61af66fc99e Initial load
duke
parents:
diff changeset
612 if (_exc_klasses == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
613 compute_exceptions();
a61af66fc99e Initial load
duke
parents:
diff changeset
614 }
a61af66fc99e Initial load
duke
parents:
diff changeset
615 return _exc_klasses;
a61af66fc99e Initial load
duke
parents:
diff changeset
616 }
a61af66fc99e Initial load
duke
parents:
diff changeset
617
a61af66fc99e Initial load
duke
parents:
diff changeset
618 // Is this Block compatible with a given JsrSet?
a61af66fc99e Initial load
duke
parents:
diff changeset
619 bool is_compatible_with(JsrSet* other) {
a61af66fc99e Initial load
duke
parents:
diff changeset
620 return _jsrs->is_compatible_with(other);
a61af66fc99e Initial load
duke
parents:
diff changeset
621 }
a61af66fc99e Initial load
duke
parents:
diff changeset
622
a61af66fc99e Initial load
duke
parents:
diff changeset
623 // Copy the value of our state vector into another.
a61af66fc99e Initial load
duke
parents:
diff changeset
624 void copy_state_into(StateVector* copy) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
625 _state->copy_into(copy);
a61af66fc99e Initial load
duke
parents:
diff changeset
626 }
a61af66fc99e Initial load
duke
parents:
diff changeset
627
a61af66fc99e Initial load
duke
parents:
diff changeset
628 // Copy the value of our JsrSet into another
a61af66fc99e Initial load
duke
parents:
diff changeset
629 void copy_jsrs_into(JsrSet* copy) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
630 _jsrs->copy_into(copy);
a61af66fc99e Initial load
duke
parents:
diff changeset
631 }
a61af66fc99e Initial load
duke
parents:
diff changeset
632
a61af66fc99e Initial load
duke
parents:
diff changeset
633 // Meets the start state of this block with another state, destructively
a61af66fc99e Initial load
duke
parents:
diff changeset
634 // modifying this one. Returns true if any modification takes place.
a61af66fc99e Initial load
duke
parents:
diff changeset
635 bool meet(const StateVector* incoming) {
a61af66fc99e Initial load
duke
parents:
diff changeset
636 return state()->meet(incoming);
a61af66fc99e Initial load
duke
parents:
diff changeset
637 }
a61af66fc99e Initial load
duke
parents:
diff changeset
638
a61af66fc99e Initial load
duke
parents:
diff changeset
639 // Ditto, except that the incoming state is coming from an
a61af66fc99e Initial load
duke
parents:
diff changeset
640 // exception path. This means the stack is replaced by the
a61af66fc99e Initial load
duke
parents:
diff changeset
641 // appropriate exception type.
a61af66fc99e Initial load
duke
parents:
diff changeset
642 bool meet_exception(ciInstanceKlass* exc, const StateVector* incoming) {
a61af66fc99e Initial load
duke
parents:
diff changeset
643 return state()->meet_exception(exc, incoming);
a61af66fc99e Initial load
duke
parents:
diff changeset
644 }
a61af66fc99e Initial load
duke
parents:
diff changeset
645
a61af66fc99e Initial load
duke
parents:
diff changeset
646 // Work list manipulation
a61af66fc99e Initial load
duke
parents:
diff changeset
647 void set_next(Block* block) { _next = block; }
a61af66fc99e Initial load
duke
parents:
diff changeset
648 Block* next() const { return _next; }
a61af66fc99e Initial load
duke
parents:
diff changeset
649
a61af66fc99e Initial load
duke
parents:
diff changeset
650 void set_on_work_list(bool c) { _on_work_list = c; }
a61af66fc99e Initial load
duke
parents:
diff changeset
651 bool is_on_work_list() const { return _on_work_list; }
a61af66fc99e Initial load
duke
parents:
diff changeset
652
a61af66fc99e Initial load
duke
parents:
diff changeset
653 bool has_pre_order() const { return _pre_order >= 0; }
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
654 void set_pre_order(int po) { assert(!has_pre_order(), ""); _pre_order = po; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
655 int pre_order() const { assert(has_pre_order(), ""); return _pre_order; }
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
656 void set_next_pre_order() { set_pre_order(outer()->inc_next_pre_order()); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
657 bool is_start() const { return _pre_order == outer()->start_block_num(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
658
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
659 // Reverse post order
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
660 void df_init();
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
661 bool has_post_order() const { return _post_order >= 0; }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
662 void set_post_order(int po) { assert(!has_post_order() && po >= 0, ""); _post_order = po; }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
663 void reset_post_order(int o){ _post_order = o; }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
664 int post_order() const { assert(has_post_order(), ""); return _post_order; }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
665
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
666 bool has_rpo() const { return has_post_order() && outer()->have_block_count(); }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
667 int rpo() const { assert(has_rpo(), ""); return outer()->block_count() - post_order() - 1; }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
668 void set_rpo_next(Block* b) { _rpo_next = b; }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
669 Block* rpo_next() { return _rpo_next; }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
670
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
671 // Loops
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
672 Loop* loop() const { return _loop; }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
673 void set_loop(Loop* lp) { _loop = lp; }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
674 bool is_loop_head() const { return _loop && _loop->head() == this; }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
675 void set_irreducible_entry(bool c) { _irreducible_entry = c; }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
676 bool is_irreducible_entry() const { return _irreducible_entry; }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
677 bool is_visited() const { return has_pre_order(); }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
678 bool is_post_visited() const { return has_post_order(); }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
679 bool is_clonable_exit(Loop* lp);
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
680 Block* looping_succ(Loop* lp); // Successor inside of loop
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
681 bool is_single_entry_loop_head() const {
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
682 if (!is_loop_head()) return false;
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
683 for (Loop* lp = loop(); lp != NULL && lp->head() == this; lp = lp->parent())
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
684 if (lp->is_irreducible()) return false;
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
685 return true;
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
686 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
687
a61af66fc99e Initial load
duke
parents:
diff changeset
688 void print_value_on(outputStream* st) const PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
689 void print_on(outputStream* st) const PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
690 };
a61af66fc99e Initial load
duke
parents:
diff changeset
691
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
692 // Loop
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
693 class Loop : public ResourceObj {
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
694 private:
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
695 Loop* _parent;
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
696 Loop* _sibling; // List of siblings, null terminated
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
697 Loop* _child; // Head of child list threaded thru sibling pointer
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
698 Block* _head; // Head of loop
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
699 Block* _tail; // Tail of loop
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
700 bool _irreducible;
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
701 LocalSet _def_locals;
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
702
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
703 public:
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
704 Loop(Block* head, Block* tail) :
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
705 _head(head), _tail(tail),
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
706 _parent(NULL), _sibling(NULL), _child(NULL),
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
707 _irreducible(false), _def_locals() {}
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
708
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
709 Loop* parent() const { return _parent; }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
710 Loop* sibling() const { return _sibling; }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
711 Loop* child() const { return _child; }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
712 Block* head() const { return _head; }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
713 Block* tail() const { return _tail; }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
714 void set_parent(Loop* p) { _parent = p; }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
715 void set_sibling(Loop* s) { _sibling = s; }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
716 void set_child(Loop* c) { _child = c; }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
717 void set_head(Block* hd) { _head = hd; }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
718 void set_tail(Block* tl) { _tail = tl; }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
719
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
720 int depth() const; // nesting depth
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
721
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
722 // Returns true if lp is a nested loop or us.
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
723 bool contains(Loop* lp) const;
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
724 bool contains(Block* blk) const { return contains(blk->loop()); }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
725
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
726 // Data flow on locals
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
727 LocalSet* def_locals() { return &_def_locals; }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
728 const LocalSet* def_locals() const { return &_def_locals; }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
729
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
730 // Merge the branch lp into this branch, sorting on the loop head
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
731 // pre_orders. Returns the new branch.
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
732 Loop* sorted_merge(Loop* lp);
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
733
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
734 // Mark non-single entry to loop
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
735 void set_irreducible(Block* entry) {
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
736 _irreducible = true;
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
737 entry->set_irreducible_entry(true);
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
738 }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
739 bool is_irreducible() const { return _irreducible; }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
740
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
741 bool is_root() const { return _tail->pre_order() == max_jint; }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
742
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
743 void print(outputStream* st = tty, int indent = 0) const PRODUCT_RETURN;
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
744 };
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
745
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
746 // Postorder iteration over the loop tree.
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
747 class PostorderLoops : public StackObj {
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
748 private:
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
749 Loop* _root;
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
750 Loop* _current;
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
751 public:
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
752 PostorderLoops(Loop* root) : _root(root), _current(root) {
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
753 while (_current->child() != NULL) {
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
754 _current = _current->child();
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
755 }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
756 }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
757 bool done() { return _current == NULL; } // Finished iterating?
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
758 void next(); // Advance to next loop
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
759 Loop* current() { return _current; } // Return current loop.
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
760 };
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
761
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
762 // Preorder iteration over the loop tree.
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
763 class PreorderLoops : public StackObj {
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
764 private:
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
765 Loop* _root;
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
766 Loop* _current;
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
767 public:
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
768 PreorderLoops(Loop* root) : _root(root), _current(root) {}
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
769 bool done() { return _current == NULL; } // Finished iterating?
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
770 void next(); // Advance to next loop
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
771 Loop* current() { return _current; } // Return current loop.
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
772 };
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
773
0
a61af66fc99e Initial load
duke
parents:
diff changeset
774 // Standard indexes of successors, for various bytecodes.
a61af66fc99e Initial load
duke
parents:
diff changeset
775 enum {
a61af66fc99e Initial load
duke
parents:
diff changeset
776 FALL_THROUGH = 0, // normal control
a61af66fc99e Initial load
duke
parents:
diff changeset
777 IF_NOT_TAKEN = 0, // the not-taken branch of an if (i.e., fall-through)
a61af66fc99e Initial load
duke
parents:
diff changeset
778 IF_TAKEN = 1, // the taken branch of an if
a61af66fc99e Initial load
duke
parents:
diff changeset
779 GOTO_TARGET = 0, // unique successor for goto, jsr, or ret
a61af66fc99e Initial load
duke
parents:
diff changeset
780 SWITCH_DEFAULT = 0, // default branch of a switch
a61af66fc99e Initial load
duke
parents:
diff changeset
781 SWITCH_CASES = 1 // first index for any non-default switch branches
a61af66fc99e Initial load
duke
parents:
diff changeset
782 // Unlike in other blocks, the successors of a switch are listed uniquely.
a61af66fc99e Initial load
duke
parents:
diff changeset
783 };
a61af66fc99e Initial load
duke
parents:
diff changeset
784
a61af66fc99e Initial load
duke
parents:
diff changeset
785 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
786 // A mapping from pre_order to Blocks. This array is created
a61af66fc99e Initial load
duke
parents:
diff changeset
787 // only at the end of the flow.
a61af66fc99e Initial load
duke
parents:
diff changeset
788 Block** _block_map;
a61af66fc99e Initial load
duke
parents:
diff changeset
789
a61af66fc99e Initial load
duke
parents:
diff changeset
790 // For each ciBlock index, a list of Blocks which share this ciBlock.
a61af66fc99e Initial load
duke
parents:
diff changeset
791 GrowableArray<Block*>** _idx_to_blocklist;
a61af66fc99e Initial load
duke
parents:
diff changeset
792 // count of ciBlocks
a61af66fc99e Initial load
duke
parents:
diff changeset
793 int _ciblock_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
794
a61af66fc99e Initial load
duke
parents:
diff changeset
795 // Tells if a given instruction is able to generate an exception edge.
a61af66fc99e Initial load
duke
parents:
diff changeset
796 bool can_trap(ciBytecodeStream& str);
a61af66fc99e Initial load
duke
parents:
diff changeset
797
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
798 // Clone the loop heads. Returns true if any cloning occurred.
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
799 bool clone_loop_heads(Loop* lp, StateVector* temp_vector, JsrSet* temp_set);
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
800
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
801 // Clone lp's head and replace tail's successors with clone.
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
802 Block* clone_loop_head(Loop* lp, StateVector* temp_vector, JsrSet* temp_set);
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
803
0
a61af66fc99e Initial load
duke
parents:
diff changeset
804 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
805 // Return the block beginning at bci which has a JsrSet compatible
a61af66fc99e Initial load
duke
parents:
diff changeset
806 // with jsrs.
a61af66fc99e Initial load
duke
parents:
diff changeset
807 Block* block_at(int bci, JsrSet* set, CreateOption option = create_public_copy);
a61af66fc99e Initial load
duke
parents:
diff changeset
808
a61af66fc99e Initial load
duke
parents:
diff changeset
809 // block factory
a61af66fc99e Initial load
duke
parents:
diff changeset
810 Block* get_block_for(int ciBlockIndex, JsrSet* jsrs, CreateOption option = create_public_copy);
a61af66fc99e Initial load
duke
parents:
diff changeset
811
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
812 // How many of the blocks have the backedge_copy bit set?
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
813 int backedge_copy_count(int ciBlockIndex, JsrSet* jsrs) const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
814
a61af66fc99e Initial load
duke
parents:
diff changeset
815 // Return an existing block containing bci which has a JsrSet compatible
a61af66fc99e Initial load
duke
parents:
diff changeset
816 // with jsrs, or NULL if there is none.
a61af66fc99e Initial load
duke
parents:
diff changeset
817 Block* existing_block_at(int bci, JsrSet* set) { return block_at(bci, set, no_create); }
a61af66fc99e Initial load
duke
parents:
diff changeset
818
a61af66fc99e Initial load
duke
parents:
diff changeset
819 // Tell whether the flow analysis has encountered an error of some sort.
a61af66fc99e Initial load
duke
parents:
diff changeset
820 bool failing() { return env()->failing() || _failure_reason != NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
821
a61af66fc99e Initial load
duke
parents:
diff changeset
822 // Reason this compilation is failing, such as "too many basic blocks".
a61af66fc99e Initial load
duke
parents:
diff changeset
823 const char* failure_reason() { return _failure_reason; }
a61af66fc99e Initial load
duke
parents:
diff changeset
824
a61af66fc99e Initial load
duke
parents:
diff changeset
825 // Note a failure.
a61af66fc99e Initial load
duke
parents:
diff changeset
826 void record_failure(const char* reason);
a61af66fc99e Initial load
duke
parents:
diff changeset
827
a61af66fc99e Initial load
duke
parents:
diff changeset
828 // Return the block of a given pre-order number.
a61af66fc99e Initial load
duke
parents:
diff changeset
829 int have_block_count() const { return _block_map != NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
830 int block_count() const { assert(have_block_count(), "");
a61af66fc99e Initial load
duke
parents:
diff changeset
831 return _next_pre_order; }
a61af66fc99e Initial load
duke
parents:
diff changeset
832 Block* pre_order_at(int po) const { assert(0 <= po && po < block_count(), "out of bounds");
a61af66fc99e Initial load
duke
parents:
diff changeset
833 return _block_map[po]; }
a61af66fc99e Initial load
duke
parents:
diff changeset
834 Block* start_block() const { return pre_order_at(start_block_num()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
835 int start_block_num() const { return 0; }
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
836 Block* rpo_at(int rpo) const { assert(0 <= rpo && rpo < block_count(), "out of bounds");
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
837 return _block_map[rpo]; }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
838 int next_pre_order() { return _next_pre_order; }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
839 int inc_next_pre_order() { return _next_pre_order++; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
840
a61af66fc99e Initial load
duke
parents:
diff changeset
841 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
842 // A work list used during flow analysis.
a61af66fc99e Initial load
duke
parents:
diff changeset
843 Block* _work_list;
a61af66fc99e Initial load
duke
parents:
diff changeset
844
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
845 // List of blocks in reverse post order
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
846 Block* _rpo_list;
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
847
0
a61af66fc99e Initial load
duke
parents:
diff changeset
848 // Next Block::_pre_order. After mapping, doubles as block_count.
a61af66fc99e Initial load
duke
parents:
diff changeset
849 int _next_pre_order;
a61af66fc99e Initial load
duke
parents:
diff changeset
850
a61af66fc99e Initial load
duke
parents:
diff changeset
851 // Are there more blocks on the work list?
a61af66fc99e Initial load
duke
parents:
diff changeset
852 bool work_list_empty() { return _work_list == NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
853
a61af66fc99e Initial load
duke
parents:
diff changeset
854 // Get the next basic block from our work list.
a61af66fc99e Initial load
duke
parents:
diff changeset
855 Block* work_list_next();
a61af66fc99e Initial load
duke
parents:
diff changeset
856
a61af66fc99e Initial load
duke
parents:
diff changeset
857 // Add a basic block to our work list.
a61af66fc99e Initial load
duke
parents:
diff changeset
858 void add_to_work_list(Block* block);
a61af66fc99e Initial load
duke
parents:
diff changeset
859
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
860 // Prepend a basic block to rpo list.
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
861 void prepend_to_rpo_list(Block* blk) {
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
862 blk->set_rpo_next(_rpo_list);
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
863 _rpo_list = blk;
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
864 }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
865
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
866 // Root of the loop tree
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
867 Loop* _loop_tree_root;
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
868
0
a61af66fc99e Initial load
duke
parents:
diff changeset
869 // State used for make_jsr_record
a61af66fc99e Initial load
duke
parents:
diff changeset
870 int _jsr_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
871 GrowableArray<JsrRecord*>* _jsr_records;
a61af66fc99e Initial load
duke
parents:
diff changeset
872
a61af66fc99e Initial load
duke
parents:
diff changeset
873 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
874 // Make a JsrRecord for a given (entry, return) pair, if such a record
a61af66fc99e Initial load
duke
parents:
diff changeset
875 // does not already exist.
a61af66fc99e Initial load
duke
parents:
diff changeset
876 JsrRecord* make_jsr_record(int entry_address, int return_address);
a61af66fc99e Initial load
duke
parents:
diff changeset
877
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
878 void set_loop_tree_root(Loop* ltr) { _loop_tree_root = ltr; }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
879 Loop* loop_tree_root() { return _loop_tree_root; }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
880
0
a61af66fc99e Initial load
duke
parents:
diff changeset
881 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
882 // Get the initial state for start_bci:
a61af66fc99e Initial load
duke
parents:
diff changeset
883 const StateVector* get_start_state();
a61af66fc99e Initial load
duke
parents:
diff changeset
884
a61af66fc99e Initial load
duke
parents:
diff changeset
885 // Merge the current state into all exceptional successors at the
a61af66fc99e Initial load
duke
parents:
diff changeset
886 // current point in the code.
a61af66fc99e Initial load
duke
parents:
diff changeset
887 void flow_exceptions(GrowableArray<Block*>* exceptions,
a61af66fc99e Initial load
duke
parents:
diff changeset
888 GrowableArray<ciInstanceKlass*>* exc_klasses,
a61af66fc99e Initial load
duke
parents:
diff changeset
889 StateVector* state);
a61af66fc99e Initial load
duke
parents:
diff changeset
890
a61af66fc99e Initial load
duke
parents:
diff changeset
891 // Merge the current state into all successors at the current point
a61af66fc99e Initial load
duke
parents:
diff changeset
892 // in the code.
a61af66fc99e Initial load
duke
parents:
diff changeset
893 void flow_successors(GrowableArray<Block*>* successors,
a61af66fc99e Initial load
duke
parents:
diff changeset
894 StateVector* state);
a61af66fc99e Initial load
duke
parents:
diff changeset
895
a61af66fc99e Initial load
duke
parents:
diff changeset
896 // Interpret the effects of the bytecodes on the incoming state
a61af66fc99e Initial load
duke
parents:
diff changeset
897 // vector of a basic block. Push the changed state to succeeding
a61af66fc99e Initial load
duke
parents:
diff changeset
898 // basic blocks.
a61af66fc99e Initial load
duke
parents:
diff changeset
899 void flow_block(Block* block,
a61af66fc99e Initial load
duke
parents:
diff changeset
900 StateVector* scratch_state,
a61af66fc99e Initial load
duke
parents:
diff changeset
901 JsrSet* scratch_jsrs);
a61af66fc99e Initial load
duke
parents:
diff changeset
902
a61af66fc99e Initial load
duke
parents:
diff changeset
903 // Perform the type flow analysis, creating and cloning Blocks as
a61af66fc99e Initial load
duke
parents:
diff changeset
904 // necessary.
a61af66fc99e Initial load
duke
parents:
diff changeset
905 void flow_types();
a61af66fc99e Initial load
duke
parents:
diff changeset
906
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
907 // Perform the depth first type flow analysis. Helper for flow_types.
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
908 void df_flow_types(Block* start,
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
909 bool do_flow,
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
910 StateVector* temp_vector,
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
911 JsrSet* temp_set);
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
912
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
913 // Incrementally build loop tree.
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
914 void build_loop_tree(Block* blk);
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
915
0
a61af66fc99e Initial load
duke
parents:
diff changeset
916 // Create the block map, which indexes blocks in pre_order.
a61af66fc99e Initial load
duke
parents:
diff changeset
917 void map_blocks();
a61af66fc99e Initial load
duke
parents:
diff changeset
918
a61af66fc99e Initial load
duke
parents:
diff changeset
919 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
920 // Perform type inference flow analysis.
a61af66fc99e Initial load
duke
parents:
diff changeset
921 void do_flow();
a61af66fc99e Initial load
duke
parents:
diff changeset
922
a61af66fc99e Initial load
duke
parents:
diff changeset
923 void print_on(outputStream* st) const PRODUCT_RETURN;
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
924
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 303
diff changeset
925 void rpo_print_on(outputStream* st) const PRODUCT_RETURN;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
926 };