annotate src/share/vm/ci/ciTypeFlow.hpp @ 2007:5ddfcf4b079e

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