annotate src/share/vm/opto/compile.hpp @ 17716:cdb71841f4bc

6498581: ThreadInterruptTest3 produces wrong output on Windows Summary: There is race condition between os::interrupt and os::is_interrupted on Windows. In JVM_Sleep(Thread.sleep), check if thread gets interrupted, it may see interrupted but not really interrupted so cause spurious waking up (early return from sleep). Fix by checking if interrupt event really gets set thus prevent false return. For intrinsic of _isInterrupted, on Windows, go fastpath only on bit not set. Reviewed-by: acorn, kvn Contributed-by: david.holmes@oracle.com, yumin.qi@oracle.com
author minqi
date Wed, 26 Feb 2014 15:20:41 -0800
parents 849eb7bfceac
children abec000618bf 606acabe7b5c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10278
diff changeset
2 * Copyright (c) 1997, 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: 1397
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1397
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: 1397
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: 1634
diff changeset
25 #ifndef SHARE_VM_OPTO_COMPILE_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1634
diff changeset
26 #define SHARE_VM_OPTO_COMPILE_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1634
diff changeset
27
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1634
diff changeset
28 #include "asm/codeBuffer.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1634
diff changeset
29 #include "ci/compilerInterface.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1634
diff changeset
30 #include "code/debugInfoRec.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1634
diff changeset
31 #include "code/exceptionHandlerTable.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1634
diff changeset
32 #include "compiler/compilerOracle.hpp"
7421
ad5dd04754ee 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 7196
diff changeset
33 #include "compiler/compileBroker.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1634
diff changeset
34 #include "libadt/dict.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1634
diff changeset
35 #include "libadt/port.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1634
diff changeset
36 #include "libadt/vectset.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1634
diff changeset
37 #include "memory/resourceArea.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1634
diff changeset
38 #include "opto/idealGraphPrinter.hpp"
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10278
diff changeset
39 #include "opto/phasetype.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1634
diff changeset
40 #include "opto/phase.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1634
diff changeset
41 #include "opto/regmask.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1634
diff changeset
42 #include "runtime/deoptimization.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1634
diff changeset
43 #include "runtime/vmThread.hpp"
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10278
diff changeset
44 #include "trace/tracing.hpp"
13400
86e6d691f2e1 8028128: Add a type safe alternative for working with counter based data
mgronlun
parents: 13045
diff changeset
45 #include "utilities/ticks.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1634
diff changeset
46
0
a61af66fc99e Initial load
duke
parents:
diff changeset
47 class Block;
a61af66fc99e Initial load
duke
parents:
diff changeset
48 class Bundle;
a61af66fc99e Initial load
duke
parents:
diff changeset
49 class C2Compiler;
a61af66fc99e Initial load
duke
parents:
diff changeset
50 class CallGenerator;
a61af66fc99e Initial load
duke
parents:
diff changeset
51 class ConnectionGraph;
a61af66fc99e Initial load
duke
parents:
diff changeset
52 class InlineTree;
a61af66fc99e Initial load
duke
parents:
diff changeset
53 class Int_Array;
a61af66fc99e Initial load
duke
parents:
diff changeset
54 class Matcher;
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
55 class MachConstantNode;
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
56 class MachConstantBaseNode;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
57 class MachNode;
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
58 class MachOper;
38
b789bcaf2dd9 6667610: (Escape Analysis) retry compilation without EA if it fails
kvn
parents: 0
diff changeset
59 class MachSafePointNode;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
60 class Node;
a61af66fc99e Initial load
duke
parents:
diff changeset
61 class Node_Array;
a61af66fc99e Initial load
duke
parents:
diff changeset
62 class Node_Notes;
a61af66fc99e Initial load
duke
parents:
diff changeset
63 class OptoReg;
a61af66fc99e Initial load
duke
parents:
diff changeset
64 class PhaseCFG;
a61af66fc99e Initial load
duke
parents:
diff changeset
65 class PhaseGVN;
1172
b2b6a9bf6238 6894779: Loop Predication for Loop Optimizer in C2
cfang
parents: 1080
diff changeset
66 class PhaseIterGVN;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
67 class PhaseRegAlloc;
a61af66fc99e Initial load
duke
parents:
diff changeset
68 class PhaseCCP;
a61af66fc99e Initial load
duke
parents:
diff changeset
69 class PhaseCCP_DCE;
a61af66fc99e Initial load
duke
parents:
diff changeset
70 class RootNode;
a61af66fc99e Initial load
duke
parents:
diff changeset
71 class relocInfo;
a61af66fc99e Initial load
duke
parents:
diff changeset
72 class Scope;
a61af66fc99e Initial load
duke
parents:
diff changeset
73 class StartNode;
a61af66fc99e Initial load
duke
parents:
diff changeset
74 class SafePointNode;
a61af66fc99e Initial load
duke
parents:
diff changeset
75 class JVMState;
12190
edb5ab0f3fe5 8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents: 10405
diff changeset
76 class Type;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
77 class TypeData;
a61af66fc99e Initial load
duke
parents:
diff changeset
78 class TypePtr;
7478
5698813d45eb 8005418: JSR 292: virtual dispatch bug in 292 impl
twisti
parents: 7473
diff changeset
79 class TypeOopPtr;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
80 class TypeFunc;
a61af66fc99e Initial load
duke
parents:
diff changeset
81 class Unique_Node_List;
a61af66fc99e Initial load
duke
parents:
diff changeset
82 class nmethod;
a61af66fc99e Initial load
duke
parents:
diff changeset
83 class WarmCallInfo;
7196
2aff40cb4703 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 6888
diff changeset
84 class Node_Stack;
2aff40cb4703 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 6888
diff changeset
85 struct Final_Reshape_Counts;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
86
a61af66fc99e Initial load
duke
parents:
diff changeset
87 //------------------------------Compile----------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
88 // This class defines a top-level Compiler invocation.
a61af66fc99e Initial load
duke
parents:
diff changeset
89
a61af66fc99e Initial load
duke
parents:
diff changeset
90 class Compile : public Phase {
3939
f6f3bb0ee072 7088955: add C2 IR support to the SA
never
parents: 3857
diff changeset
91 friend class VMStructs;
f6f3bb0ee072 7088955: add C2 IR support to the SA
never
parents: 3857
diff changeset
92
0
a61af66fc99e Initial load
duke
parents:
diff changeset
93 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
94 // Fixed alias indexes. (See also MergeMemNode.)
a61af66fc99e Initial load
duke
parents:
diff changeset
95 enum {
a61af66fc99e Initial load
duke
parents:
diff changeset
96 AliasIdxTop = 1, // pseudo-index, aliases to nothing (used as sentinel value)
a61af66fc99e Initial load
duke
parents:
diff changeset
97 AliasIdxBot = 2, // pseudo-index, aliases to everything
a61af66fc99e Initial load
duke
parents:
diff changeset
98 AliasIdxRaw = 3 // hard-wired index for TypeRawPtr::BOTTOM
a61af66fc99e Initial load
duke
parents:
diff changeset
99 };
a61af66fc99e Initial load
duke
parents:
diff changeset
100
a61af66fc99e Initial load
duke
parents:
diff changeset
101 // Variant of TraceTime(NULL, &_t_accumulator, TimeCompiler);
a61af66fc99e Initial load
duke
parents:
diff changeset
102 // Integrated with logging. If logging is turned on, and dolog is true,
a61af66fc99e Initial load
duke
parents:
diff changeset
103 // then brackets are put into the log, with time stamps and node counts.
a61af66fc99e Initial load
duke
parents:
diff changeset
104 // (The time collection itself is always conditionalized on TimeCompiler.)
a61af66fc99e Initial load
duke
parents:
diff changeset
105 class TracePhase : public TraceTime {
a61af66fc99e Initial load
duke
parents:
diff changeset
106 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
107 Compile* C;
a61af66fc99e Initial load
duke
parents:
diff changeset
108 CompileLog* _log;
7196
2aff40cb4703 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 6888
diff changeset
109 const char* _phase_name;
2aff40cb4703 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 6888
diff changeset
110 bool _dolog;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
111 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
112 TracePhase(const char* name, elapsedTimer* accumulator, bool dolog);
a61af66fc99e Initial load
duke
parents:
diff changeset
113 ~TracePhase();
a61af66fc99e Initial load
duke
parents:
diff changeset
114 };
a61af66fc99e Initial load
duke
parents:
diff changeset
115
a61af66fc99e Initial load
duke
parents:
diff changeset
116 // Information per category of alias (memory slice)
a61af66fc99e Initial load
duke
parents:
diff changeset
117 class AliasType {
a61af66fc99e Initial load
duke
parents:
diff changeset
118 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
119 friend class Compile;
a61af66fc99e Initial load
duke
parents:
diff changeset
120
a61af66fc99e Initial load
duke
parents:
diff changeset
121 int _index; // unique index, used with MergeMemNode
a61af66fc99e Initial load
duke
parents:
diff changeset
122 const TypePtr* _adr_type; // normalized address type
a61af66fc99e Initial load
duke
parents:
diff changeset
123 ciField* _field; // relevant instance field, or null if none
12190
edb5ab0f3fe5 8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents: 10405
diff changeset
124 const Type* _element; // relevant array element type, or null if none
0
a61af66fc99e Initial load
duke
parents:
diff changeset
125 bool _is_rewritable; // false if the memory is write-once only
a61af66fc99e Initial load
duke
parents:
diff changeset
126 int _general_index; // if this is type is an instance, the general
a61af66fc99e Initial load
duke
parents:
diff changeset
127 // type that this is an instance of
a61af66fc99e Initial load
duke
parents:
diff changeset
128
a61af66fc99e Initial load
duke
parents:
diff changeset
129 void Init(int i, const TypePtr* at);
a61af66fc99e Initial load
duke
parents:
diff changeset
130
a61af66fc99e Initial load
duke
parents:
diff changeset
131 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
132 int index() const { return _index; }
a61af66fc99e Initial load
duke
parents:
diff changeset
133 const TypePtr* adr_type() const { return _adr_type; }
a61af66fc99e Initial load
duke
parents:
diff changeset
134 ciField* field() const { return _field; }
12190
edb5ab0f3fe5 8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents: 10405
diff changeset
135 const Type* element() const { return _element; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
136 bool is_rewritable() const { return _is_rewritable; }
a61af66fc99e Initial load
duke
parents:
diff changeset
137 bool is_volatile() const { return (_field ? _field->is_volatile() : false); }
a61af66fc99e Initial load
duke
parents:
diff changeset
138 int general_index() const { return (_general_index != 0) ? _general_index : _index; }
a61af66fc99e Initial load
duke
parents:
diff changeset
139
a61af66fc99e Initial load
duke
parents:
diff changeset
140 void set_rewritable(bool z) { _is_rewritable = z; }
a61af66fc99e Initial load
duke
parents:
diff changeset
141 void set_field(ciField* f) {
a61af66fc99e Initial load
duke
parents:
diff changeset
142 assert(!_field,"");
a61af66fc99e Initial load
duke
parents:
diff changeset
143 _field = f;
12190
edb5ab0f3fe5 8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents: 10405
diff changeset
144 if (f->is_final() || f->is_stable()) {
edb5ab0f3fe5 8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents: 10405
diff changeset
145 // In the case of @Stable, multiple writes are possible but may be assumed to be no-ops.
edb5ab0f3fe5 8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents: 10405
diff changeset
146 _is_rewritable = false;
edb5ab0f3fe5 8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents: 10405
diff changeset
147 }
edb5ab0f3fe5 8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents: 10405
diff changeset
148 }
edb5ab0f3fe5 8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents: 10405
diff changeset
149 void set_element(const Type* e) {
edb5ab0f3fe5 8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents: 10405
diff changeset
150 assert(_element == NULL, "");
edb5ab0f3fe5 8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents: 10405
diff changeset
151 _element = e;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
152 }
a61af66fc99e Initial load
duke
parents:
diff changeset
153
a61af66fc99e Initial load
duke
parents:
diff changeset
154 void print_on(outputStream* st) PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
155 };
a61af66fc99e Initial load
duke
parents:
diff changeset
156
a61af66fc99e Initial load
duke
parents:
diff changeset
157 enum {
a61af66fc99e Initial load
duke
parents:
diff changeset
158 logAliasCacheSize = 6,
a61af66fc99e Initial load
duke
parents:
diff changeset
159 AliasCacheSize = (1<<logAliasCacheSize)
a61af66fc99e Initial load
duke
parents:
diff changeset
160 };
a61af66fc99e Initial load
duke
parents:
diff changeset
161 struct AliasCacheEntry { const TypePtr* _adr_type; int _index; }; // simple duple type
a61af66fc99e Initial load
duke
parents:
diff changeset
162 enum {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5927
diff changeset
163 trapHistLength = MethodData::_trap_hist_limit
0
a61af66fc99e Initial load
duke
parents:
diff changeset
164 };
a61af66fc99e Initial load
duke
parents:
diff changeset
165
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
166 // Constant entry of the constant table.
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
167 class Constant {
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
168 private:
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
169 BasicType _type;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5927
diff changeset
170 union {
6888
cfe522e6461c 8000623: tools/javac/Diagnostics/6769027/T6769027.java crashes in PSPromotionManager::copy_to_survivor_space
kvn
parents: 6792
diff changeset
171 jvalue _value;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5927
diff changeset
172 Metadata* _metadata;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5927
diff changeset
173 } _v;
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
174 int _offset; // offset of this constant (in bytes) relative to the constant table base.
4114
6729bbc1fcd6 7003454: order constants in constant table by number of references in code
twisti
parents: 3939
diff changeset
175 float _freq;
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
176 bool _can_be_reused; // true (default) if the value can be shared with other users.
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
177
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
178 public:
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5927
diff changeset
179 Constant() : _type(T_ILLEGAL), _offset(-1), _freq(0.0f), _can_be_reused(true) { _v._value.l = 0; }
4114
6729bbc1fcd6 7003454: order constants in constant table by number of references in code
twisti
parents: 3939
diff changeset
180 Constant(BasicType type, jvalue value, float freq = 0.0f, bool can_be_reused = true) :
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
181 _type(type),
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
182 _offset(-1),
4114
6729bbc1fcd6 7003454: order constants in constant table by number of references in code
twisti
parents: 3939
diff changeset
183 _freq(freq),
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
184 _can_be_reused(can_be_reused)
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5927
diff changeset
185 {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5927
diff changeset
186 assert(type != T_METADATA, "wrong constructor");
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5927
diff changeset
187 _v._value = value;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5927
diff changeset
188 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5927
diff changeset
189 Constant(Metadata* metadata, bool can_be_reused = true) :
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5927
diff changeset
190 _type(T_METADATA),
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5927
diff changeset
191 _offset(-1),
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5927
diff changeset
192 _freq(0.0f),
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5927
diff changeset
193 _can_be_reused(can_be_reused)
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5927
diff changeset
194 {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5927
diff changeset
195 _v._metadata = metadata;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5927
diff changeset
196 }
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
197
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
198 bool operator==(const Constant& other);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
199
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
200 BasicType type() const { return _type; }
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
201
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5927
diff changeset
202 jlong get_jlong() const { return _v._value.j; }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5927
diff changeset
203 jfloat get_jfloat() const { return _v._value.f; }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5927
diff changeset
204 jdouble get_jdouble() const { return _v._value.d; }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5927
diff changeset
205 jobject get_jobject() const { return _v._value.l; }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5927
diff changeset
206
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5927
diff changeset
207 Metadata* get_metadata() const { return _v._metadata; }
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
208
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
209 int offset() const { return _offset; }
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
210 void set_offset(int offset) { _offset = offset; }
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
211
4114
6729bbc1fcd6 7003454: order constants in constant table by number of references in code
twisti
parents: 3939
diff changeset
212 float freq() const { return _freq; }
6729bbc1fcd6 7003454: order constants in constant table by number of references in code
twisti
parents: 3939
diff changeset
213 void inc_freq(float freq) { _freq += freq; }
6729bbc1fcd6 7003454: order constants in constant table by number of references in code
twisti
parents: 3939
diff changeset
214
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
215 bool can_be_reused() const { return _can_be_reused; }
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
216 };
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
217
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
218 // Constant table.
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
219 class ConstantTable {
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
220 private:
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
221 GrowableArray<Constant> _constants; // Constants of this table.
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
222 int _size; // Size in bytes the emitted constant table takes (including padding).
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
223 int _table_base_offset; // Offset of the table base that gets added to the constant offsets.
4114
6729bbc1fcd6 7003454: order constants in constant table by number of references in code
twisti
parents: 3939
diff changeset
224 int _nof_jump_tables; // Number of jump-tables in this constant table.
6729bbc1fcd6 7003454: order constants in constant table by number of references in code
twisti
parents: 3939
diff changeset
225
6729bbc1fcd6 7003454: order constants in constant table by number of references in code
twisti
parents: 3939
diff changeset
226 static int qsort_comparator(Constant* a, Constant* b);
6729bbc1fcd6 7003454: order constants in constant table by number of references in code
twisti
parents: 3939
diff changeset
227
6729bbc1fcd6 7003454: order constants in constant table by number of references in code
twisti
parents: 3939
diff changeset
228 // We use negative frequencies to keep the order of the
6729bbc1fcd6 7003454: order constants in constant table by number of references in code
twisti
parents: 3939
diff changeset
229 // jump-tables in which they were added. Otherwise we get into
6729bbc1fcd6 7003454: order constants in constant table by number of references in code
twisti
parents: 3939
diff changeset
230 // trouble with relocation.
6729bbc1fcd6 7003454: order constants in constant table by number of references in code
twisti
parents: 3939
diff changeset
231 float next_jump_table_freq() { return -1.0f * (++_nof_jump_tables); }
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
232
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
233 public:
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
234 ConstantTable() :
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
235 _size(-1),
4114
6729bbc1fcd6 7003454: order constants in constant table by number of references in code
twisti
parents: 3939
diff changeset
236 _table_base_offset(-1), // We can use -1 here since the constant table is always bigger than 2 bytes (-(size / 2), see MachConstantBaseNode::emit).
6729bbc1fcd6 7003454: order constants in constant table by number of references in code
twisti
parents: 3939
diff changeset
237 _nof_jump_tables(0)
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
238 {}
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
239
4114
6729bbc1fcd6 7003454: order constants in constant table by number of references in code
twisti
parents: 3939
diff changeset
240 int size() const { assert(_size != -1, "not calculated yet"); return _size; }
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
241
4114
6729bbc1fcd6 7003454: order constants in constant table by number of references in code
twisti
parents: 3939
diff changeset
242 int calculate_table_base_offset() const; // AD specific
6729bbc1fcd6 7003454: order constants in constant table by number of references in code
twisti
parents: 3939
diff changeset
243 void set_table_base_offset(int x) { assert(_table_base_offset == -1 || x == _table_base_offset, "can't change"); _table_base_offset = x; }
6729bbc1fcd6 7003454: order constants in constant table by number of references in code
twisti
parents: 3939
diff changeset
244 int table_base_offset() const { assert(_table_base_offset != -1, "not set yet"); return _table_base_offset; }
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
245
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
246 void emit(CodeBuffer& cb);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
247
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
248 // Returns the offset of the last entry (the top) of the constant table.
4114
6729bbc1fcd6 7003454: order constants in constant table by number of references in code
twisti
parents: 3939
diff changeset
249 int top_offset() const { assert(_constants.top().offset() != -1, "not bound yet"); return _constants.top().offset(); }
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
250
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
251 void calculate_offsets_and_size();
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
252 int find_offset(Constant& con) const;
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
253
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
254 void add(Constant& con);
4114
6729bbc1fcd6 7003454: order constants in constant table by number of references in code
twisti
parents: 3939
diff changeset
255 Constant add(MachConstantNode* n, BasicType type, jvalue value);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5927
diff changeset
256 Constant add(Metadata* metadata);
4114
6729bbc1fcd6 7003454: order constants in constant table by number of references in code
twisti
parents: 3939
diff changeset
257 Constant add(MachConstantNode* n, MachOper* oper);
6729bbc1fcd6 7003454: order constants in constant table by number of references in code
twisti
parents: 3939
diff changeset
258 Constant add(MachConstantNode* n, jfloat f) {
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
259 jvalue value; value.f = f;
4114
6729bbc1fcd6 7003454: order constants in constant table by number of references in code
twisti
parents: 3939
diff changeset
260 return add(n, T_FLOAT, value);
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
261 }
4114
6729bbc1fcd6 7003454: order constants in constant table by number of references in code
twisti
parents: 3939
diff changeset
262 Constant add(MachConstantNode* n, jdouble d) {
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
263 jvalue value; value.d = d;
4114
6729bbc1fcd6 7003454: order constants in constant table by number of references in code
twisti
parents: 3939
diff changeset
264 return add(n, T_DOUBLE, value);
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
265 }
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
266
4114
6729bbc1fcd6 7003454: order constants in constant table by number of references in code
twisti
parents: 3939
diff changeset
267 // Jump-table
6729bbc1fcd6 7003454: order constants in constant table by number of references in code
twisti
parents: 3939
diff changeset
268 Constant add_jump_table(MachConstantNode* n);
6729bbc1fcd6 7003454: order constants in constant table by number of references in code
twisti
parents: 3939
diff changeset
269 void fill_jump_table(CodeBuffer& cb, MachConstantNode* n, GrowableArray<Label*> labels) const;
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
270 };
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
271
0
a61af66fc99e Initial load
duke
parents:
diff changeset
272 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
273 // Fixed parameters to this compilation.
a61af66fc99e Initial load
duke
parents:
diff changeset
274 const int _compile_id;
a61af66fc99e Initial load
duke
parents:
diff changeset
275 const bool _save_argument_registers; // save/restore arg regs for trampolines
a61af66fc99e Initial load
duke
parents:
diff changeset
276 const bool _subsume_loads; // Load can be matched as part of a larger op.
38
b789bcaf2dd9 6667610: (Escape Analysis) retry compilation without EA if it fails
kvn
parents: 0
diff changeset
277 const bool _do_escape_analysis; // Do escape analysis.
10278
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 8695
diff changeset
278 const bool _eliminate_boxing; // Do boxing elimination.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
279 ciMethod* _method; // The method being compiled.
a61af66fc99e Initial load
duke
parents:
diff changeset
280 int _entry_bci; // entry bci for osr methods.
a61af66fc99e Initial load
duke
parents:
diff changeset
281 const TypeFunc* _tf; // My kind of signature
a61af66fc99e Initial load
duke
parents:
diff changeset
282 InlineTree* _ilt; // Ditto (temporary).
a61af66fc99e Initial load
duke
parents:
diff changeset
283 address _stub_function; // VM entry for stub being compiled, or NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
284 const char* _stub_name; // Name of stub or adapter being compiled, or NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
285 address _stub_entry_point; // Compile code entry for generated stub, or NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
286
a61af66fc99e Initial load
duke
parents:
diff changeset
287 // Control of this compilation.
a61af66fc99e Initial load
duke
parents:
diff changeset
288 int _num_loop_opts; // Number of iterations for doing loop optimiztions
a61af66fc99e Initial load
duke
parents:
diff changeset
289 int _max_inline_size; // Max inline size for this compilation
a61af66fc99e Initial load
duke
parents:
diff changeset
290 int _freq_inline_size; // Max hot method inline size for this compilation
a61af66fc99e Initial load
duke
parents:
diff changeset
291 int _fixed_slots; // count of frame slots not allocated by the register
a61af66fc99e Initial load
duke
parents:
diff changeset
292 // allocator i.e. locks, original deopt pc, etc.
a61af66fc99e Initial load
duke
parents:
diff changeset
293 // For deopt
a61af66fc99e Initial load
duke
parents:
diff changeset
294 int _orig_pc_slot;
a61af66fc99e Initial load
duke
parents:
diff changeset
295 int _orig_pc_slot_offset_in_bytes;
a61af66fc99e Initial load
duke
parents:
diff changeset
296
a61af66fc99e Initial load
duke
parents:
diff changeset
297 int _major_progress; // Count of something big happening
7473
d092d1b31229 8005071: Incremental inlining for JSR 292
roland
parents: 7421
diff changeset
298 bool _inlining_progress; // progress doing incremental inlining?
d092d1b31229 8005071: Incremental inlining for JSR 292
roland
parents: 7421
diff changeset
299 bool _inlining_incrementally;// Are we doing incremental inlining (post parse)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
300 bool _has_loops; // True if the method _may_ have some loops
a61af66fc99e Initial load
duke
parents:
diff changeset
301 bool _has_split_ifs; // True if the method _may_ have some split-if
a61af66fc99e Initial load
duke
parents:
diff changeset
302 bool _has_unsafe_access; // True if the method _may_ produce faults in unsafe loads or stores.
1080
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 948
diff changeset
303 bool _has_stringbuilder; // True StringBuffers or StringBuilders are allocated
10278
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 8695
diff changeset
304 bool _has_boxed_value; // True if a boxed object is allocated
6792
137868b7aa6f 7196199: java/text/Bidi/Bug6665028.java failed: Bidi run count incorrect
kvn
parents: 6725
diff changeset
305 int _max_vector_size; // Maximum size of generated vectors
0
a61af66fc99e Initial load
duke
parents:
diff changeset
306 uint _trap_hist[trapHistLength]; // Cumulative traps
a61af66fc99e Initial load
duke
parents:
diff changeset
307 bool _trap_can_recompile; // Have we emitted a recompiling trap?
a61af66fc99e Initial load
duke
parents:
diff changeset
308 uint _decompile_count; // Cumulative decompilation counts.
a61af66fc99e Initial load
duke
parents:
diff changeset
309 bool _do_inlining; // True if we intend to do inlining
a61af66fc99e Initial load
duke
parents:
diff changeset
310 bool _do_scheduling; // True if we intend to do scheduling
418
72c5366e5d86 6743900: frequency based block layout
rasbold
parents: 367
diff changeset
311 bool _do_freq_based_layout; // True if we intend to do frequency based block layout
0
a61af66fc99e Initial load
duke
parents:
diff changeset
312 bool _do_count_invocations; // True if we generate code to count invocations
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5927
diff changeset
313 bool _do_method_data_update; // True if we generate code to update MethodData*s
0
a61af66fc99e Initial load
duke
parents:
diff changeset
314 int _AliasLevel; // Locally-adjusted version of AliasLevel flag.
a61af66fc99e Initial load
duke
parents:
diff changeset
315 bool _print_assembly; // True if we should dump assembly code for this compilation
12295
1b64d46620a3 8022585: VM crashes when ran with -XX:+PrintInlining
kvn
parents: 12190
diff changeset
316 bool _print_inlining; // True if we should print inlining for this compilation
1b64d46620a3 8022585: VM crashes when ran with -XX:+PrintInlining
kvn
parents: 12190
diff changeset
317 bool _print_intrinsics; // True if we should print intrinsics for this compilation
0
a61af66fc99e Initial load
duke
parents:
diff changeset
318 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
319 bool _trace_opto_output;
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
320 bool _parsed_irreducible_loop; // True if ciTypeFlow detected irreducible loops during parsing
0
a61af66fc99e Initial load
duke
parents:
diff changeset
321 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
322
1265
b4b440360f1e 6926782: CodeBuffer size too small after 6921352
twisti
parents: 1172
diff changeset
323 // JSR 292
b4b440360f1e 6926782: CodeBuffer size too small after 6921352
twisti
parents: 1172
diff changeset
324 bool _has_method_handle_invokes; // True if this method has MethodHandle invokes.
b4b440360f1e 6926782: CodeBuffer size too small after 6921352
twisti
parents: 1172
diff changeset
325
0
a61af66fc99e Initial load
duke
parents:
diff changeset
326 // Compilation environment.
a61af66fc99e Initial load
duke
parents:
diff changeset
327 Arena _comp_arena; // Arena with lifetime equivalent to Compile
a61af66fc99e Initial load
duke
parents:
diff changeset
328 ciEnv* _env; // CI interface
a61af66fc99e Initial load
duke
parents:
diff changeset
329 CompileLog* _log; // from CompilerThread
a61af66fc99e Initial load
duke
parents:
diff changeset
330 const char* _failure_reason; // for record_failure/failing pattern
a61af66fc99e Initial load
duke
parents:
diff changeset
331 GrowableArray<CallGenerator*>* _intrinsics; // List of intrinsics.
a61af66fc99e Initial load
duke
parents:
diff changeset
332 GrowableArray<Node*>* _macro_nodes; // List of nodes which need to be expanded before matching.
1172
b2b6a9bf6238 6894779: Loop Predication for Loop Optimizer in C2
cfang
parents: 1080
diff changeset
333 GrowableArray<Node*>* _predicate_opaqs; // List of Opaque1 nodes for the loop predicates.
8048
8b3da8d14c93 7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents: 7478
diff changeset
334 GrowableArray<Node*>* _expensive_nodes; // List of nodes that are expensive to compute and that we'd better not let the GVN freely common
0
a61af66fc99e Initial load
duke
parents:
diff changeset
335 ConnectionGraph* _congraph;
a61af66fc99e Initial load
duke
parents:
diff changeset
336 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
337 IdealGraphPrinter* _printer;
a61af66fc99e Initial load
duke
parents:
diff changeset
338 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
339
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10278
diff changeset
340
0
a61af66fc99e Initial load
duke
parents:
diff changeset
341 // Node management
a61af66fc99e Initial load
duke
parents:
diff changeset
342 uint _unique; // Counter for unique Node indices
7196
2aff40cb4703 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 6888
diff changeset
343 VectorSet _dead_node_list; // Set of dead nodes
2aff40cb4703 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 6888
diff changeset
344 uint _dead_node_count; // Number of dead nodes; VectorSet::Size() is O(N).
2aff40cb4703 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 6888
diff changeset
345 // So use this to keep count and make the call O(1).
0
a61af66fc99e Initial load
duke
parents:
diff changeset
346 debug_only(static int _debug_idx;) // Monotonic counter (not reset), use -XX:BreakAtNode=<idx>
a61af66fc99e Initial load
duke
parents:
diff changeset
347 Arena _node_arena; // Arena for new-space Nodes
a61af66fc99e Initial load
duke
parents:
diff changeset
348 Arena _old_arena; // Arena for old-space Nodes, lifetime during xform
a61af66fc99e Initial load
duke
parents:
diff changeset
349 RootNode* _root; // Unique root of compilation, or NULL after bail-out.
a61af66fc99e Initial load
duke
parents:
diff changeset
350 Node* _top; // Unique top node. (Reset by various phases.)
a61af66fc99e Initial load
duke
parents:
diff changeset
351
a61af66fc99e Initial load
duke
parents:
diff changeset
352 Node* _immutable_memory; // Initial memory state
a61af66fc99e Initial load
duke
parents:
diff changeset
353
a61af66fc99e Initial load
duke
parents:
diff changeset
354 Node* _recent_alloc_obj;
a61af66fc99e Initial load
duke
parents:
diff changeset
355 Node* _recent_alloc_ctl;
a61af66fc99e Initial load
duke
parents:
diff changeset
356
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
357 // Constant table
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
358 ConstantTable _constant_table; // The constant table for this compile.
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
359 MachConstantBaseNode* _mach_constant_base_node; // Constant table base node singleton.
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
360
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
361
0
a61af66fc99e Initial load
duke
parents:
diff changeset
362 // Blocked array of debugging and profiling information,
a61af66fc99e Initial load
duke
parents:
diff changeset
363 // tracked per node.
a61af66fc99e Initial load
duke
parents:
diff changeset
364 enum { _log2_node_notes_block_size = 8,
a61af66fc99e Initial load
duke
parents:
diff changeset
365 _node_notes_block_size = (1<<_log2_node_notes_block_size)
a61af66fc99e Initial load
duke
parents:
diff changeset
366 };
a61af66fc99e Initial load
duke
parents:
diff changeset
367 GrowableArray<Node_Notes*>* _node_note_array;
a61af66fc99e Initial load
duke
parents:
diff changeset
368 Node_Notes* _default_node_notes; // default notes for new nodes
a61af66fc99e Initial load
duke
parents:
diff changeset
369
a61af66fc99e Initial load
duke
parents:
diff changeset
370 // After parsing and every bulk phase we hang onto the Root instruction.
a61af66fc99e Initial load
duke
parents:
diff changeset
371 // The RootNode instruction is where the whole program begins. It produces
a61af66fc99e Initial load
duke
parents:
diff changeset
372 // the initial Control and BOTTOM for everybody else.
a61af66fc99e Initial load
duke
parents:
diff changeset
373
a61af66fc99e Initial load
duke
parents:
diff changeset
374 // Type management
a61af66fc99e Initial load
duke
parents:
diff changeset
375 Arena _Compile_types; // Arena for all types
a61af66fc99e Initial load
duke
parents:
diff changeset
376 Arena* _type_arena; // Alias for _Compile_types except in Initialize_shared()
a61af66fc99e Initial load
duke
parents:
diff changeset
377 Dict* _type_dict; // Intern table
a61af66fc99e Initial load
duke
parents:
diff changeset
378 void* _type_hwm; // Last allocation (see Type::operator new/delete)
a61af66fc99e Initial load
duke
parents:
diff changeset
379 size_t _type_last_size; // Last allocation size (see Type::operator new/delete)
a61af66fc99e Initial load
duke
parents:
diff changeset
380 ciMethod* _last_tf_m; // Cache for
a61af66fc99e Initial load
duke
parents:
diff changeset
381 const TypeFunc* _last_tf; // TypeFunc::make
a61af66fc99e Initial load
duke
parents:
diff changeset
382 AliasType** _alias_types; // List of alias types seen so far.
a61af66fc99e Initial load
duke
parents:
diff changeset
383 int _num_alias_types; // Logical length of _alias_types
a61af66fc99e Initial load
duke
parents:
diff changeset
384 int _max_alias_types; // Physical length of _alias_types
a61af66fc99e Initial load
duke
parents:
diff changeset
385 AliasCacheEntry _alias_cache[AliasCacheSize]; // Gets aliases w/o data structure walking
a61af66fc99e Initial load
duke
parents:
diff changeset
386
a61af66fc99e Initial load
duke
parents:
diff changeset
387 // Parsing, optimization
a61af66fc99e Initial load
duke
parents:
diff changeset
388 PhaseGVN* _initial_gvn; // Results of parse-time PhaseGVN
a61af66fc99e Initial load
duke
parents:
diff changeset
389 Unique_Node_List* _for_igvn; // Initial work-list for next round of Iterative GVN
a61af66fc99e Initial load
duke
parents:
diff changeset
390 WarmCallInfo* _warm_calls; // Sorted work-list for heat-based inlining.
a61af66fc99e Initial load
duke
parents:
diff changeset
391
7473
d092d1b31229 8005071: Incremental inlining for JSR 292
roland
parents: 7421
diff changeset
392 GrowableArray<CallGenerator*> _late_inlines; // List of CallGenerators to be revisited after
d092d1b31229 8005071: Incremental inlining for JSR 292
roland
parents: 7421
diff changeset
393 // main parsing has finished.
d092d1b31229 8005071: Incremental inlining for JSR 292
roland
parents: 7421
diff changeset
394 GrowableArray<CallGenerator*> _string_late_inlines; // same but for string operations
d092d1b31229 8005071: Incremental inlining for JSR 292
roland
parents: 7421
diff changeset
395
10278
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 8695
diff changeset
396 GrowableArray<CallGenerator*> _boxing_late_inlines; // same but for boxing operations
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 8695
diff changeset
397
7473
d092d1b31229 8005071: Incremental inlining for JSR 292
roland
parents: 7421
diff changeset
398 int _late_inlines_pos; // Where in the queue should the next late inlining candidate go (emulate depth first inlining)
d092d1b31229 8005071: Incremental inlining for JSR 292
roland
parents: 7421
diff changeset
399 uint _number_of_mh_late_inlines; // number of method handle late inlining still pending
d092d1b31229 8005071: Incremental inlining for JSR 292
roland
parents: 7421
diff changeset
400
1080
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 948
diff changeset
401
7421
ad5dd04754ee 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 7196
diff changeset
402 // Inlining may not happen in parse order which would make
ad5dd04754ee 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 7196
diff changeset
403 // PrintInlining output confusing. Keep track of PrintInlining
ad5dd04754ee 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 7196
diff changeset
404 // pieces in order.
ad5dd04754ee 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 7196
diff changeset
405 class PrintInliningBuffer : public ResourceObj {
ad5dd04754ee 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 7196
diff changeset
406 private:
ad5dd04754ee 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 7196
diff changeset
407 CallGenerator* _cg;
ad5dd04754ee 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 7196
diff changeset
408 stringStream* _ss;
ad5dd04754ee 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 7196
diff changeset
409
ad5dd04754ee 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 7196
diff changeset
410 public:
ad5dd04754ee 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 7196
diff changeset
411 PrintInliningBuffer()
ad5dd04754ee 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 7196
diff changeset
412 : _cg(NULL) { _ss = new stringStream(); }
ad5dd04754ee 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 7196
diff changeset
413
ad5dd04754ee 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 7196
diff changeset
414 stringStream* ss() const { return _ss; }
ad5dd04754ee 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 7196
diff changeset
415 CallGenerator* cg() const { return _cg; }
ad5dd04754ee 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 7196
diff changeset
416 void set_cg(CallGenerator* cg) { _cg = cg; }
ad5dd04754ee 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 7196
diff changeset
417 };
ad5dd04754ee 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 7196
diff changeset
418
ad5dd04754ee 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 7196
diff changeset
419 GrowableArray<PrintInliningBuffer>* _print_inlining_list;
12295
1b64d46620a3 8022585: VM crashes when ran with -XX:+PrintInlining
kvn
parents: 12190
diff changeset
420 int _print_inlining_idx;
7421
ad5dd04754ee 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 7196
diff changeset
421
8048
8b3da8d14c93 7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents: 7478
diff changeset
422 // Only keep nodes in the expensive node list that need to be optimized
8b3da8d14c93 7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents: 7478
diff changeset
423 void cleanup_expensive_nodes(PhaseIterGVN &igvn);
8b3da8d14c93 7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents: 7478
diff changeset
424 // Use for sorting expensive nodes to bring similar nodes together
8b3da8d14c93 7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents: 7478
diff changeset
425 static int cmp_expensive_nodes(Node** n1, Node** n2);
8b3da8d14c93 7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents: 7478
diff changeset
426 // Expensive nodes list already sorted?
8b3da8d14c93 7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents: 7478
diff changeset
427 bool expensive_nodes_sorted() const;
12966
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12956
diff changeset
428 // Remove the speculative part of types and clean up the graph
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12956
diff changeset
429 void remove_speculative_types(PhaseIterGVN &igvn);
8048
8b3da8d14c93 7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents: 7478
diff changeset
430
12956
3213ba4d3dff 8024069: replace_in_map() should operate on parent maps
roland
parents: 12295
diff changeset
431 // Are we within a PreserveJVMState block?
3213ba4d3dff 8024069: replace_in_map() should operate on parent maps
roland
parents: 12295
diff changeset
432 int _preserve_jvm_state;
3213ba4d3dff 8024069: replace_in_map() should operate on parent maps
roland
parents: 12295
diff changeset
433
17622
849eb7bfceac 8028468: Add inlining information into ciReplay
kvn
parents: 13400
diff changeset
434 void* _replay_inline_data; // Pointer to data loaded from file
849eb7bfceac 8028468: Add inlining information into ciReplay
kvn
parents: 13400
diff changeset
435
7421
ad5dd04754ee 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 7196
diff changeset
436 public:
ad5dd04754ee 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 7196
diff changeset
437
ad5dd04754ee 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 7196
diff changeset
438 outputStream* print_inlining_stream() const {
12295
1b64d46620a3 8022585: VM crashes when ran with -XX:+PrintInlining
kvn
parents: 12190
diff changeset
439 return _print_inlining_list->adr_at(_print_inlining_idx)->ss();
7421
ad5dd04754ee 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 7196
diff changeset
440 }
ad5dd04754ee 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 7196
diff changeset
441
ad5dd04754ee 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 7196
diff changeset
442 void print_inlining_skip(CallGenerator* cg) {
12295
1b64d46620a3 8022585: VM crashes when ran with -XX:+PrintInlining
kvn
parents: 12190
diff changeset
443 if (_print_inlining) {
1b64d46620a3 8022585: VM crashes when ran with -XX:+PrintInlining
kvn
parents: 12190
diff changeset
444 _print_inlining_list->adr_at(_print_inlining_idx)->set_cg(cg);
1b64d46620a3 8022585: VM crashes when ran with -XX:+PrintInlining
kvn
parents: 12190
diff changeset
445 _print_inlining_idx++;
1b64d46620a3 8022585: VM crashes when ran with -XX:+PrintInlining
kvn
parents: 12190
diff changeset
446 _print_inlining_list->insert_before(_print_inlining_idx, PrintInliningBuffer());
7421
ad5dd04754ee 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 7196
diff changeset
447 }
ad5dd04754ee 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 7196
diff changeset
448 }
ad5dd04754ee 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 7196
diff changeset
449
ad5dd04754ee 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 7196
diff changeset
450 void print_inlining_insert(CallGenerator* cg) {
12295
1b64d46620a3 8022585: VM crashes when ran with -XX:+PrintInlining
kvn
parents: 12190
diff changeset
451 if (_print_inlining) {
7421
ad5dd04754ee 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 7196
diff changeset
452 for (int i = 0; i < _print_inlining_list->length(); i++) {
12295
1b64d46620a3 8022585: VM crashes when ran with -XX:+PrintInlining
kvn
parents: 12190
diff changeset
453 if (_print_inlining_list->adr_at(i)->cg() == cg) {
7421
ad5dd04754ee 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 7196
diff changeset
454 _print_inlining_list->insert_before(i+1, PrintInliningBuffer());
12295
1b64d46620a3 8022585: VM crashes when ran with -XX:+PrintInlining
kvn
parents: 12190
diff changeset
455 _print_inlining_idx = i+1;
1b64d46620a3 8022585: VM crashes when ran with -XX:+PrintInlining
kvn
parents: 12190
diff changeset
456 _print_inlining_list->adr_at(i)->set_cg(NULL);
7421
ad5dd04754ee 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 7196
diff changeset
457 return;
ad5dd04754ee 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 7196
diff changeset
458 }
ad5dd04754ee 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 7196
diff changeset
459 }
ad5dd04754ee 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 7196
diff changeset
460 ShouldNotReachHere();
ad5dd04754ee 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 7196
diff changeset
461 }
ad5dd04754ee 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 7196
diff changeset
462 }
ad5dd04754ee 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 7196
diff changeset
463
ad5dd04754ee 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 7196
diff changeset
464 void print_inlining(ciMethod* method, int inline_level, int bci, const char* msg = NULL) {
ad5dd04754ee 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 7196
diff changeset
465 stringStream ss;
ad5dd04754ee 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 7196
diff changeset
466 CompileTask::print_inlining(&ss, method, inline_level, bci, msg);
ad5dd04754ee 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 7196
diff changeset
467 print_inlining_stream()->print(ss.as_string());
ad5dd04754ee 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 7196
diff changeset
468 }
ad5dd04754ee 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 7196
diff changeset
469
17622
849eb7bfceac 8028468: Add inlining information into ciReplay
kvn
parents: 13400
diff changeset
470 void* replay_inline_data() const { return _replay_inline_data; }
849eb7bfceac 8028468: Add inlining information into ciReplay
kvn
parents: 13400
diff changeset
471
849eb7bfceac 8028468: Add inlining information into ciReplay
kvn
parents: 13400
diff changeset
472 // Dump inlining replay data to the stream.
849eb7bfceac 8028468: Add inlining information into ciReplay
kvn
parents: 13400
diff changeset
473 void dump_inline_data(outputStream* out);
849eb7bfceac 8028468: Add inlining information into ciReplay
kvn
parents: 13400
diff changeset
474
7421
ad5dd04754ee 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 7196
diff changeset
475 private:
0
a61af66fc99e Initial load
duke
parents:
diff changeset
476 // Matching, CFG layout, allocation, code generation
a61af66fc99e Initial load
duke
parents:
diff changeset
477 PhaseCFG* _cfg; // Results of CFG finding
a61af66fc99e Initial load
duke
parents:
diff changeset
478 bool _select_24_bit_instr; // We selected an instruction with a 24-bit result
a61af66fc99e Initial load
duke
parents:
diff changeset
479 bool _in_24_bit_fp_mode; // We are emitting instructions with 24-bit results
859
ea3f9723b5cf 6860599: nodes limit could be reached during Output phase
kvn
parents: 418
diff changeset
480 int _java_calls; // Number of java calls in the method
ea3f9723b5cf 6860599: nodes limit could be reached during Output phase
kvn
parents: 418
diff changeset
481 int _inner_loops; // Number of inner loops in the method
0
a61af66fc99e Initial load
duke
parents:
diff changeset
482 Matcher* _matcher; // Engine to map ideal to machine instructions
a61af66fc99e Initial load
duke
parents:
diff changeset
483 PhaseRegAlloc* _regalloc; // Results of register allocation.
a61af66fc99e Initial load
duke
parents:
diff changeset
484 int _frame_slots; // Size of total frame in stack slots
a61af66fc99e Initial load
duke
parents:
diff changeset
485 CodeOffsets _code_offsets; // Offsets into the code for various interesting entries
a61af66fc99e Initial load
duke
parents:
diff changeset
486 RegMask _FIRST_STACK_mask; // All stack slots usable for spills (depends on frame layout)
a61af66fc99e Initial load
duke
parents:
diff changeset
487 Arena* _indexSet_arena; // control IndexSet allocation within PhaseChaitin
a61af66fc99e Initial load
duke
parents:
diff changeset
488 void* _indexSet_free_block_list; // free list of IndexSet bit blocks
a61af66fc99e Initial load
duke
parents:
diff changeset
489
a61af66fc99e Initial load
duke
parents:
diff changeset
490 uint _node_bundling_limit;
a61af66fc99e Initial load
duke
parents:
diff changeset
491 Bundle* _node_bundling_base; // Information for instruction bundling
a61af66fc99e Initial load
duke
parents:
diff changeset
492
a61af66fc99e Initial load
duke
parents:
diff changeset
493 // Instruction bits passed off to the VM
a61af66fc99e Initial load
duke
parents:
diff changeset
494 int _method_size; // Size of nmethod code segment in bytes
a61af66fc99e Initial load
duke
parents:
diff changeset
495 CodeBuffer _code_buffer; // Where the code is assembled
a61af66fc99e Initial load
duke
parents:
diff changeset
496 int _first_block_size; // Size of unvalidated entry point code / OSR poison code
a61af66fc99e Initial load
duke
parents:
diff changeset
497 ExceptionHandlerTable _handler_table; // Table of native-code exception handlers
a61af66fc99e Initial load
duke
parents:
diff changeset
498 ImplicitExceptionTable _inc_table; // Table of implicit null checks in native code
a61af66fc99e Initial load
duke
parents:
diff changeset
499 OopMapSet* _oop_map_set; // Table of oop maps (one for each safepoint location)
a61af66fc99e Initial load
duke
parents:
diff changeset
500 static int _CompiledZap_count; // counter compared against CompileZap[First/Last]
a61af66fc99e Initial load
duke
parents:
diff changeset
501 BufferBlob* _scratch_buffer_blob; // For temporary code buffers.
a61af66fc99e Initial load
duke
parents:
diff changeset
502 relocInfo* _scratch_locs_memory; // For temporary code buffers.
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
503 int _scratch_const_size; // For temporary code buffers.
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
504 bool _in_scratch_emit_size; // true when in scratch_emit_size.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
505
a61af66fc99e Initial load
duke
parents:
diff changeset
506 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
507 // Accessors
a61af66fc99e Initial load
duke
parents:
diff changeset
508
a61af66fc99e Initial load
duke
parents:
diff changeset
509 // The Compile instance currently active in this (compiler) thread.
a61af66fc99e Initial load
duke
parents:
diff changeset
510 static Compile* current() {
a61af66fc99e Initial load
duke
parents:
diff changeset
511 return (Compile*) ciEnv::current()->compiler_data();
a61af66fc99e Initial load
duke
parents:
diff changeset
512 }
a61af66fc99e Initial load
duke
parents:
diff changeset
513
a61af66fc99e Initial load
duke
parents:
diff changeset
514 // ID for this compilation. Useful for setting breakpoints in the debugger.
a61af66fc99e Initial load
duke
parents:
diff changeset
515 int compile_id() const { return _compile_id; }
a61af66fc99e Initial load
duke
parents:
diff changeset
516
a61af66fc99e Initial load
duke
parents:
diff changeset
517 // Does this compilation allow instructions to subsume loads? User
a61af66fc99e Initial load
duke
parents:
diff changeset
518 // instructions that subsume a load may result in an unschedulable
a61af66fc99e Initial load
duke
parents:
diff changeset
519 // instruction sequence.
a61af66fc99e Initial load
duke
parents:
diff changeset
520 bool subsume_loads() const { return _subsume_loads; }
10278
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 8695
diff changeset
521 /** Do escape analysis. */
38
b789bcaf2dd9 6667610: (Escape Analysis) retry compilation without EA if it fails
kvn
parents: 0
diff changeset
522 bool do_escape_analysis() const { return _do_escape_analysis; }
10278
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 8695
diff changeset
523 /** Do boxing elimination. */
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 8695
diff changeset
524 bool eliminate_boxing() const { return _eliminate_boxing; }
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 8695
diff changeset
525 /** Do aggressive boxing elimination. */
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 8695
diff changeset
526 bool aggressive_unboxing() const { return _eliminate_boxing && AggressiveUnboxing; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
527 bool save_argument_registers() const { return _save_argument_registers; }
a61af66fc99e Initial load
duke
parents:
diff changeset
528
a61af66fc99e Initial load
duke
parents:
diff changeset
529
a61af66fc99e Initial load
duke
parents:
diff changeset
530 // Other fixed compilation parameters.
a61af66fc99e Initial load
duke
parents:
diff changeset
531 ciMethod* method() const { return _method; }
a61af66fc99e Initial load
duke
parents:
diff changeset
532 int entry_bci() const { return _entry_bci; }
a61af66fc99e Initial load
duke
parents:
diff changeset
533 bool is_osr_compilation() const { return _entry_bci != InvocationEntryBci; }
a61af66fc99e Initial load
duke
parents:
diff changeset
534 bool is_method_compilation() const { return (_method != NULL && !_method->flags().is_native()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
535 const TypeFunc* tf() const { assert(_tf!=NULL, ""); return _tf; }
a61af66fc99e Initial load
duke
parents:
diff changeset
536 void init_tf(const TypeFunc* tf) { assert(_tf==NULL, ""); _tf = tf; }
a61af66fc99e Initial load
duke
parents:
diff changeset
537 InlineTree* ilt() const { return _ilt; }
a61af66fc99e Initial load
duke
parents:
diff changeset
538 address stub_function() const { return _stub_function; }
a61af66fc99e Initial load
duke
parents:
diff changeset
539 const char* stub_name() const { return _stub_name; }
a61af66fc99e Initial load
duke
parents:
diff changeset
540 address stub_entry_point() const { return _stub_entry_point; }
a61af66fc99e Initial load
duke
parents:
diff changeset
541
a61af66fc99e Initial load
duke
parents:
diff changeset
542 // Control of this compilation.
a61af66fc99e Initial load
duke
parents:
diff changeset
543 int fixed_slots() const { assert(_fixed_slots >= 0, ""); return _fixed_slots; }
a61af66fc99e Initial load
duke
parents:
diff changeset
544 void set_fixed_slots(int n) { _fixed_slots = n; }
a61af66fc99e Initial load
duke
parents:
diff changeset
545 int major_progress() const { return _major_progress; }
7473
d092d1b31229 8005071: Incremental inlining for JSR 292
roland
parents: 7421
diff changeset
546 void set_inlining_progress(bool z) { _inlining_progress = z; }
d092d1b31229 8005071: Incremental inlining for JSR 292
roland
parents: 7421
diff changeset
547 int inlining_progress() const { return _inlining_progress; }
d092d1b31229 8005071: Incremental inlining for JSR 292
roland
parents: 7421
diff changeset
548 void set_inlining_incrementally(bool z) { _inlining_incrementally = z; }
d092d1b31229 8005071: Incremental inlining for JSR 292
roland
parents: 7421
diff changeset
549 int inlining_incrementally() const { return _inlining_incrementally; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
550 void set_major_progress() { _major_progress++; }
a61af66fc99e Initial load
duke
parents:
diff changeset
551 void clear_major_progress() { _major_progress = 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
552 int num_loop_opts() const { return _num_loop_opts; }
a61af66fc99e Initial load
duke
parents:
diff changeset
553 void set_num_loop_opts(int n) { _num_loop_opts = n; }
a61af66fc99e Initial load
duke
parents:
diff changeset
554 int max_inline_size() const { return _max_inline_size; }
a61af66fc99e Initial load
duke
parents:
diff changeset
555 void set_freq_inline_size(int n) { _freq_inline_size = n; }
a61af66fc99e Initial load
duke
parents:
diff changeset
556 int freq_inline_size() const { return _freq_inline_size; }
a61af66fc99e Initial load
duke
parents:
diff changeset
557 void set_max_inline_size(int n) { _max_inline_size = n; }
a61af66fc99e Initial load
duke
parents:
diff changeset
558 bool has_loops() const { return _has_loops; }
a61af66fc99e Initial load
duke
parents:
diff changeset
559 void set_has_loops(bool z) { _has_loops = z; }
a61af66fc99e Initial load
duke
parents:
diff changeset
560 bool has_split_ifs() const { return _has_split_ifs; }
a61af66fc99e Initial load
duke
parents:
diff changeset
561 void set_has_split_ifs(bool z) { _has_split_ifs = z; }
a61af66fc99e Initial load
duke
parents:
diff changeset
562 bool has_unsafe_access() const { return _has_unsafe_access; }
a61af66fc99e Initial load
duke
parents:
diff changeset
563 void set_has_unsafe_access(bool z) { _has_unsafe_access = z; }
1080
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 948
diff changeset
564 bool has_stringbuilder() const { return _has_stringbuilder; }
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 948
diff changeset
565 void set_has_stringbuilder(bool z) { _has_stringbuilder = z; }
10278
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 8695
diff changeset
566 bool has_boxed_value() const { return _has_boxed_value; }
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 8695
diff changeset
567 void set_has_boxed_value(bool z) { _has_boxed_value = z; }
6792
137868b7aa6f 7196199: java/text/Bidi/Bug6665028.java failed: Bidi run count incorrect
kvn
parents: 6725
diff changeset
568 int max_vector_size() const { return _max_vector_size; }
137868b7aa6f 7196199: java/text/Bidi/Bug6665028.java failed: Bidi run count incorrect
kvn
parents: 6725
diff changeset
569 void set_max_vector_size(int s) { _max_vector_size = s; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
570 void set_trap_count(uint r, uint c) { assert(r < trapHistLength, "oob"); _trap_hist[r] = c; }
a61af66fc99e Initial load
duke
parents:
diff changeset
571 uint trap_count(uint r) const { assert(r < trapHistLength, "oob"); return _trap_hist[r]; }
a61af66fc99e Initial load
duke
parents:
diff changeset
572 bool trap_can_recompile() const { return _trap_can_recompile; }
a61af66fc99e Initial load
duke
parents:
diff changeset
573 void set_trap_can_recompile(bool z) { _trap_can_recompile = z; }
a61af66fc99e Initial load
duke
parents:
diff changeset
574 uint decompile_count() const { return _decompile_count; }
a61af66fc99e Initial load
duke
parents:
diff changeset
575 void set_decompile_count(uint c) { _decompile_count = c; }
a61af66fc99e Initial load
duke
parents:
diff changeset
576 bool allow_range_check_smearing() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
577 bool do_inlining() const { return _do_inlining; }
a61af66fc99e Initial load
duke
parents:
diff changeset
578 void set_do_inlining(bool z) { _do_inlining = z; }
a61af66fc99e Initial load
duke
parents:
diff changeset
579 bool do_scheduling() const { return _do_scheduling; }
a61af66fc99e Initial load
duke
parents:
diff changeset
580 void set_do_scheduling(bool z) { _do_scheduling = z; }
418
72c5366e5d86 6743900: frequency based block layout
rasbold
parents: 367
diff changeset
581 bool do_freq_based_layout() const{ return _do_freq_based_layout; }
72c5366e5d86 6743900: frequency based block layout
rasbold
parents: 367
diff changeset
582 void set_do_freq_based_layout(bool z){ _do_freq_based_layout = z; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
583 bool do_count_invocations() const{ return _do_count_invocations; }
a61af66fc99e Initial load
duke
parents:
diff changeset
584 void set_do_count_invocations(bool z){ _do_count_invocations = z; }
a61af66fc99e Initial load
duke
parents:
diff changeset
585 bool do_method_data_update() const { return _do_method_data_update; }
a61af66fc99e Initial load
duke
parents:
diff changeset
586 void set_do_method_data_update(bool z) { _do_method_data_update = z; }
a61af66fc99e Initial load
duke
parents:
diff changeset
587 int AliasLevel() const { return _AliasLevel; }
a61af66fc99e Initial load
duke
parents:
diff changeset
588 bool print_assembly() const { return _print_assembly; }
a61af66fc99e Initial load
duke
parents:
diff changeset
589 void set_print_assembly(bool z) { _print_assembly = z; }
12295
1b64d46620a3 8022585: VM crashes when ran with -XX:+PrintInlining
kvn
parents: 12190
diff changeset
590 bool print_inlining() const { return _print_inlining; }
1b64d46620a3 8022585: VM crashes when ran with -XX:+PrintInlining
kvn
parents: 12190
diff changeset
591 void set_print_inlining(bool z) { _print_inlining = z; }
1b64d46620a3 8022585: VM crashes when ran with -XX:+PrintInlining
kvn
parents: 12190
diff changeset
592 bool print_intrinsics() const { return _print_intrinsics; }
1b64d46620a3 8022585: VM crashes when ran with -XX:+PrintInlining
kvn
parents: 12190
diff changeset
593 void set_print_intrinsics(bool z) { _print_intrinsics = z; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
594 // check the CompilerOracle for special behaviours for this compile
a61af66fc99e Initial load
duke
parents:
diff changeset
595 bool method_has_option(const char * option) {
a61af66fc99e Initial load
duke
parents:
diff changeset
596 return method() != NULL && method()->has_option(option);
a61af66fc99e Initial load
duke
parents:
diff changeset
597 }
a61af66fc99e Initial load
duke
parents:
diff changeset
598 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
599 bool trace_opto_output() const { return _trace_opto_output; }
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
600 bool parsed_irreducible_loop() const { return _parsed_irreducible_loop; }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
601 void set_parsed_irreducible_loop(bool z) { _parsed_irreducible_loop = z; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
602 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
603
1265
b4b440360f1e 6926782: CodeBuffer size too small after 6921352
twisti
parents: 1172
diff changeset
604 // JSR 292
b4b440360f1e 6926782: CodeBuffer size too small after 6921352
twisti
parents: 1172
diff changeset
605 bool has_method_handle_invokes() const { return _has_method_handle_invokes; }
b4b440360f1e 6926782: CodeBuffer size too small after 6921352
twisti
parents: 1172
diff changeset
606 void set_has_method_handle_invokes(bool z) { _has_method_handle_invokes = z; }
b4b440360f1e 6926782: CodeBuffer size too small after 6921352
twisti
parents: 1172
diff changeset
607
13400
86e6d691f2e1 8028128: Add a type safe alternative for working with counter based data
mgronlun
parents: 13045
diff changeset
608 Ticks _latest_stage_start_counter;
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10278
diff changeset
609
0
a61af66fc99e Initial load
duke
parents:
diff changeset
610 void begin_method() {
a61af66fc99e Initial load
duke
parents:
diff changeset
611 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
612 if (_printer) _printer->begin_method(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
613 #endif
13400
86e6d691f2e1 8028128: Add a type safe alternative for working with counter based data
mgronlun
parents: 13045
diff changeset
614 C->_latest_stage_start_counter.stamp();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
615 }
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10278
diff changeset
616
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10278
diff changeset
617 void print_method(CompilerPhaseType cpt, int level = 1) {
13400
86e6d691f2e1 8028128: Add a type safe alternative for working with counter based data
mgronlun
parents: 13045
diff changeset
618 EventCompilerPhase event;
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10278
diff changeset
619 if (event.should_commit()) {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10278
diff changeset
620 event.set_starttime(C->_latest_stage_start_counter);
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10278
diff changeset
621 event.set_phase((u1) cpt);
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10278
diff changeset
622 event.set_compileID(C->_compile_id);
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10278
diff changeset
623 event.set_phaseLevel(level);
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10278
diff changeset
624 event.commit();
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10278
diff changeset
625 }
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10278
diff changeset
626
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10278
diff changeset
627
0
a61af66fc99e Initial load
duke
parents:
diff changeset
628 #ifndef PRODUCT
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10278
diff changeset
629 if (_printer) _printer->print_method(this, CompilerPhaseTypeHelper::to_string(cpt), level);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
630 #endif
13400
86e6d691f2e1 8028128: Add a type safe alternative for working with counter based data
mgronlun
parents: 13045
diff changeset
631 C->_latest_stage_start_counter.stamp();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
632 }
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10278
diff changeset
633
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10278
diff changeset
634 void end_method(int level = 1) {
13400
86e6d691f2e1 8028128: Add a type safe alternative for working with counter based data
mgronlun
parents: 13045
diff changeset
635 EventCompilerPhase event;
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10278
diff changeset
636 if (event.should_commit()) {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10278
diff changeset
637 event.set_starttime(C->_latest_stage_start_counter);
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10278
diff changeset
638 event.set_phase((u1) PHASE_END);
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10278
diff changeset
639 event.set_compileID(C->_compile_id);
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10278
diff changeset
640 event.set_phaseLevel(level);
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10278
diff changeset
641 event.commit();
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10278
diff changeset
642 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
643 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
644 if (_printer) _printer->end_method();
a61af66fc99e Initial load
duke
parents:
diff changeset
645 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
646 }
a61af66fc99e Initial load
duke
parents:
diff changeset
647
10278
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 8695
diff changeset
648 int macro_count() const { return _macro_nodes->length(); }
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 8695
diff changeset
649 int predicate_count() const { return _predicate_opaqs->length();}
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 8695
diff changeset
650 int expensive_count() const { return _expensive_nodes->length(); }
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 8695
diff changeset
651 Node* macro_node(int idx) const { return _macro_nodes->at(idx); }
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 8695
diff changeset
652 Node* predicate_opaque1_node(int idx) const { return _predicate_opaqs->at(idx);}
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 8695
diff changeset
653 Node* expensive_node(int idx) const { return _expensive_nodes->at(idx); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
654 ConnectionGraph* congraph() { return _congraph;}
1634
60a14ad85270 6966411: escape.cpp:450 assert(base->Opcode() == Op_ConP
kvn
parents: 1552
diff changeset
655 void set_congraph(ConnectionGraph* congraph) { _congraph = congraph;}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
656 void add_macro_node(Node * n) {
a61af66fc99e Initial load
duke
parents:
diff changeset
657 //assert(n->is_macro(), "must be a macro node");
a61af66fc99e Initial load
duke
parents:
diff changeset
658 assert(!_macro_nodes->contains(n), " duplicate entry in expand list");
a61af66fc99e Initial load
duke
parents:
diff changeset
659 _macro_nodes->append(n);
a61af66fc99e Initial load
duke
parents:
diff changeset
660 }
a61af66fc99e Initial load
duke
parents:
diff changeset
661 void remove_macro_node(Node * n) {
a61af66fc99e Initial load
duke
parents:
diff changeset
662 // this function may be called twice for a node so check
a61af66fc99e Initial load
duke
parents:
diff changeset
663 // that the node is in the array before attempting to remove it
a61af66fc99e Initial load
duke
parents:
diff changeset
664 if (_macro_nodes->contains(n))
a61af66fc99e Initial load
duke
parents:
diff changeset
665 _macro_nodes->remove(n);
1172
b2b6a9bf6238 6894779: Loop Predication for Loop Optimizer in C2
cfang
parents: 1080
diff changeset
666 // remove from _predicate_opaqs list also if it is there
b2b6a9bf6238 6894779: Loop Predication for Loop Optimizer in C2
cfang
parents: 1080
diff changeset
667 if (predicate_count() > 0 && _predicate_opaqs->contains(n)){
b2b6a9bf6238 6894779: Loop Predication for Loop Optimizer in C2
cfang
parents: 1080
diff changeset
668 _predicate_opaqs->remove(n);
b2b6a9bf6238 6894779: Loop Predication for Loop Optimizer in C2
cfang
parents: 1080
diff changeset
669 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
670 }
8048
8b3da8d14c93 7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents: 7478
diff changeset
671 void add_expensive_node(Node * n);
8b3da8d14c93 7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents: 7478
diff changeset
672 void remove_expensive_node(Node * n) {
8b3da8d14c93 7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents: 7478
diff changeset
673 if (_expensive_nodes->contains(n)) {
8b3da8d14c93 7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents: 7478
diff changeset
674 _expensive_nodes->remove(n);
8b3da8d14c93 7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents: 7478
diff changeset
675 }
8b3da8d14c93 7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents: 7478
diff changeset
676 }
1172
b2b6a9bf6238 6894779: Loop Predication for Loop Optimizer in C2
cfang
parents: 1080
diff changeset
677 void add_predicate_opaq(Node * n) {
b2b6a9bf6238 6894779: Loop Predication for Loop Optimizer in C2
cfang
parents: 1080
diff changeset
678 assert(!_predicate_opaqs->contains(n), " duplicate entry in predicate opaque1");
b2b6a9bf6238 6894779: Loop Predication for Loop Optimizer in C2
cfang
parents: 1080
diff changeset
679 assert(_macro_nodes->contains(n), "should have already been in macro list");
b2b6a9bf6238 6894779: Loop Predication for Loop Optimizer in C2
cfang
parents: 1080
diff changeset
680 _predicate_opaqs->append(n);
b2b6a9bf6238 6894779: Loop Predication for Loop Optimizer in C2
cfang
parents: 1080
diff changeset
681 }
b2b6a9bf6238 6894779: Loop Predication for Loop Optimizer in C2
cfang
parents: 1080
diff changeset
682 // remove the opaque nodes that protect the predicates so that the unused checks and
b2b6a9bf6238 6894779: Loop Predication for Loop Optimizer in C2
cfang
parents: 1080
diff changeset
683 // uncommon traps will be eliminated from the graph.
b2b6a9bf6238 6894779: Loop Predication for Loop Optimizer in C2
cfang
parents: 1080
diff changeset
684 void cleanup_loop_predicates(PhaseIterGVN &igvn);
2445
08eb13460b3a 7004535: Clone loop predicate during loop unswitch
kvn
parents: 2376
diff changeset
685 bool is_predicate_opaq(Node * n) {
08eb13460b3a 7004535: Clone loop predicate during loop unswitch
kvn
parents: 2376
diff changeset
686 return _predicate_opaqs->contains(n);
08eb13460b3a 7004535: Clone loop predicate during loop unswitch
kvn
parents: 2376
diff changeset
687 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
688
8048
8b3da8d14c93 7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents: 7478
diff changeset
689 // Are there candidate expensive nodes for optimization?
8b3da8d14c93 7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents: 7478
diff changeset
690 bool should_optimize_expensive_nodes(PhaseIterGVN &igvn);
8b3da8d14c93 7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents: 7478
diff changeset
691 // Check whether n1 and n2 are similar
8b3da8d14c93 7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents: 7478
diff changeset
692 static int cmp_expensive_nodes(Node* n1, Node* n2);
8b3da8d14c93 7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents: 7478
diff changeset
693 // Sort expensive nodes to locate similar expensive nodes
8b3da8d14c93 7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents: 7478
diff changeset
694 void sort_expensive_nodes();
8b3da8d14c93 7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents: 7478
diff changeset
695
0
a61af66fc99e Initial load
duke
parents:
diff changeset
696 // Compilation environment.
a61af66fc99e Initial load
duke
parents:
diff changeset
697 Arena* comp_arena() { return &_comp_arena; }
a61af66fc99e Initial load
duke
parents:
diff changeset
698 ciEnv* env() const { return _env; }
a61af66fc99e Initial load
duke
parents:
diff changeset
699 CompileLog* log() const { return _log; }
a61af66fc99e Initial load
duke
parents:
diff changeset
700 bool failing() const { return _env->failing() || _failure_reason != NULL; }
7196
2aff40cb4703 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 6888
diff changeset
701 const char* failure_reason() { return _failure_reason; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
702 bool failure_reason_is(const char* r) { return (r==_failure_reason) || (r!=NULL && _failure_reason!=NULL && strcmp(r, _failure_reason)==0); }
a61af66fc99e Initial load
duke
parents:
diff changeset
703
a61af66fc99e Initial load
duke
parents:
diff changeset
704 void record_failure(const char* reason);
a61af66fc99e Initial load
duke
parents:
diff changeset
705 void record_method_not_compilable(const char* reason, bool all_tiers = false) {
a61af66fc99e Initial load
duke
parents:
diff changeset
706 // All bailouts cover "all_tiers" when TieredCompilation is off.
a61af66fc99e Initial load
duke
parents:
diff changeset
707 if (!TieredCompilation) all_tiers = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
708 env()->record_method_not_compilable(reason, all_tiers);
a61af66fc99e Initial load
duke
parents:
diff changeset
709 // Record failure reason.
a61af66fc99e Initial load
duke
parents:
diff changeset
710 record_failure(reason);
a61af66fc99e Initial load
duke
parents:
diff changeset
711 }
a61af66fc99e Initial load
duke
parents:
diff changeset
712 void record_method_not_compilable_all_tiers(const char* reason) {
a61af66fc99e Initial load
duke
parents:
diff changeset
713 record_method_not_compilable(reason, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
714 }
a61af66fc99e Initial load
duke
parents:
diff changeset
715 bool check_node_count(uint margin, const char* reason) {
7196
2aff40cb4703 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 6888
diff changeset
716 if (live_nodes() + margin > (uint)MaxNodeLimit) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
717 record_method_not_compilable(reason);
a61af66fc99e Initial load
duke
parents:
diff changeset
718 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
719 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
720 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
721 }
a61af66fc99e Initial load
duke
parents:
diff changeset
722 }
a61af66fc99e Initial load
duke
parents:
diff changeset
723
a61af66fc99e Initial load
duke
parents:
diff changeset
724 // Node management
7196
2aff40cb4703 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 6888
diff changeset
725 uint unique() const { return _unique; }
2aff40cb4703 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 6888
diff changeset
726 uint next_unique() { return _unique++; }
2aff40cb4703 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 6888
diff changeset
727 void set_unique(uint i) { _unique = i; }
2aff40cb4703 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 6888
diff changeset
728 static int debug_idx() { return debug_only(_debug_idx)+0; }
2aff40cb4703 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 6888
diff changeset
729 static void set_debug_idx(int i) { debug_only(_debug_idx = i); }
2aff40cb4703 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 6888
diff changeset
730 Arena* node_arena() { return &_node_arena; }
2aff40cb4703 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 6888
diff changeset
731 Arena* old_arena() { return &_old_arena; }
2aff40cb4703 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 6888
diff changeset
732 RootNode* root() const { return _root; }
2aff40cb4703 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 6888
diff changeset
733 void set_root(RootNode* r) { _root = r; }
2aff40cb4703 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 6888
diff changeset
734 StartNode* start() const; // (Derived from root.)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
735 void init_start(StartNode* s);
7196
2aff40cb4703 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 6888
diff changeset
736 Node* immutable_memory();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
737
7196
2aff40cb4703 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 6888
diff changeset
738 Node* recent_alloc_ctl() const { return _recent_alloc_ctl; }
2aff40cb4703 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 6888
diff changeset
739 Node* recent_alloc_obj() const { return _recent_alloc_obj; }
2aff40cb4703 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 6888
diff changeset
740 void set_recent_alloc(Node* ctl, Node* obj) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
741 _recent_alloc_ctl = ctl;
a61af66fc99e Initial load
duke
parents:
diff changeset
742 _recent_alloc_obj = obj;
7196
2aff40cb4703 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 6888
diff changeset
743 }
2aff40cb4703 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 6888
diff changeset
744 void record_dead_node(uint idx) { if (_dead_node_list.test_set(idx)) return;
2aff40cb4703 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 6888
diff changeset
745 _dead_node_count++;
2aff40cb4703 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 6888
diff changeset
746 }
8695
ff55877839bc 8009472: Print additional information for 8004640 failure
kvn
parents: 8691
diff changeset
747 bool is_dead_node(uint idx) { return _dead_node_list.test(idx) != 0; }
7196
2aff40cb4703 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 6888
diff changeset
748 uint dead_node_count() { return _dead_node_count; }
2aff40cb4703 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 6888
diff changeset
749 void reset_dead_node_list() { _dead_node_list.Reset();
2aff40cb4703 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 6888
diff changeset
750 _dead_node_count = 0;
2aff40cb4703 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 6888
diff changeset
751 }
7421
ad5dd04754ee 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 7196
diff changeset
752 uint live_nodes() const {
7196
2aff40cb4703 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 6888
diff changeset
753 int val = _unique - _dead_node_count;
2aff40cb4703 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 6888
diff changeset
754 assert (val >= 0, err_msg_res("number of tracked dead nodes %d more than created nodes %d", _unique, _dead_node_count));
2aff40cb4703 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 6888
diff changeset
755 return (uint) val;
2aff40cb4703 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 6888
diff changeset
756 }
2aff40cb4703 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 6888
diff changeset
757 #ifdef ASSERT
2aff40cb4703 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 6888
diff changeset
758 uint count_live_nodes_by_graph_walk();
2aff40cb4703 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 6888
diff changeset
759 void print_missing_nodes();
2aff40cb4703 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 6888
diff changeset
760 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
761
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
762 // Constant table
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
763 ConstantTable& constant_table() { return _constant_table; }
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
764
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
765 MachConstantBaseNode* mach_constant_base_node();
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
766 bool has_mach_constant_base_node() const { return _mach_constant_base_node != NULL; }
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
767
0
a61af66fc99e Initial load
duke
parents:
diff changeset
768 // Handy undefined Node
a61af66fc99e Initial load
duke
parents:
diff changeset
769 Node* top() const { return _top; }
a61af66fc99e Initial load
duke
parents:
diff changeset
770
a61af66fc99e Initial load
duke
parents:
diff changeset
771 // these are used by guys who need to know about creation and transformation of top:
a61af66fc99e Initial load
duke
parents:
diff changeset
772 Node* cached_top_node() { return _top; }
a61af66fc99e Initial load
duke
parents:
diff changeset
773 void set_cached_top_node(Node* tn);
a61af66fc99e Initial load
duke
parents:
diff changeset
774
a61af66fc99e Initial load
duke
parents:
diff changeset
775 GrowableArray<Node_Notes*>* node_note_array() const { return _node_note_array; }
a61af66fc99e Initial load
duke
parents:
diff changeset
776 void set_node_note_array(GrowableArray<Node_Notes*>* arr) { _node_note_array = arr; }
a61af66fc99e Initial load
duke
parents:
diff changeset
777 Node_Notes* default_node_notes() const { return _default_node_notes; }
a61af66fc99e Initial load
duke
parents:
diff changeset
778 void set_default_node_notes(Node_Notes* n) { _default_node_notes = n; }
a61af66fc99e Initial load
duke
parents:
diff changeset
779
a61af66fc99e Initial load
duke
parents:
diff changeset
780 Node_Notes* node_notes_at(int idx) {
a61af66fc99e Initial load
duke
parents:
diff changeset
781 return locate_node_notes(_node_note_array, idx, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
782 }
a61af66fc99e Initial load
duke
parents:
diff changeset
783 inline bool set_node_notes_at(int idx, Node_Notes* value);
a61af66fc99e Initial load
duke
parents:
diff changeset
784
a61af66fc99e Initial load
duke
parents:
diff changeset
785 // Copy notes from source to dest, if they exist.
a61af66fc99e Initial load
duke
parents:
diff changeset
786 // Overwrite dest only if source provides something.
a61af66fc99e Initial load
duke
parents:
diff changeset
787 // Return true if information was moved.
a61af66fc99e Initial load
duke
parents:
diff changeset
788 bool copy_node_notes_to(Node* dest, Node* source);
a61af66fc99e Initial load
duke
parents:
diff changeset
789
a61af66fc99e Initial load
duke
parents:
diff changeset
790 // Workhorse function to sort out the blocked Node_Notes array:
a61af66fc99e Initial load
duke
parents:
diff changeset
791 inline Node_Notes* locate_node_notes(GrowableArray<Node_Notes*>* arr,
a61af66fc99e Initial load
duke
parents:
diff changeset
792 int idx, bool can_grow = false);
a61af66fc99e Initial load
duke
parents:
diff changeset
793
a61af66fc99e Initial load
duke
parents:
diff changeset
794 void grow_node_notes(GrowableArray<Node_Notes*>* arr, int grow_by);
a61af66fc99e Initial load
duke
parents:
diff changeset
795
a61af66fc99e Initial load
duke
parents:
diff changeset
796 // Type management
a61af66fc99e Initial load
duke
parents:
diff changeset
797 Arena* type_arena() { return _type_arena; }
a61af66fc99e Initial load
duke
parents:
diff changeset
798 Dict* type_dict() { return _type_dict; }
a61af66fc99e Initial load
duke
parents:
diff changeset
799 void* type_hwm() { return _type_hwm; }
a61af66fc99e Initial load
duke
parents:
diff changeset
800 size_t type_last_size() { return _type_last_size; }
a61af66fc99e Initial load
duke
parents:
diff changeset
801 int num_alias_types() { return _num_alias_types; }
a61af66fc99e Initial load
duke
parents:
diff changeset
802
a61af66fc99e Initial load
duke
parents:
diff changeset
803 void init_type_arena() { _type_arena = &_Compile_types; }
a61af66fc99e Initial load
duke
parents:
diff changeset
804 void set_type_arena(Arena* a) { _type_arena = a; }
a61af66fc99e Initial load
duke
parents:
diff changeset
805 void set_type_dict(Dict* d) { _type_dict = d; }
a61af66fc99e Initial load
duke
parents:
diff changeset
806 void set_type_hwm(void* p) { _type_hwm = p; }
a61af66fc99e Initial load
duke
parents:
diff changeset
807 void set_type_last_size(size_t sz) { _type_last_size = sz; }
a61af66fc99e Initial load
duke
parents:
diff changeset
808
a61af66fc99e Initial load
duke
parents:
diff changeset
809 const TypeFunc* last_tf(ciMethod* m) {
a61af66fc99e Initial load
duke
parents:
diff changeset
810 return (m == _last_tf_m) ? _last_tf : NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
811 }
a61af66fc99e Initial load
duke
parents:
diff changeset
812 void set_last_tf(ciMethod* m, const TypeFunc* tf) {
a61af66fc99e Initial load
duke
parents:
diff changeset
813 assert(m != NULL || tf == NULL, "");
a61af66fc99e Initial load
duke
parents:
diff changeset
814 _last_tf_m = m;
a61af66fc99e Initial load
duke
parents:
diff changeset
815 _last_tf = tf;
a61af66fc99e Initial load
duke
parents:
diff changeset
816 }
a61af66fc99e Initial load
duke
parents:
diff changeset
817
a61af66fc99e Initial load
duke
parents:
diff changeset
818 AliasType* alias_type(int idx) { assert(idx < num_alias_types(), "oob"); return _alias_types[idx]; }
2376
c7f3d0b4570f 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 2008
diff changeset
819 AliasType* alias_type(const TypePtr* adr_type, ciField* field = NULL) { return find_alias_type(adr_type, false, field); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
820 bool have_alias_type(const TypePtr* adr_type);
a61af66fc99e Initial load
duke
parents:
diff changeset
821 AliasType* alias_type(ciField* field);
a61af66fc99e Initial load
duke
parents:
diff changeset
822
a61af66fc99e Initial load
duke
parents:
diff changeset
823 int get_alias_index(const TypePtr* at) { return alias_type(at)->index(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
824 const TypePtr* get_adr_type(uint aidx) { return alias_type(aidx)->adr_type(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
825 int get_general_index(uint aidx) { return alias_type(aidx)->general_index(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
826
a61af66fc99e Initial load
duke
parents:
diff changeset
827 // Building nodes
a61af66fc99e Initial load
duke
parents:
diff changeset
828 void rethrow_exceptions(JVMState* jvms);
a61af66fc99e Initial load
duke
parents:
diff changeset
829 void return_values(JVMState* jvms);
a61af66fc99e Initial load
duke
parents:
diff changeset
830 JVMState* build_start_state(StartNode* start, const TypeFunc* tf);
a61af66fc99e Initial load
duke
parents:
diff changeset
831
a61af66fc99e Initial load
duke
parents:
diff changeset
832 // Decide how to build a call.
a61af66fc99e Initial load
duke
parents:
diff changeset
833 // The profile factor is a discount to apply to this site's interp. profile.
12956
3213ba4d3dff 8024069: replace_in_map() should operate on parent maps
roland
parents: 12295
diff changeset
834 CallGenerator* call_generator(ciMethod* call_method, int vtable_index, bool call_does_dispatch,
12966
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12956
diff changeset
835 JVMState* jvms, bool allow_inline, float profile_factor, ciKlass* speculative_receiver_type = NULL,
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12956
diff changeset
836 bool allow_intrinsics = true, bool delayed_forbidden = false);
10278
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 8695
diff changeset
837 bool should_delay_inlining(ciMethod* call_method, JVMState* jvms) {
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 8695
diff changeset
838 return should_delay_string_inlining(call_method, jvms) ||
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 8695
diff changeset
839 should_delay_boxing_inlining(call_method, jvms);
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 8695
diff changeset
840 }
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 8695
diff changeset
841 bool should_delay_string_inlining(ciMethod* call_method, JVMState* jvms);
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 8695
diff changeset
842 bool should_delay_boxing_inlining(ciMethod* call_method, JVMState* jvms);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
843
7478
5698813d45eb 8005418: JSR 292: virtual dispatch bug in 292 impl
twisti
parents: 7473
diff changeset
844 // Helper functions to identify inlining potential at call-site
5698813d45eb 8005418: JSR 292: virtual dispatch bug in 292 impl
twisti
parents: 7473
diff changeset
845 ciMethod* optimize_virtual_call(ciMethod* caller, int bci, ciInstanceKlass* klass,
5698813d45eb 8005418: JSR 292: virtual dispatch bug in 292 impl
twisti
parents: 7473
diff changeset
846 ciMethod* callee, const TypeOopPtr* receiver_type,
5698813d45eb 8005418: JSR 292: virtual dispatch bug in 292 impl
twisti
parents: 7473
diff changeset
847 bool is_virtual,
5698813d45eb 8005418: JSR 292: virtual dispatch bug in 292 impl
twisti
parents: 7473
diff changeset
848 bool &call_does_dispatch, int &vtable_index);
5698813d45eb 8005418: JSR 292: virtual dispatch bug in 292 impl
twisti
parents: 7473
diff changeset
849 ciMethod* optimize_inlining(ciMethod* caller, int bci, ciInstanceKlass* klass,
5698813d45eb 8005418: JSR 292: virtual dispatch bug in 292 impl
twisti
parents: 7473
diff changeset
850 ciMethod* callee, const TypeOopPtr* receiver_type);
5698813d45eb 8005418: JSR 292: virtual dispatch bug in 292 impl
twisti
parents: 7473
diff changeset
851
0
a61af66fc99e Initial load
duke
parents:
diff changeset
852 // Report if there were too many traps at a current method and bci.
a61af66fc99e Initial load
duke
parents:
diff changeset
853 // Report if a trap was recorded, and/or PerMethodTrapLimit was exceeded.
a61af66fc99e Initial load
duke
parents:
diff changeset
854 // If there is no MDO at all, report no trap unless told to assume it.
a61af66fc99e Initial load
duke
parents:
diff changeset
855 bool too_many_traps(ciMethod* method, int bci, Deoptimization::DeoptReason reason);
a61af66fc99e Initial load
duke
parents:
diff changeset
856 // This version, unspecific to a particular bci, asks if
a61af66fc99e Initial load
duke
parents:
diff changeset
857 // PerMethodTrapLimit was exceeded for all inlined methods seen so far.
a61af66fc99e Initial load
duke
parents:
diff changeset
858 bool too_many_traps(Deoptimization::DeoptReason reason,
a61af66fc99e Initial load
duke
parents:
diff changeset
859 // Privately used parameter for logging:
a61af66fc99e Initial load
duke
parents:
diff changeset
860 ciMethodData* logmd = NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
861 // Report if there were too many recompiles at a method and bci.
a61af66fc99e Initial load
duke
parents:
diff changeset
862 bool too_many_recompiles(ciMethod* method, int bci, Deoptimization::DeoptReason reason);
a61af66fc99e Initial load
duke
parents:
diff changeset
863
a61af66fc99e Initial load
duke
parents:
diff changeset
864 // Parsing, optimization
a61af66fc99e Initial load
duke
parents:
diff changeset
865 PhaseGVN* initial_gvn() { return _initial_gvn; }
a61af66fc99e Initial load
duke
parents:
diff changeset
866 Unique_Node_List* for_igvn() { return _for_igvn; }
a61af66fc99e Initial load
duke
parents:
diff changeset
867 inline void record_for_igvn(Node* n); // Body is after class Unique_Node_List.
a61af66fc99e Initial load
duke
parents:
diff changeset
868 void set_initial_gvn(PhaseGVN *gvn) { _initial_gvn = gvn; }
a61af66fc99e Initial load
duke
parents:
diff changeset
869 void set_for_igvn(Unique_Node_List *for_igvn) { _for_igvn = for_igvn; }
a61af66fc99e Initial load
duke
parents:
diff changeset
870
1080
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 948
diff changeset
871 // Replace n by nn using initial_gvn, calling hash_delete and
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 948
diff changeset
872 // record_for_igvn as needed.
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 948
diff changeset
873 void gvn_replace_by(Node* n, Node* nn);
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 948
diff changeset
874
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 948
diff changeset
875
0
a61af66fc99e Initial load
duke
parents:
diff changeset
876 void identify_useful_nodes(Unique_Node_List &useful);
7196
2aff40cb4703 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 6888
diff changeset
877 void update_dead_node_list(Unique_Node_List &useful);
7421
ad5dd04754ee 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 7196
diff changeset
878 void remove_useless_nodes (Unique_Node_List &useful);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
879
a61af66fc99e Initial load
duke
parents:
diff changeset
880 WarmCallInfo* warm_calls() const { return _warm_calls; }
a61af66fc99e Initial load
duke
parents:
diff changeset
881 void set_warm_calls(WarmCallInfo* l) { _warm_calls = l; }
a61af66fc99e Initial load
duke
parents:
diff changeset
882 WarmCallInfo* pop_warm_call();
a61af66fc99e Initial load
duke
parents:
diff changeset
883
1080
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 948
diff changeset
884 // Record this CallGenerator for inlining at the end of parsing.
7473
d092d1b31229 8005071: Incremental inlining for JSR 292
roland
parents: 7421
diff changeset
885 void add_late_inline(CallGenerator* cg) {
d092d1b31229 8005071: Incremental inlining for JSR 292
roland
parents: 7421
diff changeset
886 _late_inlines.insert_before(_late_inlines_pos, cg);
d092d1b31229 8005071: Incremental inlining for JSR 292
roland
parents: 7421
diff changeset
887 _late_inlines_pos++;
d092d1b31229 8005071: Incremental inlining for JSR 292
roland
parents: 7421
diff changeset
888 }
d092d1b31229 8005071: Incremental inlining for JSR 292
roland
parents: 7421
diff changeset
889
d092d1b31229 8005071: Incremental inlining for JSR 292
roland
parents: 7421
diff changeset
890 void prepend_late_inline(CallGenerator* cg) {
d092d1b31229 8005071: Incremental inlining for JSR 292
roland
parents: 7421
diff changeset
891 _late_inlines.insert_before(0, cg);
d092d1b31229 8005071: Incremental inlining for JSR 292
roland
parents: 7421
diff changeset
892 }
d092d1b31229 8005071: Incremental inlining for JSR 292
roland
parents: 7421
diff changeset
893
d092d1b31229 8005071: Incremental inlining for JSR 292
roland
parents: 7421
diff changeset
894 void add_string_late_inline(CallGenerator* cg) {
d092d1b31229 8005071: Incremental inlining for JSR 292
roland
parents: 7421
diff changeset
895 _string_late_inlines.push(cg);
d092d1b31229 8005071: Incremental inlining for JSR 292
roland
parents: 7421
diff changeset
896 }
d092d1b31229 8005071: Incremental inlining for JSR 292
roland
parents: 7421
diff changeset
897
10278
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 8695
diff changeset
898 void add_boxing_late_inline(CallGenerator* cg) {
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 8695
diff changeset
899 _boxing_late_inlines.push(cg);
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 8695
diff changeset
900 }
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 8695
diff changeset
901
7473
d092d1b31229 8005071: Incremental inlining for JSR 292
roland
parents: 7421
diff changeset
902 void remove_useless_late_inlines(GrowableArray<CallGenerator*>* inlines, Unique_Node_List &useful);
1080
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 948
diff changeset
903
7421
ad5dd04754ee 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 7196
diff changeset
904 void dump_inlining();
ad5dd04754ee 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 7196
diff changeset
905
7473
d092d1b31229 8005071: Incremental inlining for JSR 292
roland
parents: 7421
diff changeset
906 bool over_inlining_cutoff() const {
d092d1b31229 8005071: Incremental inlining for JSR 292
roland
parents: 7421
diff changeset
907 if (!inlining_incrementally()) {
d092d1b31229 8005071: Incremental inlining for JSR 292
roland
parents: 7421
diff changeset
908 return unique() > (uint)NodeCountInliningCutoff;
d092d1b31229 8005071: Incremental inlining for JSR 292
roland
parents: 7421
diff changeset
909 } else {
d092d1b31229 8005071: Incremental inlining for JSR 292
roland
parents: 7421
diff changeset
910 return live_nodes() > (uint)LiveNodeCountInliningCutoff;
d092d1b31229 8005071: Incremental inlining for JSR 292
roland
parents: 7421
diff changeset
911 }
d092d1b31229 8005071: Incremental inlining for JSR 292
roland
parents: 7421
diff changeset
912 }
d092d1b31229 8005071: Incremental inlining for JSR 292
roland
parents: 7421
diff changeset
913
d092d1b31229 8005071: Incremental inlining for JSR 292
roland
parents: 7421
diff changeset
914 void inc_number_of_mh_late_inlines() { _number_of_mh_late_inlines++; }
d092d1b31229 8005071: Incremental inlining for JSR 292
roland
parents: 7421
diff changeset
915 void dec_number_of_mh_late_inlines() { assert(_number_of_mh_late_inlines > 0, "_number_of_mh_late_inlines < 0 !"); _number_of_mh_late_inlines--; }
d092d1b31229 8005071: Incremental inlining for JSR 292
roland
parents: 7421
diff changeset
916 bool has_mh_late_inlines() const { return _number_of_mh_late_inlines > 0; }
d092d1b31229 8005071: Incremental inlining for JSR 292
roland
parents: 7421
diff changeset
917
d092d1b31229 8005071: Incremental inlining for JSR 292
roland
parents: 7421
diff changeset
918 void inline_incrementally_one(PhaseIterGVN& igvn);
d092d1b31229 8005071: Incremental inlining for JSR 292
roland
parents: 7421
diff changeset
919 void inline_incrementally(PhaseIterGVN& igvn);
d092d1b31229 8005071: Incremental inlining for JSR 292
roland
parents: 7421
diff changeset
920 void inline_string_calls(bool parse_time);
10278
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 8695
diff changeset
921 void inline_boxing_calls(PhaseIterGVN& igvn);
7473
d092d1b31229 8005071: Incremental inlining for JSR 292
roland
parents: 7421
diff changeset
922
0
a61af66fc99e Initial load
duke
parents:
diff changeset
923 // Matching, CFG layout, allocation, code generation
a61af66fc99e Initial load
duke
parents:
diff changeset
924 PhaseCFG* cfg() { return _cfg; }
a61af66fc99e Initial load
duke
parents:
diff changeset
925 bool select_24_bit_instr() const { return _select_24_bit_instr; }
a61af66fc99e Initial load
duke
parents:
diff changeset
926 bool in_24_bit_fp_mode() const { return _in_24_bit_fp_mode; }
859
ea3f9723b5cf 6860599: nodes limit could be reached during Output phase
kvn
parents: 418
diff changeset
927 bool has_java_calls() const { return _java_calls > 0; }
ea3f9723b5cf 6860599: nodes limit could be reached during Output phase
kvn
parents: 418
diff changeset
928 int java_calls() const { return _java_calls; }
ea3f9723b5cf 6860599: nodes limit could be reached during Output phase
kvn
parents: 418
diff changeset
929 int inner_loops() const { return _inner_loops; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
930 Matcher* matcher() { return _matcher; }
a61af66fc99e Initial load
duke
parents:
diff changeset
931 PhaseRegAlloc* regalloc() { return _regalloc; }
a61af66fc99e Initial load
duke
parents:
diff changeset
932 int frame_slots() const { return _frame_slots; }
a61af66fc99e Initial load
duke
parents:
diff changeset
933 int frame_size_in_words() const; // frame_slots in units of the polymorphic 'words'
a61af66fc99e Initial load
duke
parents:
diff changeset
934 RegMask& FIRST_STACK_mask() { return _FIRST_STACK_mask; }
a61af66fc99e Initial load
duke
parents:
diff changeset
935 Arena* indexSet_arena() { return _indexSet_arena; }
a61af66fc99e Initial load
duke
parents:
diff changeset
936 void* indexSet_free_block_list() { return _indexSet_free_block_list; }
a61af66fc99e Initial load
duke
parents:
diff changeset
937 uint node_bundling_limit() { return _node_bundling_limit; }
a61af66fc99e Initial load
duke
parents:
diff changeset
938 Bundle* node_bundling_base() { return _node_bundling_base; }
a61af66fc99e Initial load
duke
parents:
diff changeset
939 void set_node_bundling_limit(uint n) { _node_bundling_limit = n; }
a61af66fc99e Initial load
duke
parents:
diff changeset
940 void set_node_bundling_base(Bundle* b) { _node_bundling_base = b; }
a61af66fc99e Initial load
duke
parents:
diff changeset
941 bool starts_bundle(const Node *n) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
942 bool need_stack_bang(int frame_size_in_bytes) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
943 bool need_register_stack_bang() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
944
a61af66fc99e Initial load
duke
parents:
diff changeset
945 void set_matcher(Matcher* m) { _matcher = m; }
a61af66fc99e Initial load
duke
parents:
diff changeset
946 //void set_regalloc(PhaseRegAlloc* ra) { _regalloc = ra; }
a61af66fc99e Initial load
duke
parents:
diff changeset
947 void set_indexSet_arena(Arena* a) { _indexSet_arena = a; }
a61af66fc99e Initial load
duke
parents:
diff changeset
948 void set_indexSet_free_block_list(void* p) { _indexSet_free_block_list = p; }
a61af66fc99e Initial load
duke
parents:
diff changeset
949
a61af66fc99e Initial load
duke
parents:
diff changeset
950 // Remember if this compilation changes hardware mode to 24-bit precision
a61af66fc99e Initial load
duke
parents:
diff changeset
951 void set_24_bit_selection_and_mode(bool selection, bool mode) {
a61af66fc99e Initial load
duke
parents:
diff changeset
952 _select_24_bit_instr = selection;
a61af66fc99e Initial load
duke
parents:
diff changeset
953 _in_24_bit_fp_mode = mode;
a61af66fc99e Initial load
duke
parents:
diff changeset
954 }
a61af66fc99e Initial load
duke
parents:
diff changeset
955
859
ea3f9723b5cf 6860599: nodes limit could be reached during Output phase
kvn
parents: 418
diff changeset
956 void set_java_calls(int z) { _java_calls = z; }
ea3f9723b5cf 6860599: nodes limit could be reached during Output phase
kvn
parents: 418
diff changeset
957 void set_inner_loops(int z) { _inner_loops = z; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
958
a61af66fc99e Initial load
duke
parents:
diff changeset
959 // Instruction bits passed off to the VM
a61af66fc99e Initial load
duke
parents:
diff changeset
960 int code_size() { return _method_size; }
a61af66fc99e Initial load
duke
parents:
diff changeset
961 CodeBuffer* code_buffer() { return &_code_buffer; }
a61af66fc99e Initial load
duke
parents:
diff changeset
962 int first_block_size() { return _first_block_size; }
a61af66fc99e Initial load
duke
parents:
diff changeset
963 void set_frame_complete(int off) { _code_offsets.set_value(CodeOffsets::Frame_Complete, off); }
a61af66fc99e Initial load
duke
parents:
diff changeset
964 ExceptionHandlerTable* handler_table() { return &_handler_table; }
a61af66fc99e Initial load
duke
parents:
diff changeset
965 ImplicitExceptionTable* inc_table() { return &_inc_table; }
a61af66fc99e Initial load
duke
parents:
diff changeset
966 OopMapSet* oop_map_set() { return _oop_map_set; }
a61af66fc99e Initial load
duke
parents:
diff changeset
967 DebugInformationRecorder* debug_info() { return env()->debug_info(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
968 Dependencies* dependencies() { return env()->dependencies(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
969 static int CompiledZap_count() { return _CompiledZap_count; }
a61af66fc99e Initial load
duke
parents:
diff changeset
970 BufferBlob* scratch_buffer_blob() { return _scratch_buffer_blob; }
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
971 void init_scratch_buffer_blob(int const_size);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
972 void clear_scratch_buffer_blob();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
973 void set_scratch_buffer_blob(BufferBlob* b) { _scratch_buffer_blob = b; }
a61af66fc99e Initial load
duke
parents:
diff changeset
974 relocInfo* scratch_locs_memory() { return _scratch_locs_memory; }
a61af66fc99e Initial load
duke
parents:
diff changeset
975 void set_scratch_locs_memory(relocInfo* b) { _scratch_locs_memory = b; }
a61af66fc99e Initial load
duke
parents:
diff changeset
976
a61af66fc99e Initial load
duke
parents:
diff changeset
977 // emit to scratch blob, report resulting size
a61af66fc99e Initial load
duke
parents:
diff changeset
978 uint scratch_emit_size(const Node* n);
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
979 void set_in_scratch_emit_size(bool x) { _in_scratch_emit_size = x; }
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
980 bool in_scratch_emit_size() const { return _in_scratch_emit_size; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
981
a61af66fc99e Initial load
duke
parents:
diff changeset
982 enum ScratchBufferBlob {
a61af66fc99e Initial load
duke
parents:
diff changeset
983 MAX_inst_size = 1024,
a61af66fc99e Initial load
duke
parents:
diff changeset
984 MAX_locs_size = 128, // number of relocInfo elements
a61af66fc99e Initial load
duke
parents:
diff changeset
985 MAX_const_size = 128,
a61af66fc99e Initial load
duke
parents:
diff changeset
986 MAX_stubs_size = 128
a61af66fc99e Initial load
duke
parents:
diff changeset
987 };
a61af66fc99e Initial load
duke
parents:
diff changeset
988
a61af66fc99e Initial load
duke
parents:
diff changeset
989 // Major entry point. Given a Scope, compile the associated method.
a61af66fc99e Initial load
duke
parents:
diff changeset
990 // For normal compilations, entry_bci is InvocationEntryBci. For on stack
a61af66fc99e Initial load
duke
parents:
diff changeset
991 // replacement, entry_bci indicates the bytecode for which to compile a
a61af66fc99e Initial load
duke
parents:
diff changeset
992 // continuation.
a61af66fc99e Initial load
duke
parents:
diff changeset
993 Compile(ciEnv* ci_env, C2Compiler* compiler, ciMethod* target,
10278
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 8695
diff changeset
994 int entry_bci, bool subsume_loads, bool do_escape_analysis,
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 8695
diff changeset
995 bool eliminate_boxing);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
996
a61af66fc99e Initial load
duke
parents:
diff changeset
997 // Second major entry point. From the TypeFunc signature, generate code
a61af66fc99e Initial load
duke
parents:
diff changeset
998 // to pass arguments from the Java calling convention to the C calling
a61af66fc99e Initial load
duke
parents:
diff changeset
999 // convention.
a61af66fc99e Initial load
duke
parents:
diff changeset
1000 Compile(ciEnv* ci_env, const TypeFunc *(*gen)(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1001 address stub_function, const char *stub_name,
a61af66fc99e Initial load
duke
parents:
diff changeset
1002 int is_fancy_jump, bool pass_tls,
a61af66fc99e Initial load
duke
parents:
diff changeset
1003 bool save_arg_registers, bool return_pc);
a61af66fc99e Initial load
duke
parents:
diff changeset
1004
a61af66fc99e Initial load
duke
parents:
diff changeset
1005 // From the TypeFunc signature, generate code to pass arguments
a61af66fc99e Initial load
duke
parents:
diff changeset
1006 // from Compiled calling convention to Interpreter's calling convention
a61af66fc99e Initial load
duke
parents:
diff changeset
1007 void Generate_Compiled_To_Interpreter_Graph(const TypeFunc *tf, address interpreter_entry);
a61af66fc99e Initial load
duke
parents:
diff changeset
1008
a61af66fc99e Initial load
duke
parents:
diff changeset
1009 // From the TypeFunc signature, generate code to pass arguments
a61af66fc99e Initial load
duke
parents:
diff changeset
1010 // from Interpreter's calling convention to Compiler's calling convention
a61af66fc99e Initial load
duke
parents:
diff changeset
1011 void Generate_Interpreter_To_Compiled_Graph(const TypeFunc *tf);
a61af66fc99e Initial load
duke
parents:
diff changeset
1012
a61af66fc99e Initial load
duke
parents:
diff changeset
1013 // Are we compiling a method?
a61af66fc99e Initial load
duke
parents:
diff changeset
1014 bool has_method() { return method() != NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1015
a61af66fc99e Initial load
duke
parents:
diff changeset
1016 // Maybe print some information about this compile.
a61af66fc99e Initial load
duke
parents:
diff changeset
1017 void print_compile_messages();
a61af66fc99e Initial load
duke
parents:
diff changeset
1018
a61af66fc99e Initial load
duke
parents:
diff changeset
1019 // Final graph reshaping, a post-pass after the regular optimizer is done.
a61af66fc99e Initial load
duke
parents:
diff changeset
1020 bool final_graph_reshaping();
a61af66fc99e Initial load
duke
parents:
diff changeset
1021
a61af66fc99e Initial load
duke
parents:
diff changeset
1022 // returns true if adr is completely contained in the given alias category
a61af66fc99e Initial load
duke
parents:
diff changeset
1023 bool must_alias(const TypePtr* adr, int alias_idx);
a61af66fc99e Initial load
duke
parents:
diff changeset
1024
a61af66fc99e Initial load
duke
parents:
diff changeset
1025 // returns true if adr overlaps with the given alias category
a61af66fc99e Initial load
duke
parents:
diff changeset
1026 bool can_alias(const TypePtr* adr, int alias_idx);
a61af66fc99e Initial load
duke
parents:
diff changeset
1027
a61af66fc99e Initial load
duke
parents:
diff changeset
1028 // Driver for converting compiler's IR into machine code bits
a61af66fc99e Initial load
duke
parents:
diff changeset
1029 void Output();
a61af66fc99e Initial load
duke
parents:
diff changeset
1030
a61af66fc99e Initial load
duke
parents:
diff changeset
1031 // Accessors for node bundling info.
a61af66fc99e Initial load
duke
parents:
diff changeset
1032 Bundle* node_bundling(const Node *n);
a61af66fc99e Initial load
duke
parents:
diff changeset
1033 bool valid_bundle_info(const Node *n);
a61af66fc99e Initial load
duke
parents:
diff changeset
1034
a61af66fc99e Initial load
duke
parents:
diff changeset
1035 // Schedule and Bundle the instructions
a61af66fc99e Initial load
duke
parents:
diff changeset
1036 void ScheduleAndBundle();
a61af66fc99e Initial load
duke
parents:
diff changeset
1037
a61af66fc99e Initial load
duke
parents:
diff changeset
1038 // Build OopMaps for each GC point
a61af66fc99e Initial load
duke
parents:
diff changeset
1039 void BuildOopMaps();
63
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 38
diff changeset
1040
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 38
diff changeset
1041 // Append debug info for the node "local" at safepoint node "sfpt" to the
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 38
diff changeset
1042 // "array", May also consult and add to "objs", which describes the
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 38
diff changeset
1043 // scalar-replaced objects.
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 38
diff changeset
1044 void FillLocArray( int idx, MachSafePointNode* sfpt,
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 38
diff changeset
1045 Node *local, GrowableArray<ScopeValue*> *array,
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 38
diff changeset
1046 GrowableArray<ScopeValue*> *objs );
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 38
diff changeset
1047
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 38
diff changeset
1048 // If "objs" contains an ObjectValue whose id is "id", returns it, else NULL.
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 38
diff changeset
1049 static ObjectValue* sv_for_node_id(GrowableArray<ScopeValue*> *objs, int id);
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 38
diff changeset
1050 // Requres that "objs" does not contains an ObjectValue whose id matches
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 38
diff changeset
1051 // that of "sv. Appends "sv".
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 38
diff changeset
1052 static void set_sv_for_object_node(GrowableArray<ScopeValue*> *objs,
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 38
diff changeset
1053 ObjectValue* sv );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1054
a61af66fc99e Initial load
duke
parents:
diff changeset
1055 // Process an OopMap Element while emitting nodes
a61af66fc99e Initial load
duke
parents:
diff changeset
1056 void Process_OopMap_Node(MachNode *mach, int code_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
1057
3851
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 2445
diff changeset
1058 // Initialize code buffer
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 2445
diff changeset
1059 CodeBuffer* init_buffer(uint* blk_starts);
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 2445
diff changeset
1060
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1061 // Write out basic block data to code buffer
3851
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 2445
diff changeset
1062 void fill_buffer(CodeBuffer* cb, uint* blk_starts);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1063
a61af66fc99e Initial load
duke
parents:
diff changeset
1064 // Determine which variable sized branches can be shortened
3851
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 2445
diff changeset
1065 void shorten_branches(uint* blk_starts, int& code_size, int& reloc_size, int& stub_size);
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 2445
diff changeset
1066
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1067 // Compute the size of first NumberOfLoopInstrToAlign instructions
a61af66fc99e Initial load
duke
parents:
diff changeset
1068 // at the head of a loop.
a61af66fc99e Initial load
duke
parents:
diff changeset
1069 void compute_loop_first_inst_sizes();
a61af66fc99e Initial load
duke
parents:
diff changeset
1070
a61af66fc99e Initial load
duke
parents:
diff changeset
1071 // Compute the information for the exception tables
a61af66fc99e Initial load
duke
parents:
diff changeset
1072 void FillExceptionTables(uint cnt, uint *call_returns, uint *inct_starts, Label *blk_labels);
a61af66fc99e Initial load
duke
parents:
diff changeset
1073
a61af66fc99e Initial load
duke
parents:
diff changeset
1074 // Stack slots that may be unused by the calling convention but must
a61af66fc99e Initial load
duke
parents:
diff changeset
1075 // otherwise be preserved. On Intel this includes the return address.
a61af66fc99e Initial load
duke
parents:
diff changeset
1076 // On PowerPC it includes the 4 words holding the old TOC & LR glue.
a61af66fc99e Initial load
duke
parents:
diff changeset
1077 uint in_preserve_stack_slots();
a61af66fc99e Initial load
duke
parents:
diff changeset
1078
a61af66fc99e Initial load
duke
parents:
diff changeset
1079 // "Top of Stack" slots that may be unused by the calling convention but must
a61af66fc99e Initial load
duke
parents:
diff changeset
1080 // otherwise be preserved.
a61af66fc99e Initial load
duke
parents:
diff changeset
1081 // On Intel these are not necessary and the value can be zero.
a61af66fc99e Initial load
duke
parents:
diff changeset
1082 // On Sparc this describes the words reserved for storing a register window
a61af66fc99e Initial load
duke
parents:
diff changeset
1083 // when an interrupt occurs.
a61af66fc99e Initial load
duke
parents:
diff changeset
1084 static uint out_preserve_stack_slots();
a61af66fc99e Initial load
duke
parents:
diff changeset
1085
a61af66fc99e Initial load
duke
parents:
diff changeset
1086 // Number of outgoing stack slots killed above the out_preserve_stack_slots
a61af66fc99e Initial load
duke
parents:
diff changeset
1087 // for calls to C. Supports the var-args backing area for register parms.
a61af66fc99e Initial load
duke
parents:
diff changeset
1088 uint varargs_C_out_slots_killed() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
1089
a61af66fc99e Initial load
duke
parents:
diff changeset
1090 // Number of Stack Slots consumed by a synchronization entry
a61af66fc99e Initial load
duke
parents:
diff changeset
1091 int sync_stack_slots() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
1092
a61af66fc99e Initial load
duke
parents:
diff changeset
1093 // Compute the name of old_SP. See <arch>.ad for frame layout.
a61af66fc99e Initial load
duke
parents:
diff changeset
1094 OptoReg::Name compute_old_SP();
a61af66fc99e Initial load
duke
parents:
diff changeset
1095
a61af66fc99e Initial load
duke
parents:
diff changeset
1096 #ifdef ENABLE_ZAP_DEAD_LOCALS
a61af66fc99e Initial load
duke
parents:
diff changeset
1097 static bool is_node_getting_a_safepoint(Node*);
a61af66fc99e Initial load
duke
parents:
diff changeset
1098 void Insert_zap_nodes();
a61af66fc99e Initial load
duke
parents:
diff changeset
1099 Node* call_zap_node(MachSafePointNode* n, int block_no);
a61af66fc99e Initial load
duke
parents:
diff changeset
1100 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1101
a61af66fc99e Initial load
duke
parents:
diff changeset
1102 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
1103 // Phase control:
a61af66fc99e Initial load
duke
parents:
diff changeset
1104 void Init(int aliaslevel); // Prepare for a single compilation
a61af66fc99e Initial load
duke
parents:
diff changeset
1105 int Inline_Warm(); // Find more inlining work.
a61af66fc99e Initial load
duke
parents:
diff changeset
1106 void Finish_Warm(); // Give up on further inlines.
a61af66fc99e Initial load
duke
parents:
diff changeset
1107 void Optimize(); // Given a graph, optimize it
a61af66fc99e Initial load
duke
parents:
diff changeset
1108 void Code_Gen(); // Generate code from a graph
a61af66fc99e Initial load
duke
parents:
diff changeset
1109
a61af66fc99e Initial load
duke
parents:
diff changeset
1110 // Management of the AliasType table.
a61af66fc99e Initial load
duke
parents:
diff changeset
1111 void grow_alias_types();
a61af66fc99e Initial load
duke
parents:
diff changeset
1112 AliasCacheEntry* probe_alias_cache(const TypePtr* adr_type);
a61af66fc99e Initial load
duke
parents:
diff changeset
1113 const TypePtr *flatten_alias_type(const TypePtr* adr_type) const;
2376
c7f3d0b4570f 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 2008
diff changeset
1114 AliasType* find_alias_type(const TypePtr* adr_type, bool no_create, ciField* field);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1115
a61af66fc99e Initial load
duke
parents:
diff changeset
1116 void verify_top(Node*) const PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
1117
a61af66fc99e Initial load
duke
parents:
diff changeset
1118 // Intrinsic setup.
a61af66fc99e Initial load
duke
parents:
diff changeset
1119 void register_library_intrinsics(); // initializer
a61af66fc99e Initial load
duke
parents:
diff changeset
1120 CallGenerator* make_vm_intrinsic(ciMethod* m, bool is_virtual); // constructor
a61af66fc99e Initial load
duke
parents:
diff changeset
1121 int intrinsic_insertion_index(ciMethod* m, bool is_virtual); // helper
a61af66fc99e Initial load
duke
parents:
diff changeset
1122 CallGenerator* find_intrinsic(ciMethod* m, bool is_virtual); // query fn
a61af66fc99e Initial load
duke
parents:
diff changeset
1123 void register_intrinsic(CallGenerator* cg); // update fn
a61af66fc99e Initial load
duke
parents:
diff changeset
1124
a61af66fc99e Initial load
duke
parents:
diff changeset
1125 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
1126 static juint _intrinsic_hist_count[vmIntrinsics::ID_LIMIT];
a61af66fc99e Initial load
duke
parents:
diff changeset
1127 static jubyte _intrinsic_hist_flags[vmIntrinsics::ID_LIMIT];
a61af66fc99e Initial load
duke
parents:
diff changeset
1128 #endif
7196
2aff40cb4703 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 6888
diff changeset
1129 // Function calls made by the public function final_graph_reshaping.
2aff40cb4703 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 6888
diff changeset
1130 // No need to be made public as they are not called elsewhere.
2aff40cb4703 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 6888
diff changeset
1131 void final_graph_reshaping_impl( Node *n, Final_Reshape_Counts &frc);
2aff40cb4703 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 6888
diff changeset
1132 void final_graph_reshaping_walk( Node_Stack &nstack, Node *root, Final_Reshape_Counts &frc );
2aff40cb4703 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 6888
diff changeset
1133 void eliminate_redundant_card_marks(Node* n);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1134
a61af66fc99e Initial load
duke
parents:
diff changeset
1135 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1136
a61af66fc99e Initial load
duke
parents:
diff changeset
1137 // Note: Histogram array size is about 1 Kb.
a61af66fc99e Initial load
duke
parents:
diff changeset
1138 enum { // flag bits:
a61af66fc99e Initial load
duke
parents:
diff changeset
1139 _intrinsic_worked = 1, // succeeded at least once
a61af66fc99e Initial load
duke
parents:
diff changeset
1140 _intrinsic_failed = 2, // tried it but it failed
a61af66fc99e Initial load
duke
parents:
diff changeset
1141 _intrinsic_disabled = 4, // was requested but disabled (e.g., -XX:-InlineUnsafeOps)
a61af66fc99e Initial load
duke
parents:
diff changeset
1142 _intrinsic_virtual = 8, // was seen in the virtual form (rare)
a61af66fc99e Initial load
duke
parents:
diff changeset
1143 _intrinsic_both = 16 // was seen in the non-virtual form (usual)
a61af66fc99e Initial load
duke
parents:
diff changeset
1144 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1145 // Update histogram. Return boolean if this is a first-time occurrence.
a61af66fc99e Initial load
duke
parents:
diff changeset
1146 static bool gather_intrinsic_statistics(vmIntrinsics::ID id,
a61af66fc99e Initial load
duke
parents:
diff changeset
1147 bool is_virtual, int flags) PRODUCT_RETURN0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1148 static void print_intrinsic_statistics() PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
1149
a61af66fc99e Initial load
duke
parents:
diff changeset
1150 // Graph verification code
a61af66fc99e Initial load
duke
parents:
diff changeset
1151 // Walk the node list, verifying that there is a one-to-one
a61af66fc99e Initial load
duke
parents:
diff changeset
1152 // correspondence between Use-Def edges and Def-Use edges
a61af66fc99e Initial load
duke
parents:
diff changeset
1153 // The option no_dead_code enables stronger checks that the
a61af66fc99e Initial load
duke
parents:
diff changeset
1154 // graph is strongly connected from root in both directions.
a61af66fc99e Initial load
duke
parents:
diff changeset
1155 void verify_graph_edges(bool no_dead_code = false) PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
1156
13045
94a83e0f9ce1 8017065: C2 allows safepoint checks to leak into G1 pre-barriers
iveresov
parents: 12966
diff changeset
1157 // Verify GC barrier patterns
94a83e0f9ce1 8017065: C2 allows safepoint checks to leak into G1 pre-barriers
iveresov
parents: 12966
diff changeset
1158 void verify_barriers() PRODUCT_RETURN;
94a83e0f9ce1 8017065: C2 allows safepoint checks to leak into G1 pre-barriers
iveresov
parents: 12966
diff changeset
1159
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1160 // End-of-run dumps.
a61af66fc99e Initial load
duke
parents:
diff changeset
1161 static void print_statistics() PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
1162
a61af66fc99e Initial load
duke
parents:
diff changeset
1163 // Dump formatted assembly
a61af66fc99e Initial load
duke
parents:
diff changeset
1164 void dump_asm(int *pcs = NULL, uint pc_limit = 0) PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
1165 void dump_pc(int *pcs, int pc_limit, Node *n);
a61af66fc99e Initial load
duke
parents:
diff changeset
1166
a61af66fc99e Initial load
duke
parents:
diff changeset
1167 // Verify ADLC assumptions during startup
a61af66fc99e Initial load
duke
parents:
diff changeset
1168 static void adlc_verification() PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
1169
a61af66fc99e Initial load
duke
parents:
diff changeset
1170 // Definitions of pd methods
a61af66fc99e Initial load
duke
parents:
diff changeset
1171 static void pd_compiler2_init();
8691
571076d3c79d 8009120: Fuzz instruction scheduling in HotSpot compilers
shade
parents: 8048
diff changeset
1172
571076d3c79d 8009120: Fuzz instruction scheduling in HotSpot compilers
shade
parents: 8048
diff changeset
1173 // Auxiliary method for randomized fuzzing/stressing
571076d3c79d 8009120: Fuzz instruction scheduling in HotSpot compilers
shade
parents: 8048
diff changeset
1174 static bool randomized_select(int count);
12956
3213ba4d3dff 8024069: replace_in_map() should operate on parent maps
roland
parents: 12295
diff changeset
1175
3213ba4d3dff 8024069: replace_in_map() should operate on parent maps
roland
parents: 12295
diff changeset
1176 // enter a PreserveJVMState block
3213ba4d3dff 8024069: replace_in_map() should operate on parent maps
roland
parents: 12295
diff changeset
1177 void inc_preserve_jvm_state() {
3213ba4d3dff 8024069: replace_in_map() should operate on parent maps
roland
parents: 12295
diff changeset
1178 _preserve_jvm_state++;
3213ba4d3dff 8024069: replace_in_map() should operate on parent maps
roland
parents: 12295
diff changeset
1179 }
3213ba4d3dff 8024069: replace_in_map() should operate on parent maps
roland
parents: 12295
diff changeset
1180
3213ba4d3dff 8024069: replace_in_map() should operate on parent maps
roland
parents: 12295
diff changeset
1181 // exit a PreserveJVMState block
3213ba4d3dff 8024069: replace_in_map() should operate on parent maps
roland
parents: 12295
diff changeset
1182 void dec_preserve_jvm_state() {
3213ba4d3dff 8024069: replace_in_map() should operate on parent maps
roland
parents: 12295
diff changeset
1183 _preserve_jvm_state--;
3213ba4d3dff 8024069: replace_in_map() should operate on parent maps
roland
parents: 12295
diff changeset
1184 assert(_preserve_jvm_state >= 0, "_preserve_jvm_state shouldn't be negative");
3213ba4d3dff 8024069: replace_in_map() should operate on parent maps
roland
parents: 12295
diff changeset
1185 }
3213ba4d3dff 8024069: replace_in_map() should operate on parent maps
roland
parents: 12295
diff changeset
1186
3213ba4d3dff 8024069: replace_in_map() should operate on parent maps
roland
parents: 12295
diff changeset
1187 bool has_preserve_jvm_state() const {
3213ba4d3dff 8024069: replace_in_map() should operate on parent maps
roland
parents: 12295
diff changeset
1188 return _preserve_jvm_state > 0;
3213ba4d3dff 8024069: replace_in_map() should operate on parent maps
roland
parents: 12295
diff changeset
1189 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1190 };
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1634
diff changeset
1191
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1634
diff changeset
1192 #endif // SHARE_VM_OPTO_COMPILE_HPP