annotate src/share/vm/c1/c1_GraphBuilder.hpp @ 20543:e7d0505c8a30

8059758: Footprint regressions with JDK-8038423 Summary: Changes in JDK-8038423 always initialize (zero out) virtual memory used for auxiliary data structures. This causes a footprint regression for G1 in startup benchmarks. This is because they do not touch that memory at all, so the operating system does not actually commit these pages. The fix is to, if the initialization value of the data structures matches the default value of just committed memory (=0), do not do anything. Reviewed-by: jwilhelm, brutisso
author tschatzl
date Fri, 10 Oct 2014 15:51:58 +0200
parents 45e59fae8f2b
children 52b4284cb496
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
17467
55fb97c4c58d 8029233: Update copyright year to match last edit in jdk8 hotspot repository for 2013
mikael
parents: 12962
diff changeset
2 * Copyright (c) 1999, 2013, 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: 470
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 470
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: 470
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: 1825
diff changeset
25 #ifndef SHARE_VM_C1_C1_GRAPHBUILDER_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1825
diff changeset
26 #define SHARE_VM_C1_C1_GRAPHBUILDER_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1825
diff changeset
27
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1825
diff changeset
28 #include "c1/c1_IR.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1825
diff changeset
29 #include "c1/c1_Instruction.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1825
diff changeset
30 #include "c1/c1_ValueMap.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1825
diff changeset
31 #include "c1/c1_ValueStack.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1825
diff changeset
32 #include "ci/ciMethodData.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1825
diff changeset
33 #include "ci/ciStreams.hpp"
6843
c3e799c37717 7177003: C1: LogCompilation support
vlivanov
parents: 6795
diff changeset
34 #include "compiler/compileLog.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1825
diff changeset
35
0
a61af66fc99e Initial load
duke
parents:
diff changeset
36 class MemoryBuffer;
a61af66fc99e Initial load
duke
parents:
diff changeset
37
a61af66fc99e Initial load
duke
parents:
diff changeset
38 class GraphBuilder VALUE_OBJ_CLASS_SPEC {
a61af66fc99e Initial load
duke
parents:
diff changeset
39 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
40 // Per-scope data. These are pushed and popped as we descend into
a61af66fc99e Initial load
duke
parents:
diff changeset
41 // inlined methods. Currently in order to generate good code in the
a61af66fc99e Initial load
duke
parents:
diff changeset
42 // inliner we have to attempt to inline methods directly into the
a61af66fc99e Initial load
duke
parents:
diff changeset
43 // basic block we are parsing; this adds complexity.
a61af66fc99e Initial load
duke
parents:
diff changeset
44 class ScopeData: public CompilationResourceObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
45 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
46 ScopeData* _parent;
a61af66fc99e Initial load
duke
parents:
diff changeset
47 // bci-to-block mapping
a61af66fc99e Initial load
duke
parents:
diff changeset
48 BlockList* _bci2block;
a61af66fc99e Initial load
duke
parents:
diff changeset
49 // Scope
a61af66fc99e Initial load
duke
parents:
diff changeset
50 IRScope* _scope;
a61af66fc99e Initial load
duke
parents:
diff changeset
51 // Whether this scope or any parent scope has exception handlers
a61af66fc99e Initial load
duke
parents:
diff changeset
52 bool _has_handler;
a61af66fc99e Initial load
duke
parents:
diff changeset
53 // The bytecodes
a61af66fc99e Initial load
duke
parents:
diff changeset
54 ciBytecodeStream* _stream;
a61af66fc99e Initial load
duke
parents:
diff changeset
55
a61af66fc99e Initial load
duke
parents:
diff changeset
56 // Work list
a61af66fc99e Initial load
duke
parents:
diff changeset
57 BlockList* _work_list;
a61af66fc99e Initial load
duke
parents:
diff changeset
58
a61af66fc99e Initial load
duke
parents:
diff changeset
59 // Maximum inline size for this scope
a61af66fc99e Initial load
duke
parents:
diff changeset
60 intx _max_inline_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
61 // Expression stack depth at point where inline occurred
a61af66fc99e Initial load
duke
parents:
diff changeset
62 int _caller_stack_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
63
a61af66fc99e Initial load
duke
parents:
diff changeset
64 // The continuation point for the inline. Currently only used in
a61af66fc99e Initial load
duke
parents:
diff changeset
65 // multi-block inlines, but eventually would like to use this for
a61af66fc99e Initial load
duke
parents:
diff changeset
66 // all inlines for uniformity and simplicity; in this case would
a61af66fc99e Initial load
duke
parents:
diff changeset
67 // get the continuation point from the BlockList instead of
a61af66fc99e Initial load
duke
parents:
diff changeset
68 // fabricating it anew because Invokes would be considered to be
a61af66fc99e Initial load
duke
parents:
diff changeset
69 // BlockEnds.
a61af66fc99e Initial load
duke
parents:
diff changeset
70 BlockBegin* _continuation;
a61af66fc99e Initial load
duke
parents:
diff changeset
71
a61af66fc99e Initial load
duke
parents:
diff changeset
72 // Was this ScopeData created only for the parsing and inlining of
a61af66fc99e Initial load
duke
parents:
diff changeset
73 // a jsr?
a61af66fc99e Initial load
duke
parents:
diff changeset
74 bool _parsing_jsr;
a61af66fc99e Initial load
duke
parents:
diff changeset
75 // We track the destination bci of the jsr only to determine
a61af66fc99e Initial load
duke
parents:
diff changeset
76 // bailout conditions, since we only handle a subset of all of the
a61af66fc99e Initial load
duke
parents:
diff changeset
77 // possible jsr-ret control structures. Recursive invocations of a
a61af66fc99e Initial load
duke
parents:
diff changeset
78 // jsr are disallowed by the verifier.
a61af66fc99e Initial load
duke
parents:
diff changeset
79 int _jsr_entry_bci;
a61af66fc99e Initial load
duke
parents:
diff changeset
80 // We need to track the local variable in which the return address
a61af66fc99e Initial load
duke
parents:
diff changeset
81 // was stored to ensure we can handle inlining the jsr, because we
a61af66fc99e Initial load
duke
parents:
diff changeset
82 // don't handle arbitrary jsr/ret constructs.
a61af66fc99e Initial load
duke
parents:
diff changeset
83 int _jsr_ret_addr_local;
a61af66fc99e Initial load
duke
parents:
diff changeset
84 // If we are parsing a jsr, the continuation point for rets
a61af66fc99e Initial load
duke
parents:
diff changeset
85 BlockBegin* _jsr_continuation;
a61af66fc99e Initial load
duke
parents:
diff changeset
86 // Cloned XHandlers for jsr-related ScopeDatas
a61af66fc99e Initial load
duke
parents:
diff changeset
87 XHandlers* _jsr_xhandlers;
a61af66fc99e Initial load
duke
parents:
diff changeset
88
a61af66fc99e Initial load
duke
parents:
diff changeset
89 // Number of returns seen in this scope
a61af66fc99e Initial load
duke
parents:
diff changeset
90 int _num_returns;
a61af66fc99e Initial load
duke
parents:
diff changeset
91
a61af66fc99e Initial load
duke
parents:
diff changeset
92 // In order to generate profitable code for inlining, we currently
a61af66fc99e Initial load
duke
parents:
diff changeset
93 // have to perform an optimization for single-block inlined
a61af66fc99e Initial load
duke
parents:
diff changeset
94 // methods where we continue parsing into the same block. This
a61af66fc99e Initial load
duke
parents:
diff changeset
95 // allows us to perform CSE across inlined scopes and to avoid
a61af66fc99e Initial load
duke
parents:
diff changeset
96 // storing parameters to the stack. Having a global register
a61af66fc99e Initial load
duke
parents:
diff changeset
97 // allocator and being able to perform global CSE would allow this
a61af66fc99e Initial load
duke
parents:
diff changeset
98 // code to be removed and thereby simplify the inliner.
a61af66fc99e Initial load
duke
parents:
diff changeset
99 BlockBegin* _cleanup_block; // The block to which the return was added
a61af66fc99e Initial load
duke
parents:
diff changeset
100 Instruction* _cleanup_return_prev; // Instruction before return instruction
a61af66fc99e Initial load
duke
parents:
diff changeset
101 ValueStack* _cleanup_state; // State of that block (not yet pinned)
a61af66fc99e Initial load
duke
parents:
diff changeset
102
a61af66fc99e Initial load
duke
parents:
diff changeset
103 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
104 ScopeData(ScopeData* parent);
a61af66fc99e Initial load
duke
parents:
diff changeset
105
a61af66fc99e Initial load
duke
parents:
diff changeset
106 ScopeData* parent() const { return _parent; }
a61af66fc99e Initial load
duke
parents:
diff changeset
107
a61af66fc99e Initial load
duke
parents:
diff changeset
108 BlockList* bci2block() const { return _bci2block; }
a61af66fc99e Initial load
duke
parents:
diff changeset
109 void set_bci2block(BlockList* bci2block) { _bci2block = bci2block; }
a61af66fc99e Initial load
duke
parents:
diff changeset
110
a61af66fc99e Initial load
duke
parents:
diff changeset
111 // NOTE: this has a different effect when parsing jsrs
a61af66fc99e Initial load
duke
parents:
diff changeset
112 BlockBegin* block_at(int bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
113
a61af66fc99e Initial load
duke
parents:
diff changeset
114 IRScope* scope() const { return _scope; }
a61af66fc99e Initial load
duke
parents:
diff changeset
115 // Has side-effect of setting has_handler flag
a61af66fc99e Initial load
duke
parents:
diff changeset
116 void set_scope(IRScope* scope);
a61af66fc99e Initial load
duke
parents:
diff changeset
117
a61af66fc99e Initial load
duke
parents:
diff changeset
118 // Whether this or any parent scope has exception handlers
a61af66fc99e Initial load
duke
parents:
diff changeset
119 bool has_handler() const { return _has_handler; }
a61af66fc99e Initial load
duke
parents:
diff changeset
120 void set_has_handler() { _has_handler = true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
121
a61af66fc99e Initial load
duke
parents:
diff changeset
122 // Exception handlers list to be used for this scope
a61af66fc99e Initial load
duke
parents:
diff changeset
123 XHandlers* xhandlers() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
124
a61af66fc99e Initial load
duke
parents:
diff changeset
125 // How to get a block to be parsed
a61af66fc99e Initial load
duke
parents:
diff changeset
126 void add_to_work_list(BlockBegin* block);
a61af66fc99e Initial load
duke
parents:
diff changeset
127 // How to remove the next block to be parsed; returns NULL if none left
a61af66fc99e Initial load
duke
parents:
diff changeset
128 BlockBegin* remove_from_work_list();
a61af66fc99e Initial load
duke
parents:
diff changeset
129 // Indicates parse is over
a61af66fc99e Initial load
duke
parents:
diff changeset
130 bool is_work_list_empty() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
131
a61af66fc99e Initial load
duke
parents:
diff changeset
132 ciBytecodeStream* stream() { return _stream; }
a61af66fc99e Initial load
duke
parents:
diff changeset
133 void set_stream(ciBytecodeStream* stream) { _stream = stream; }
a61af66fc99e Initial load
duke
parents:
diff changeset
134
a61af66fc99e Initial load
duke
parents:
diff changeset
135 intx max_inline_size() const { return _max_inline_size; }
a61af66fc99e Initial load
duke
parents:
diff changeset
136
a61af66fc99e Initial load
duke
parents:
diff changeset
137 BlockBegin* continuation() const { return _continuation; }
a61af66fc99e Initial load
duke
parents:
diff changeset
138 void set_continuation(BlockBegin* cont) { _continuation = cont; }
a61af66fc99e Initial load
duke
parents:
diff changeset
139
a61af66fc99e Initial load
duke
parents:
diff changeset
140 // Indicates whether this ScopeData was pushed only for the
a61af66fc99e Initial load
duke
parents:
diff changeset
141 // parsing and inlining of a jsr
a61af66fc99e Initial load
duke
parents:
diff changeset
142 bool parsing_jsr() const { return _parsing_jsr; }
a61af66fc99e Initial load
duke
parents:
diff changeset
143 void set_parsing_jsr() { _parsing_jsr = true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
144 int jsr_entry_bci() const { return _jsr_entry_bci; }
a61af66fc99e Initial load
duke
parents:
diff changeset
145 void set_jsr_entry_bci(int bci) { _jsr_entry_bci = bci; }
a61af66fc99e Initial load
duke
parents:
diff changeset
146 void set_jsr_return_address_local(int local_no){ _jsr_ret_addr_local = local_no; }
a61af66fc99e Initial load
duke
parents:
diff changeset
147 int jsr_return_address_local() const { return _jsr_ret_addr_local; }
a61af66fc99e Initial load
duke
parents:
diff changeset
148 // Must be called after scope is set up for jsr ScopeData
a61af66fc99e Initial load
duke
parents:
diff changeset
149 void setup_jsr_xhandlers();
a61af66fc99e Initial load
duke
parents:
diff changeset
150
a61af66fc99e Initial load
duke
parents:
diff changeset
151 // The jsr continuation is only used when parsing_jsr is true, and
a61af66fc99e Initial load
duke
parents:
diff changeset
152 // is different from the "normal" continuation since we can end up
a61af66fc99e Initial load
duke
parents:
diff changeset
153 // doing a return (rather than a ret) from within a subroutine
a61af66fc99e Initial load
duke
parents:
diff changeset
154 BlockBegin* jsr_continuation() const { return _jsr_continuation; }
a61af66fc99e Initial load
duke
parents:
diff changeset
155 void set_jsr_continuation(BlockBegin* cont) { _jsr_continuation = cont; }
a61af66fc99e Initial load
duke
parents:
diff changeset
156
a61af66fc99e Initial load
duke
parents:
diff changeset
157 int num_returns();
a61af66fc99e Initial load
duke
parents:
diff changeset
158 void incr_num_returns();
a61af66fc99e Initial load
duke
parents:
diff changeset
159
a61af66fc99e Initial load
duke
parents:
diff changeset
160 void set_inline_cleanup_info(BlockBegin* block,
a61af66fc99e Initial load
duke
parents:
diff changeset
161 Instruction* return_prev,
a61af66fc99e Initial load
duke
parents:
diff changeset
162 ValueStack* return_state);
a61af66fc99e Initial load
duke
parents:
diff changeset
163 BlockBegin* inline_cleanup_block() const { return _cleanup_block; }
a61af66fc99e Initial load
duke
parents:
diff changeset
164 Instruction* inline_cleanup_return_prev() const{ return _cleanup_return_prev; }
a61af66fc99e Initial load
duke
parents:
diff changeset
165 ValueStack* inline_cleanup_state() const { return _cleanup_state; }
a61af66fc99e Initial load
duke
parents:
diff changeset
166 };
a61af66fc99e Initial load
duke
parents:
diff changeset
167
a61af66fc99e Initial load
duke
parents:
diff changeset
168 // for all GraphBuilders
a61af66fc99e Initial load
duke
parents:
diff changeset
169 static bool _can_trap[Bytecodes::number_of_java_codes];
a61af66fc99e Initial load
duke
parents:
diff changeset
170
a61af66fc99e Initial load
duke
parents:
diff changeset
171 // for each instance of GraphBuilder
a61af66fc99e Initial load
duke
parents:
diff changeset
172 ScopeData* _scope_data; // Per-scope data; used for inlining
a61af66fc99e Initial load
duke
parents:
diff changeset
173 Compilation* _compilation; // the current compilation
a61af66fc99e Initial load
duke
parents:
diff changeset
174 ValueMap* _vmap; // the map of values encountered (for CSE)
a61af66fc99e Initial load
duke
parents:
diff changeset
175 MemoryBuffer* _memory;
a61af66fc99e Initial load
duke
parents:
diff changeset
176 const char* _inline_bailout_msg; // non-null if most recent inline attempt failed
a61af66fc99e Initial load
duke
parents:
diff changeset
177 int _instruction_count; // for bailing out in pathological jsr/ret cases
a61af66fc99e Initial load
duke
parents:
diff changeset
178 BlockBegin* _start; // the start block
a61af66fc99e Initial load
duke
parents:
diff changeset
179 BlockBegin* _osr_entry; // the osr entry block block
a61af66fc99e Initial load
duke
parents:
diff changeset
180 ValueStack* _initial_state; // The state for the start block
a61af66fc99e Initial load
duke
parents:
diff changeset
181
a61af66fc99e Initial load
duke
parents:
diff changeset
182 // for each call to connect_to_end; can also be set by inliner
a61af66fc99e Initial load
duke
parents:
diff changeset
183 BlockBegin* _block; // the current block
a61af66fc99e Initial load
duke
parents:
diff changeset
184 ValueStack* _state; // the current execution state
a61af66fc99e Initial load
duke
parents:
diff changeset
185 Instruction* _last; // the last instruction added
a61af66fc99e Initial load
duke
parents:
diff changeset
186 bool _skip_block; // skip processing of the rest of this block
a61af66fc99e Initial load
duke
parents:
diff changeset
187
a61af66fc99e Initial load
duke
parents:
diff changeset
188 // accessors
a61af66fc99e Initial load
duke
parents:
diff changeset
189 ScopeData* scope_data() const { return _scope_data; }
a61af66fc99e Initial load
duke
parents:
diff changeset
190 Compilation* compilation() const { return _compilation; }
a61af66fc99e Initial load
duke
parents:
diff changeset
191 BlockList* bci2block() const { return scope_data()->bci2block(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
192 ValueMap* vmap() const { assert(UseLocalValueNumbering, "should not access otherwise"); return _vmap; }
a61af66fc99e Initial load
duke
parents:
diff changeset
193 bool has_handler() const { return scope_data()->has_handler(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
194
a61af66fc99e Initial load
duke
parents:
diff changeset
195 BlockBegin* block() const { return _block; }
a61af66fc99e Initial load
duke
parents:
diff changeset
196 ValueStack* state() const { return _state; }
a61af66fc99e Initial load
duke
parents:
diff changeset
197 void set_state(ValueStack* state) { _state = state; }
a61af66fc99e Initial load
duke
parents:
diff changeset
198 IRScope* scope() const { return scope_data()->scope(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
199 ciMethod* method() const { return scope()->method(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
200 ciBytecodeStream* stream() const { return scope_data()->stream(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
201 Instruction* last() const { return _last; }
a61af66fc99e Initial load
duke
parents:
diff changeset
202 Bytecodes::Code code() const { return stream()->cur_bc(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
203 int bci() const { return stream()->cur_bci(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
204 int next_bci() const { return stream()->next_bci(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
205
a61af66fc99e Initial load
duke
parents:
diff changeset
206 // unified bailout support
a61af66fc99e Initial load
duke
parents:
diff changeset
207 void bailout(const char* msg) const { compilation()->bailout(msg); }
a61af66fc99e Initial load
duke
parents:
diff changeset
208 bool bailed_out() const { return compilation()->bailed_out(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
209
a61af66fc99e Initial load
duke
parents:
diff changeset
210 // stack manipulation helpers
a61af66fc99e Initial load
duke
parents:
diff changeset
211 void ipush(Value t) const { state()->ipush(t); }
a61af66fc99e Initial load
duke
parents:
diff changeset
212 void lpush(Value t) const { state()->lpush(t); }
a61af66fc99e Initial load
duke
parents:
diff changeset
213 void fpush(Value t) const { state()->fpush(t); }
a61af66fc99e Initial load
duke
parents:
diff changeset
214 void dpush(Value t) const { state()->dpush(t); }
a61af66fc99e Initial load
duke
parents:
diff changeset
215 void apush(Value t) const { state()->apush(t); }
a61af66fc99e Initial load
duke
parents:
diff changeset
216 void push(ValueType* type, Value t) const { state()-> push(type, t); }
a61af66fc99e Initial load
duke
parents:
diff changeset
217
a61af66fc99e Initial load
duke
parents:
diff changeset
218 Value ipop() { return state()->ipop(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
219 Value lpop() { return state()->lpop(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
220 Value fpop() { return state()->fpop(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
221 Value dpop() { return state()->dpop(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
222 Value apop() { return state()->apop(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
223 Value pop(ValueType* type) { return state()-> pop(type); }
a61af66fc99e Initial load
duke
parents:
diff changeset
224
a61af66fc99e Initial load
duke
parents:
diff changeset
225 // instruction helpers
a61af66fc99e Initial load
duke
parents:
diff changeset
226 void load_constant();
a61af66fc99e Initial load
duke
parents:
diff changeset
227 void load_local(ValueType* type, int index);
a61af66fc99e Initial load
duke
parents:
diff changeset
228 void store_local(ValueType* type, int index);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4871
diff changeset
229 void store_local(ValueStack* state, Value value, int index);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
230 void load_indexed (BasicType type);
a61af66fc99e Initial load
duke
parents:
diff changeset
231 void store_indexed(BasicType type);
a61af66fc99e Initial load
duke
parents:
diff changeset
232 void stack_op(Bytecodes::Code code);
1819
f02a8bbe6ed4 6986046: C1 valuestack cleanup
roland
parents: 1783
diff changeset
233 void arithmetic_op(ValueType* type, Bytecodes::Code code, ValueStack* state_before = NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
234 void negate_op(ValueType* type);
a61af66fc99e Initial load
duke
parents:
diff changeset
235 void shift_op(ValueType* type, Bytecodes::Code code);
a61af66fc99e Initial load
duke
parents:
diff changeset
236 void logic_op(ValueType* type, Bytecodes::Code code);
a61af66fc99e Initial load
duke
parents:
diff changeset
237 void compare_op(ValueType* type, Bytecodes::Code code);
a61af66fc99e Initial load
duke
parents:
diff changeset
238 void convert(Bytecodes::Code op, BasicType from, BasicType to);
a61af66fc99e Initial load
duke
parents:
diff changeset
239 void increment();
a61af66fc99e Initial load
duke
parents:
diff changeset
240 void _goto(int from_bci, int to_bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
241 void if_node(Value x, If::Condition cond, Value y, ValueStack* stack_before);
a61af66fc99e Initial load
duke
parents:
diff changeset
242 void if_zero(ValueType* type, If::Condition cond);
a61af66fc99e Initial load
duke
parents:
diff changeset
243 void if_null(ValueType* type, If::Condition cond);
a61af66fc99e Initial load
duke
parents:
diff changeset
244 void if_same(ValueType* type, If::Condition cond);
a61af66fc99e Initial load
duke
parents:
diff changeset
245 void jsr(int dest);
a61af66fc99e Initial load
duke
parents:
diff changeset
246 void ret(int local_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
247 void table_switch();
a61af66fc99e Initial load
duke
parents:
diff changeset
248 void lookup_switch();
a61af66fc99e Initial load
duke
parents:
diff changeset
249 void method_return(Value x);
a61af66fc99e Initial load
duke
parents:
diff changeset
250 void call_register_finalizer();
a61af66fc99e Initial load
duke
parents:
diff changeset
251 void access_field(Bytecodes::Code code);
a61af66fc99e Initial load
duke
parents:
diff changeset
252 void invoke(Bytecodes::Code code);
a61af66fc99e Initial load
duke
parents:
diff changeset
253 void new_instance(int klass_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
254 void new_type_array();
a61af66fc99e Initial load
duke
parents:
diff changeset
255 void new_object_array();
a61af66fc99e Initial load
duke
parents:
diff changeset
256 void check_cast(int klass_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
257 void instance_of(int klass_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
258 void monitorenter(Value x, int bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
259 void monitorexit(Value x, int bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
260 void new_multi_array(int dimensions);
a61af66fc99e Initial load
duke
parents:
diff changeset
261 void throw_op(int bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
262 Value round_fp(Value fp_value);
a61af66fc99e Initial load
duke
parents:
diff changeset
263
a61af66fc99e Initial load
duke
parents:
diff changeset
264 // stack/code manipulation helpers
a61af66fc99e Initial load
duke
parents:
diff changeset
265 Instruction* append_with_bci(Instruction* instr, int bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
266 Instruction* append(Instruction* instr);
a61af66fc99e Initial load
duke
parents:
diff changeset
267 Instruction* append_split(StateSplit* instr);
a61af66fc99e Initial load
duke
parents:
diff changeset
268
a61af66fc99e Initial load
duke
parents:
diff changeset
269 // other helpers
a61af66fc99e Initial load
duke
parents:
diff changeset
270 BlockBegin* block_at(int bci) { return scope_data()->block_at(bci); }
1819
f02a8bbe6ed4 6986046: C1 valuestack cleanup
roland
parents: 1783
diff changeset
271 XHandlers* handle_exception(Instruction* instruction);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
272 void connect_to_end(BlockBegin* beg);
a61af66fc99e Initial load
duke
parents:
diff changeset
273 void null_check(Value value);
a61af66fc99e Initial load
duke
parents:
diff changeset
274 void eliminate_redundant_phis(BlockBegin* start);
a61af66fc99e Initial load
duke
parents:
diff changeset
275 BlockEnd* iterate_bytecodes_for_block(int bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
276 void iterate_all_blocks(bool start_in_current_block_for_inlining = false);
a61af66fc99e Initial load
duke
parents:
diff changeset
277 Dependencies* dependency_recorder() const; // = compilation()->dependencies()
a61af66fc99e Initial load
duke
parents:
diff changeset
278 bool direct_compare(ciKlass* k);
a61af66fc99e Initial load
duke
parents:
diff changeset
279
a61af66fc99e Initial load
duke
parents:
diff changeset
280 void kill_all();
a61af66fc99e Initial load
duke
parents:
diff changeset
281
1819
f02a8bbe6ed4 6986046: C1 valuestack cleanup
roland
parents: 1783
diff changeset
282 // use of state copy routines (try to minimize unnecessary state
f02a8bbe6ed4 6986046: C1 valuestack cleanup
roland
parents: 1783
diff changeset
283 // object allocations):
f02a8bbe6ed4 6986046: C1 valuestack cleanup
roland
parents: 1783
diff changeset
284
f02a8bbe6ed4 6986046: C1 valuestack cleanup
roland
parents: 1783
diff changeset
285 // - if the instruction unconditionally needs a full copy of the
f02a8bbe6ed4 6986046: C1 valuestack cleanup
roland
parents: 1783
diff changeset
286 // state (for patching for example), then use copy_state_before*
f02a8bbe6ed4 6986046: C1 valuestack cleanup
roland
parents: 1783
diff changeset
287
f02a8bbe6ed4 6986046: C1 valuestack cleanup
roland
parents: 1783
diff changeset
288 // - if the instruction needs a full copy of the state only for
f02a8bbe6ed4 6986046: C1 valuestack cleanup
roland
parents: 1783
diff changeset
289 // handler generation (Instruction::needs_exception_state() returns
f02a8bbe6ed4 6986046: C1 valuestack cleanup
roland
parents: 1783
diff changeset
290 // false) then use copy_state_exhandling*
f02a8bbe6ed4 6986046: C1 valuestack cleanup
roland
parents: 1783
diff changeset
291
f02a8bbe6ed4 6986046: C1 valuestack cleanup
roland
parents: 1783
diff changeset
292 // - if the instruction needs either a full copy of the state for
f02a8bbe6ed4 6986046: C1 valuestack cleanup
roland
parents: 1783
diff changeset
293 // handler generation and a least a minimal copy of the state (as
f02a8bbe6ed4 6986046: C1 valuestack cleanup
roland
parents: 1783
diff changeset
294 // returned by Instruction::exception_state()) for debug info
f02a8bbe6ed4 6986046: C1 valuestack cleanup
roland
parents: 1783
diff changeset
295 // generation (that is when Instruction::needs_exception_state()
f02a8bbe6ed4 6986046: C1 valuestack cleanup
roland
parents: 1783
diff changeset
296 // returns true) then use copy_state_for_exception*
f02a8bbe6ed4 6986046: C1 valuestack cleanup
roland
parents: 1783
diff changeset
297
f02a8bbe6ed4 6986046: C1 valuestack cleanup
roland
parents: 1783
diff changeset
298 ValueStack* copy_state_before_with_bci(int bci);
f02a8bbe6ed4 6986046: C1 valuestack cleanup
roland
parents: 1783
diff changeset
299 ValueStack* copy_state_before();
f02a8bbe6ed4 6986046: C1 valuestack cleanup
roland
parents: 1783
diff changeset
300 ValueStack* copy_state_exhandling_with_bci(int bci);
f02a8bbe6ed4 6986046: C1 valuestack cleanup
roland
parents: 1783
diff changeset
301 ValueStack* copy_state_exhandling();
f02a8bbe6ed4 6986046: C1 valuestack cleanup
roland
parents: 1783
diff changeset
302 ValueStack* copy_state_for_exception_with_bci(int bci);
f02a8bbe6ed4 6986046: C1 valuestack cleanup
roland
parents: 1783
diff changeset
303 ValueStack* copy_state_for_exception();
8860
46f6f063b272 7153771: array bound check elimination for c1
roland
parents: 6853
diff changeset
304 ValueStack* copy_state_if_bb(bool is_bb) { return (is_bb || compilation()->is_optimistic()) ? copy_state_before() : NULL; }
46f6f063b272 7153771: array bound check elimination for c1
roland
parents: 6853
diff changeset
305 ValueStack* copy_state_indexed_access() { return compilation()->is_optimistic() ? copy_state_before() : copy_state_for_exception(); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
306
a61af66fc99e Initial load
duke
parents:
diff changeset
307 //
a61af66fc99e Initial load
duke
parents:
diff changeset
308 // Inlining support
a61af66fc99e Initial load
duke
parents:
diff changeset
309 //
a61af66fc99e Initial load
duke
parents:
diff changeset
310
a61af66fc99e Initial load
duke
parents:
diff changeset
311 // accessors
a61af66fc99e Initial load
duke
parents:
diff changeset
312 bool parsing_jsr() const { return scope_data()->parsing_jsr(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
313 BlockBegin* continuation() const { return scope_data()->continuation(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
314 BlockBegin* jsr_continuation() const { return scope_data()->jsr_continuation(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
315 void set_continuation(BlockBegin* continuation) { scope_data()->set_continuation(continuation); }
a61af66fc99e Initial load
duke
parents:
diff changeset
316 void set_inline_cleanup_info(BlockBegin* block,
a61af66fc99e Initial load
duke
parents:
diff changeset
317 Instruction* return_prev,
a61af66fc99e Initial load
duke
parents:
diff changeset
318 ValueStack* return_state) { scope_data()->set_inline_cleanup_info(block,
a61af66fc99e Initial load
duke
parents:
diff changeset
319 return_prev,
a61af66fc99e Initial load
duke
parents:
diff changeset
320 return_state); }
3900
a32de5085326 7079673: JSR 292: C1 should inline bytecoded method handle adapters
twisti
parents: 1972
diff changeset
321 void set_inline_cleanup_info() {
a32de5085326 7079673: JSR 292: C1 should inline bytecoded method handle adapters
twisti
parents: 1972
diff changeset
322 set_inline_cleanup_info(_block, _last, _state);
a32de5085326 7079673: JSR 292: C1 should inline bytecoded method handle adapters
twisti
parents: 1972
diff changeset
323 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
324 BlockBegin* inline_cleanup_block() const { return scope_data()->inline_cleanup_block(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
325 Instruction* inline_cleanup_return_prev() const { return scope_data()->inline_cleanup_return_prev(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
326 ValueStack* inline_cleanup_state() const { return scope_data()->inline_cleanup_state(); }
3900
a32de5085326 7079673: JSR 292: C1 should inline bytecoded method handle adapters
twisti
parents: 1972
diff changeset
327 void restore_inline_cleanup_info() {
a32de5085326 7079673: JSR 292: C1 should inline bytecoded method handle adapters
twisti
parents: 1972
diff changeset
328 _block = inline_cleanup_block();
a32de5085326 7079673: JSR 292: C1 should inline bytecoded method handle adapters
twisti
parents: 1972
diff changeset
329 _last = inline_cleanup_return_prev();
a32de5085326 7079673: JSR 292: C1 should inline bytecoded method handle adapters
twisti
parents: 1972
diff changeset
330 _state = inline_cleanup_state();
a32de5085326 7079673: JSR 292: C1 should inline bytecoded method handle adapters
twisti
parents: 1972
diff changeset
331 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
332 void incr_num_returns() { scope_data()->incr_num_returns(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
333 int num_returns() const { return scope_data()->num_returns(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
334 intx max_inline_size() const { return scope_data()->max_inline_size(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
335 int inline_level() const { return scope()->level(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
336 int recursive_inline_level(ciMethod* callee) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
337
a61af66fc99e Initial load
duke
parents:
diff changeset
338 // inlining of synchronized methods
a61af66fc99e Initial load
duke
parents:
diff changeset
339 void inline_sync_entry(Value lock, BlockBegin* sync_handler);
a61af66fc99e Initial load
duke
parents:
diff changeset
340 void fill_sync_handler(Value lock, BlockBegin* sync_handler, bool default_handler = false);
a61af66fc99e Initial load
duke
parents:
diff changeset
341
a61af66fc99e Initial load
duke
parents:
diff changeset
342 // inliners
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4871
diff changeset
343 bool try_inline( ciMethod* callee, bool holder_known, Bytecodes::Code bc = Bytecodes::_illegal, Value receiver = NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
344 bool try_inline_intrinsics(ciMethod* callee);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4871
diff changeset
345 bool try_inline_full( ciMethod* callee, bool holder_known, Bytecodes::Code bc = Bytecodes::_illegal, Value receiver = NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
346 bool try_inline_jsr(int jsr_dest_bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
347
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4871
diff changeset
348 const char* check_can_parse(ciMethod* callee) const;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4871
diff changeset
349 const char* should_not_inline(ciMethod* callee) const;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4871
diff changeset
350
3900
a32de5085326 7079673: JSR 292: C1 should inline bytecoded method handle adapters
twisti
parents: 1972
diff changeset
351 // JSR 292 support
6634
7f813940ac35 7192406: JSR 292: C2 needs exact return type information for invokedynamic and invokehandle call sites
twisti
parents: 6266
diff changeset
352 bool try_method_handle_inline(ciMethod* callee);
3900
a32de5085326 7079673: JSR 292: C1 should inline bytecoded method handle adapters
twisti
parents: 1972
diff changeset
353
0
a61af66fc99e Initial load
duke
parents:
diff changeset
354 // helpers
a61af66fc99e Initial load
duke
parents:
diff changeset
355 void inline_bailout(const char* msg);
a61af66fc99e Initial load
duke
parents:
diff changeset
356 BlockBegin* header_block(BlockBegin* entry, BlockBegin::Flag f, ValueStack* state);
a61af66fc99e Initial load
duke
parents:
diff changeset
357 BlockBegin* setup_start_block(int osr_bci, BlockBegin* std_entry, BlockBegin* osr_entry, ValueStack* init_state);
a61af66fc99e Initial load
duke
parents:
diff changeset
358 void setup_osr_entry_block();
a61af66fc99e Initial load
duke
parents:
diff changeset
359 void clear_inline_bailout();
a61af66fc99e Initial load
duke
parents:
diff changeset
360 ValueStack* state_at_entry();
a61af66fc99e Initial load
duke
parents:
diff changeset
361 void push_root_scope(IRScope* scope, BlockList* bci2block, BlockBegin* start);
a61af66fc99e Initial load
duke
parents:
diff changeset
362 void push_scope(ciMethod* callee, BlockBegin* continuation);
a61af66fc99e Initial load
duke
parents:
diff changeset
363 void push_scope_for_jsr(BlockBegin* jsr_continuation, int jsr_dest_bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
364 void pop_scope();
a61af66fc99e Initial load
duke
parents:
diff changeset
365 void pop_scope_for_jsr();
a61af66fc99e Initial load
duke
parents:
diff changeset
366
a61af66fc99e Initial load
duke
parents:
diff changeset
367 bool append_unsafe_get_obj(ciMethod* callee, BasicType t, bool is_volatile);
a61af66fc99e Initial load
duke
parents:
diff changeset
368 bool append_unsafe_put_obj(ciMethod* callee, BasicType t, bool is_volatile);
a61af66fc99e Initial load
duke
parents:
diff changeset
369 bool append_unsafe_get_raw(ciMethod* callee, BasicType t);
a61af66fc99e Initial load
duke
parents:
diff changeset
370 bool append_unsafe_put_raw(ciMethod* callee, BasicType t);
a61af66fc99e Initial load
duke
parents:
diff changeset
371 bool append_unsafe_prefetch(ciMethod* callee, bool is_store, bool is_static);
a61af66fc99e Initial load
duke
parents:
diff changeset
372 void append_unsafe_CAS(ciMethod* callee);
6795
7eca5de9e0b6 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 6634
diff changeset
373 bool append_unsafe_get_and_set_obj(ciMethod* callee, bool is_add);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
374
6843
c3e799c37717 7177003: C1: LogCompilation support
vlivanov
parents: 6795
diff changeset
375 void print_inlining(ciMethod* callee, const char* msg = NULL, bool success = true);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
376
12875
d13d7aba8c12 8023657: New type profiling points: arguments to call
roland
parents: 8860
diff changeset
377 void profile_call(ciMethod* callee, Value recv, ciKlass* predicted_holder, Values* obj_args, bool inlined);
12882
ce0cc25bc5e2 8026054: New type profiling points: type of return values at calls
roland
parents: 12875
diff changeset
378 void profile_return_type(Value ret, ciMethod* callee, ciMethod* m = NULL, int bci = -1);
1825
80c9354976b0 6988346: 6986046 breaks tiered
iveresov
parents: 1819
diff changeset
379 void profile_invocation(ciMethod* inlinee, ValueStack* state);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
380
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1584
diff changeset
381 // Shortcuts to profiling control.
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1584
diff changeset
382 bool is_profiling() { return _compilation->is_profiling(); }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1584
diff changeset
383 bool count_invocations() { return _compilation->count_invocations(); }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1584
diff changeset
384 bool count_backedges() { return _compilation->count_backedges(); }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1584
diff changeset
385 bool profile_branches() { return _compilation->profile_branches(); }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1584
diff changeset
386 bool profile_calls() { return _compilation->profile_calls(); }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1584
diff changeset
387 bool profile_inlined_calls() { return _compilation->profile_inlined_calls(); }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1584
diff changeset
388 bool profile_checkcasts() { return _compilation->profile_checkcasts(); }
12962
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents: 12882
diff changeset
389 bool profile_parameters() { return _compilation->profile_parameters(); }
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents: 12882
diff changeset
390 bool profile_arguments() { return _compilation->profile_arguments(); }
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents: 12882
diff changeset
391 bool profile_return() { return _compilation->profile_return(); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
392
12962
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents: 12882
diff changeset
393 Values* args_list_for_profiling(ciMethod* target, int& start, bool may_have_receiver);
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents: 12882
diff changeset
394 Values* collect_args_for_profiling(Values* args, ciMethod* target, bool may_have_receiver);
17925
45e59fae8f2b 8041481: JVM crashes with collect_args_for_profiling
roland
parents: 17467
diff changeset
395 void check_args_for_profiling(Values* obj_args, int expected);
12875
d13d7aba8c12 8023657: New type profiling points: arguments to call
roland
parents: 8860
diff changeset
396
0
a61af66fc99e Initial load
duke
parents:
diff changeset
397 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
398 NOT_PRODUCT(void print_stats();)
a61af66fc99e Initial load
duke
parents:
diff changeset
399
a61af66fc99e Initial load
duke
parents:
diff changeset
400 // initialization
a61af66fc99e Initial load
duke
parents:
diff changeset
401 static void initialize();
a61af66fc99e Initial load
duke
parents:
diff changeset
402
a61af66fc99e Initial load
duke
parents:
diff changeset
403 // public
a61af66fc99e Initial load
duke
parents:
diff changeset
404 static bool can_trap(ciMethod* method, Bytecodes::Code code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
405 assert(0 <= code && code < Bytecodes::number_of_java_codes, "illegal bytecode");
a61af66fc99e Initial load
duke
parents:
diff changeset
406 if (_can_trap[code]) return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
407 // special handling for finalizer registration
a61af66fc99e Initial load
duke
parents:
diff changeset
408 return code == Bytecodes::_return && method->intrinsic_id() == vmIntrinsics::_Object_init;
a61af66fc99e Initial load
duke
parents:
diff changeset
409 }
a61af66fc99e Initial load
duke
parents:
diff changeset
410
a61af66fc99e Initial load
duke
parents:
diff changeset
411 // creation
a61af66fc99e Initial load
duke
parents:
diff changeset
412 GraphBuilder(Compilation* compilation, IRScope* scope);
a61af66fc99e Initial load
duke
parents:
diff changeset
413 static void sort_top_into_worklist(BlockList* worklist, BlockBegin* top);
a61af66fc99e Initial load
duke
parents:
diff changeset
414
a61af66fc99e Initial load
duke
parents:
diff changeset
415 BlockBegin* start() const { return _start; }
a61af66fc99e Initial load
duke
parents:
diff changeset
416 };
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1825
diff changeset
417
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1825
diff changeset
418 #endif // SHARE_VM_C1_C1_GRAPHBUILDER_HPP