annotate src/share/vm/compiler/methodLiveness.cpp @ 8733:9def4075da6d

8008079: G1: Add nextObject routine to CMBitMapRO and replace nextWord Summary: Update the task local finger to the start of the next object when marking aborts, in order to avoid the redundant scanning of all 0's when the marking task restarts, if otherwise updating to the next word. In addition, reuse the routine nextObject() in routine iterate(). Reviewed-by: johnc, ysr Contributed-by: tamao <tao.mao@oracle.com>
author tamao
date Tue, 05 Mar 2013 15:36:56 -0800
parents 8012aa3ccede
children 78bbf4d43a14
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
2142
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1972
diff changeset
2 * Copyright (c) 1998, 2011, 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: 1135
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1135
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: 1135
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
25 #include "precompiled.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
26 #include "ci/ciMethod.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
27 #include "ci/ciMethodBlocks.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
28 #include "ci/ciStreams.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
29 #include "compiler/methodLiveness.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
30 #include "interpreter/bytecode.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
31 #include "interpreter/bytecodes.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
32 #include "memory/allocation.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
33 #include "utilities/bitMap.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
34
0
a61af66fc99e Initial load
duke
parents:
diff changeset
35 // The MethodLiveness class performs a simple liveness analysis on a method
a61af66fc99e Initial load
duke
parents:
diff changeset
36 // in order to decide which locals are live (that is, will be used again) at
a61af66fc99e Initial load
duke
parents:
diff changeset
37 // a particular bytecode index (bci).
a61af66fc99e Initial load
duke
parents:
diff changeset
38 //
a61af66fc99e Initial load
duke
parents:
diff changeset
39 // The algorithm goes:
a61af66fc99e Initial load
duke
parents:
diff changeset
40 //
a61af66fc99e Initial load
duke
parents:
diff changeset
41 // 1. Break the method into a set of basic blocks. For each basic block we
a61af66fc99e Initial load
duke
parents:
diff changeset
42 // also keep track of its set of predecessors through normal control flow
a61af66fc99e Initial load
duke
parents:
diff changeset
43 // and predecessors through exceptional control flow.
a61af66fc99e Initial load
duke
parents:
diff changeset
44 //
a61af66fc99e Initial load
duke
parents:
diff changeset
45 // 2. For each basic block, compute two sets, gen (the set of values used before
a61af66fc99e Initial load
duke
parents:
diff changeset
46 // they are defined) and kill (the set of values defined before they are used)
a61af66fc99e Initial load
duke
parents:
diff changeset
47 // in the basic block. A basic block "needs" the locals in its gen set to
a61af66fc99e Initial load
duke
parents:
diff changeset
48 // perform its computation. A basic block "provides" values for the locals in
a61af66fc99e Initial load
duke
parents:
diff changeset
49 // its kill set, allowing a need from a successor to be ignored.
a61af66fc99e Initial load
duke
parents:
diff changeset
50 //
a61af66fc99e Initial load
duke
parents:
diff changeset
51 // 3. Liveness information (the set of locals which are needed) is pushed backwards through
a61af66fc99e Initial load
duke
parents:
diff changeset
52 // the program, from blocks to their predecessors. We compute and store liveness
a61af66fc99e Initial load
duke
parents:
diff changeset
53 // information for the normal/exceptional exit paths for each basic block. When
a61af66fc99e Initial load
duke
parents:
diff changeset
54 // this process reaches a fixed point, we are done.
a61af66fc99e Initial load
duke
parents:
diff changeset
55 //
a61af66fc99e Initial load
duke
parents:
diff changeset
56 // 4. When we are asked about the liveness at a particular bci with a basic block, we
a61af66fc99e Initial load
duke
parents:
diff changeset
57 // compute gen/kill sets which represent execution from that bci to the exit of
a61af66fc99e Initial load
duke
parents:
diff changeset
58 // its blocks. We then compose this range gen/kill information with the normal
a61af66fc99e Initial load
duke
parents:
diff changeset
59 // and exceptional exit information for the block to produce liveness information
a61af66fc99e Initial load
duke
parents:
diff changeset
60 // at that bci.
a61af66fc99e Initial load
duke
parents:
diff changeset
61 //
a61af66fc99e Initial load
duke
parents:
diff changeset
62 // The algorithm is approximate in many respects. Notably:
a61af66fc99e Initial load
duke
parents:
diff changeset
63 //
a61af66fc99e Initial load
duke
parents:
diff changeset
64 // 1. We do not do the analysis necessary to match jsr's with the appropriate ret.
a61af66fc99e Initial load
duke
parents:
diff changeset
65 // Instead we make the conservative assumption that any ret can return to any
a61af66fc99e Initial load
duke
parents:
diff changeset
66 // jsr return site.
a61af66fc99e Initial load
duke
parents:
diff changeset
67 // 2. Instead of computing the effects of exceptions at every instruction, we
a61af66fc99e Initial load
duke
parents:
diff changeset
68 // summarize the effects of all exceptional continuations from the block as
a61af66fc99e Initial load
duke
parents:
diff changeset
69 // a single set (_exception_exit), losing some information but simplifying the
a61af66fc99e Initial load
duke
parents:
diff changeset
70 // analysis.
a61af66fc99e Initial load
duke
parents:
diff changeset
71
a61af66fc99e Initial load
duke
parents:
diff changeset
72
a61af66fc99e Initial load
duke
parents:
diff changeset
73 //--------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
74 // The BitCounter class is used for counting the number of bits set in
a61af66fc99e Initial load
duke
parents:
diff changeset
75 // some BitMap. It is only used when collecting liveness statistics.
a61af66fc99e Initial load
duke
parents:
diff changeset
76
a61af66fc99e Initial load
duke
parents:
diff changeset
77 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
78
a61af66fc99e Initial load
duke
parents:
diff changeset
79 class BitCounter: public BitMapClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
80 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
81 int _count;
a61af66fc99e Initial load
duke
parents:
diff changeset
82 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
83 BitCounter() : _count(0) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
84
a61af66fc99e Initial load
duke
parents:
diff changeset
85 // Callback when bit in map is set
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
86 virtual bool do_bit(size_t offset) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
87 _count++;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
88 return true;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
89 }
a61af66fc99e Initial load
duke
parents:
diff changeset
90
a61af66fc99e Initial load
duke
parents:
diff changeset
91 int count() {
a61af66fc99e Initial load
duke
parents:
diff changeset
92 return _count;
a61af66fc99e Initial load
duke
parents:
diff changeset
93 }
a61af66fc99e Initial load
duke
parents:
diff changeset
94 };
a61af66fc99e Initial load
duke
parents:
diff changeset
95
a61af66fc99e Initial load
duke
parents:
diff changeset
96
a61af66fc99e Initial load
duke
parents:
diff changeset
97 //--------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
98
a61af66fc99e Initial load
duke
parents:
diff changeset
99
a61af66fc99e Initial load
duke
parents:
diff changeset
100 // Counts
a61af66fc99e Initial load
duke
parents:
diff changeset
101 long MethodLiveness::_total_bytes = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
102 int MethodLiveness::_total_methods = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
103
a61af66fc99e Initial load
duke
parents:
diff changeset
104 long MethodLiveness::_total_blocks = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
105 int MethodLiveness::_max_method_blocks = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
106
a61af66fc99e Initial load
duke
parents:
diff changeset
107 long MethodLiveness::_total_edges = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
108 int MethodLiveness::_max_block_edges = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
109
a61af66fc99e Initial load
duke
parents:
diff changeset
110 long MethodLiveness::_total_exc_edges = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
111 int MethodLiveness::_max_block_exc_edges = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
112
a61af66fc99e Initial load
duke
parents:
diff changeset
113 long MethodLiveness::_total_method_locals = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
114 int MethodLiveness::_max_method_locals = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
115
a61af66fc99e Initial load
duke
parents:
diff changeset
116 long MethodLiveness::_total_locals_queried = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
117 long MethodLiveness::_total_live_locals_queried = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
118
a61af66fc99e Initial load
duke
parents:
diff changeset
119 long MethodLiveness::_total_visits = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
120
a61af66fc99e Initial load
duke
parents:
diff changeset
121 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
122
a61af66fc99e Initial load
duke
parents:
diff changeset
123 // Timers
a61af66fc99e Initial load
duke
parents:
diff changeset
124 elapsedTimer MethodLiveness::_time_build_graph;
a61af66fc99e Initial load
duke
parents:
diff changeset
125 elapsedTimer MethodLiveness::_time_gen_kill;
a61af66fc99e Initial load
duke
parents:
diff changeset
126 elapsedTimer MethodLiveness::_time_flow;
a61af66fc99e Initial load
duke
parents:
diff changeset
127 elapsedTimer MethodLiveness::_time_query;
a61af66fc99e Initial load
duke
parents:
diff changeset
128 elapsedTimer MethodLiveness::_time_total;
a61af66fc99e Initial load
duke
parents:
diff changeset
129
a61af66fc99e Initial load
duke
parents:
diff changeset
130 MethodLiveness::MethodLiveness(Arena* arena, ciMethod* method)
a61af66fc99e Initial load
duke
parents:
diff changeset
131 #ifdef COMPILER1
a61af66fc99e Initial load
duke
parents:
diff changeset
132 : _bci_block_start((uintptr_t*)arena->Amalloc((method->code_size() >> LogBitsPerByte) + 1), method->code_size())
a61af66fc99e Initial load
duke
parents:
diff changeset
133 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
134 {
a61af66fc99e Initial load
duke
parents:
diff changeset
135 _arena = arena;
a61af66fc99e Initial load
duke
parents:
diff changeset
136 _method = method;
a61af66fc99e Initial load
duke
parents:
diff changeset
137 _bit_map_size_bits = method->max_locals();
a61af66fc99e Initial load
duke
parents:
diff changeset
138 _bit_map_size_words = (_bit_map_size_bits / sizeof(unsigned int)) + 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
139
a61af66fc99e Initial load
duke
parents:
diff changeset
140 #ifdef COMPILER1
a61af66fc99e Initial load
duke
parents:
diff changeset
141 _bci_block_start.clear();
a61af66fc99e Initial load
duke
parents:
diff changeset
142 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
143 }
a61af66fc99e Initial load
duke
parents:
diff changeset
144
a61af66fc99e Initial load
duke
parents:
diff changeset
145 void MethodLiveness::compute_liveness() {
a61af66fc99e Initial load
duke
parents:
diff changeset
146 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
147 if (TraceLivenessGen) {
a61af66fc99e Initial load
duke
parents:
diff changeset
148 tty->print_cr("################################################################");
a61af66fc99e Initial load
duke
parents:
diff changeset
149 tty->print("# Computing liveness information for ");
a61af66fc99e Initial load
duke
parents:
diff changeset
150 method()->print_short_name();
a61af66fc99e Initial load
duke
parents:
diff changeset
151 }
a61af66fc99e Initial load
duke
parents:
diff changeset
152
a61af66fc99e Initial load
duke
parents:
diff changeset
153 if (TimeLivenessAnalysis) _time_total.start();
a61af66fc99e Initial load
duke
parents:
diff changeset
154 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
155
a61af66fc99e Initial load
duke
parents:
diff changeset
156 {
a61af66fc99e Initial load
duke
parents:
diff changeset
157 TraceTime buildGraph(NULL, &_time_build_graph, TimeLivenessAnalysis);
a61af66fc99e Initial load
duke
parents:
diff changeset
158 init_basic_blocks();
a61af66fc99e Initial load
duke
parents:
diff changeset
159 }
a61af66fc99e Initial load
duke
parents:
diff changeset
160 {
a61af66fc99e Initial load
duke
parents:
diff changeset
161 TraceTime genKill(NULL, &_time_gen_kill, TimeLivenessAnalysis);
a61af66fc99e Initial load
duke
parents:
diff changeset
162 init_gen_kill();
a61af66fc99e Initial load
duke
parents:
diff changeset
163 }
a61af66fc99e Initial load
duke
parents:
diff changeset
164 {
a61af66fc99e Initial load
duke
parents:
diff changeset
165 TraceTime flow(NULL, &_time_flow, TimeLivenessAnalysis);
a61af66fc99e Initial load
duke
parents:
diff changeset
166 propagate_liveness();
a61af66fc99e Initial load
duke
parents:
diff changeset
167 }
a61af66fc99e Initial load
duke
parents:
diff changeset
168
a61af66fc99e Initial load
duke
parents:
diff changeset
169 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
170 if (TimeLivenessAnalysis) _time_total.stop();
a61af66fc99e Initial load
duke
parents:
diff changeset
171
a61af66fc99e Initial load
duke
parents:
diff changeset
172 if (TimeLivenessAnalysis) {
a61af66fc99e Initial load
duke
parents:
diff changeset
173 // Collect statistics
a61af66fc99e Initial load
duke
parents:
diff changeset
174 _total_bytes += method()->code_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
175 _total_methods++;
a61af66fc99e Initial load
duke
parents:
diff changeset
176
a61af66fc99e Initial load
duke
parents:
diff changeset
177 int num_blocks = _block_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
178 _total_blocks += num_blocks;
a61af66fc99e Initial load
duke
parents:
diff changeset
179 _max_method_blocks = MAX2(num_blocks,_max_method_blocks);
a61af66fc99e Initial load
duke
parents:
diff changeset
180
a61af66fc99e Initial load
duke
parents:
diff changeset
181 for (int i=0; i<num_blocks; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
182 BasicBlock *block = _block_list[i];
a61af66fc99e Initial load
duke
parents:
diff changeset
183
a61af66fc99e Initial load
duke
parents:
diff changeset
184 int numEdges = block->_normal_predecessors->length();
a61af66fc99e Initial load
duke
parents:
diff changeset
185 int numExcEdges = block->_exception_predecessors->length();
a61af66fc99e Initial load
duke
parents:
diff changeset
186
a61af66fc99e Initial load
duke
parents:
diff changeset
187 _total_edges += numEdges;
a61af66fc99e Initial load
duke
parents:
diff changeset
188 _total_exc_edges += numExcEdges;
a61af66fc99e Initial load
duke
parents:
diff changeset
189 _max_block_edges = MAX2(numEdges,_max_block_edges);
a61af66fc99e Initial load
duke
parents:
diff changeset
190 _max_block_exc_edges = MAX2(numExcEdges,_max_block_exc_edges);
a61af66fc99e Initial load
duke
parents:
diff changeset
191 }
a61af66fc99e Initial load
duke
parents:
diff changeset
192
a61af66fc99e Initial load
duke
parents:
diff changeset
193 int numLocals = _bit_map_size_bits;
a61af66fc99e Initial load
duke
parents:
diff changeset
194 _total_method_locals += numLocals;
a61af66fc99e Initial load
duke
parents:
diff changeset
195 _max_method_locals = MAX2(numLocals,_max_method_locals);
a61af66fc99e Initial load
duke
parents:
diff changeset
196 }
a61af66fc99e Initial load
duke
parents:
diff changeset
197 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
198 }
a61af66fc99e Initial load
duke
parents:
diff changeset
199
a61af66fc99e Initial load
duke
parents:
diff changeset
200
a61af66fc99e Initial load
duke
parents:
diff changeset
201 void MethodLiveness::init_basic_blocks() {
a61af66fc99e Initial load
duke
parents:
diff changeset
202 bool bailout = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
203
a61af66fc99e Initial load
duke
parents:
diff changeset
204 int method_len = method()->code_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
205 ciMethodBlocks *mblocks = method()->get_method_blocks();
a61af66fc99e Initial load
duke
parents:
diff changeset
206
a61af66fc99e Initial load
duke
parents:
diff changeset
207 // Create an array to store the bci->BasicBlock mapping.
a61af66fc99e Initial load
duke
parents:
diff changeset
208 _block_map = new (arena()) GrowableArray<BasicBlock*>(arena(), method_len, method_len, NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
209
a61af66fc99e Initial load
duke
parents:
diff changeset
210 _block_count = mblocks->num_blocks();
a61af66fc99e Initial load
duke
parents:
diff changeset
211 _block_list = (BasicBlock **) arena()->Amalloc(sizeof(BasicBlock *) * _block_count);
a61af66fc99e Initial load
duke
parents:
diff changeset
212
a61af66fc99e Initial load
duke
parents:
diff changeset
213 // Used for patching up jsr/ret control flow.
a61af66fc99e Initial load
duke
parents:
diff changeset
214 GrowableArray<BasicBlock*>* jsr_exit_list = new GrowableArray<BasicBlock*>(5);
a61af66fc99e Initial load
duke
parents:
diff changeset
215 GrowableArray<BasicBlock*>* ret_list = new GrowableArray<BasicBlock*>(5);
a61af66fc99e Initial load
duke
parents:
diff changeset
216
a61af66fc99e Initial load
duke
parents:
diff changeset
217 // generate our block list from ciMethodBlocks
a61af66fc99e Initial load
duke
parents:
diff changeset
218 for (int blk = 0; blk < _block_count; blk++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
219 ciBlock *cib = mblocks->block(blk);
a61af66fc99e Initial load
duke
parents:
diff changeset
220 int start_bci = cib->start_bci();
a61af66fc99e Initial load
duke
parents:
diff changeset
221 _block_list[blk] = new (arena()) BasicBlock(this, start_bci, cib->limit_bci());
a61af66fc99e Initial load
duke
parents:
diff changeset
222 _block_map->at_put(start_bci, _block_list[blk]);
a61af66fc99e Initial load
duke
parents:
diff changeset
223 #ifdef COMPILER1
a61af66fc99e Initial load
duke
parents:
diff changeset
224 // mark all bcis where a new basic block starts
a61af66fc99e Initial load
duke
parents:
diff changeset
225 _bci_block_start.set_bit(start_bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
226 #endif // COMPILER1
a61af66fc99e Initial load
duke
parents:
diff changeset
227 }
a61af66fc99e Initial load
duke
parents:
diff changeset
228 // fill in the predecessors of blocks
a61af66fc99e Initial load
duke
parents:
diff changeset
229 ciBytecodeStream bytes(method());
a61af66fc99e Initial load
duke
parents:
diff changeset
230
a61af66fc99e Initial load
duke
parents:
diff changeset
231 for (int blk = 0; blk < _block_count; blk++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
232 BasicBlock *current_block = _block_list[blk];
a61af66fc99e Initial load
duke
parents:
diff changeset
233 int bci = mblocks->block(blk)->control_bci();
a61af66fc99e Initial load
duke
parents:
diff changeset
234
a61af66fc99e Initial load
duke
parents:
diff changeset
235 if (bci == ciBlock::fall_through_bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
236 int limit = current_block->limit_bci();
a61af66fc99e Initial load
duke
parents:
diff changeset
237 if (limit < method_len) {
a61af66fc99e Initial load
duke
parents:
diff changeset
238 BasicBlock *next = _block_map->at(limit);
a61af66fc99e Initial load
duke
parents:
diff changeset
239 assert( next != NULL, "must be a block immediately following this one.");
a61af66fc99e Initial load
duke
parents:
diff changeset
240 next->add_normal_predecessor(current_block);
a61af66fc99e Initial load
duke
parents:
diff changeset
241 }
a61af66fc99e Initial load
duke
parents:
diff changeset
242 continue;
a61af66fc99e Initial load
duke
parents:
diff changeset
243 }
a61af66fc99e Initial load
duke
parents:
diff changeset
244 bytes.reset_to_bci(bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
245 Bytecodes::Code code = bytes.next();
a61af66fc99e Initial load
duke
parents:
diff changeset
246 BasicBlock *dest;
a61af66fc99e Initial load
duke
parents:
diff changeset
247
a61af66fc99e Initial load
duke
parents:
diff changeset
248 // Now we need to interpret the instruction's effect
a61af66fc99e Initial load
duke
parents:
diff changeset
249 // on control flow.
a61af66fc99e Initial load
duke
parents:
diff changeset
250 assert (current_block != NULL, "we must have a current block");
a61af66fc99e Initial load
duke
parents:
diff changeset
251 switch (code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
252 case Bytecodes::_ifeq:
a61af66fc99e Initial load
duke
parents:
diff changeset
253 case Bytecodes::_ifne:
a61af66fc99e Initial load
duke
parents:
diff changeset
254 case Bytecodes::_iflt:
a61af66fc99e Initial load
duke
parents:
diff changeset
255 case Bytecodes::_ifge:
a61af66fc99e Initial load
duke
parents:
diff changeset
256 case Bytecodes::_ifgt:
a61af66fc99e Initial load
duke
parents:
diff changeset
257 case Bytecodes::_ifle:
a61af66fc99e Initial load
duke
parents:
diff changeset
258 case Bytecodes::_if_icmpeq:
a61af66fc99e Initial load
duke
parents:
diff changeset
259 case Bytecodes::_if_icmpne:
a61af66fc99e Initial load
duke
parents:
diff changeset
260 case Bytecodes::_if_icmplt:
a61af66fc99e Initial load
duke
parents:
diff changeset
261 case Bytecodes::_if_icmpge:
a61af66fc99e Initial load
duke
parents:
diff changeset
262 case Bytecodes::_if_icmpgt:
a61af66fc99e Initial load
duke
parents:
diff changeset
263 case Bytecodes::_if_icmple:
a61af66fc99e Initial load
duke
parents:
diff changeset
264 case Bytecodes::_if_acmpeq:
a61af66fc99e Initial load
duke
parents:
diff changeset
265 case Bytecodes::_if_acmpne:
a61af66fc99e Initial load
duke
parents:
diff changeset
266 case Bytecodes::_ifnull:
a61af66fc99e Initial load
duke
parents:
diff changeset
267 case Bytecodes::_ifnonnull:
a61af66fc99e Initial load
duke
parents:
diff changeset
268 // Two way branch. Set predecessors at each destination.
a61af66fc99e Initial load
duke
parents:
diff changeset
269 dest = _block_map->at(bytes.next_bci());
a61af66fc99e Initial load
duke
parents:
diff changeset
270 assert(dest != NULL, "must be a block immediately following this one.");
a61af66fc99e Initial load
duke
parents:
diff changeset
271 dest->add_normal_predecessor(current_block);
a61af66fc99e Initial load
duke
parents:
diff changeset
272
a61af66fc99e Initial load
duke
parents:
diff changeset
273 dest = _block_map->at(bytes.get_dest());
a61af66fc99e Initial load
duke
parents:
diff changeset
274 assert(dest != NULL, "branch desination must start a block.");
a61af66fc99e Initial load
duke
parents:
diff changeset
275 dest->add_normal_predecessor(current_block);
a61af66fc99e Initial load
duke
parents:
diff changeset
276 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
277 case Bytecodes::_goto:
a61af66fc99e Initial load
duke
parents:
diff changeset
278 dest = _block_map->at(bytes.get_dest());
a61af66fc99e Initial load
duke
parents:
diff changeset
279 assert(dest != NULL, "branch desination must start a block.");
a61af66fc99e Initial load
duke
parents:
diff changeset
280 dest->add_normal_predecessor(current_block);
a61af66fc99e Initial load
duke
parents:
diff changeset
281 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
282 case Bytecodes::_goto_w:
a61af66fc99e Initial load
duke
parents:
diff changeset
283 dest = _block_map->at(bytes.get_far_dest());
a61af66fc99e Initial load
duke
parents:
diff changeset
284 assert(dest != NULL, "branch desination must start a block.");
a61af66fc99e Initial load
duke
parents:
diff changeset
285 dest->add_normal_predecessor(current_block);
a61af66fc99e Initial load
duke
parents:
diff changeset
286 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
287 case Bytecodes::_tableswitch:
a61af66fc99e Initial load
duke
parents:
diff changeset
288 {
2142
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1972
diff changeset
289 Bytecode_tableswitch tableswitch(&bytes);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
290
2142
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1972
diff changeset
291 int len = tableswitch.length();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
292
2142
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1972
diff changeset
293 dest = _block_map->at(bci + tableswitch.default_offset());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
294 assert(dest != NULL, "branch desination must start a block.");
a61af66fc99e Initial load
duke
parents:
diff changeset
295 dest->add_normal_predecessor(current_block);
a61af66fc99e Initial load
duke
parents:
diff changeset
296 while (--len >= 0) {
2142
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1972
diff changeset
297 dest = _block_map->at(bci + tableswitch.dest_offset_at(len));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
298 assert(dest != NULL, "branch desination must start a block.");
a61af66fc99e Initial load
duke
parents:
diff changeset
299 dest->add_normal_predecessor(current_block);
a61af66fc99e Initial load
duke
parents:
diff changeset
300 }
a61af66fc99e Initial load
duke
parents:
diff changeset
301 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
302 }
a61af66fc99e Initial load
duke
parents:
diff changeset
303
a61af66fc99e Initial load
duke
parents:
diff changeset
304 case Bytecodes::_lookupswitch:
a61af66fc99e Initial load
duke
parents:
diff changeset
305 {
2142
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1972
diff changeset
306 Bytecode_lookupswitch lookupswitch(&bytes);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
307
2142
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1972
diff changeset
308 int npairs = lookupswitch.number_of_pairs();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
309
2142
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1972
diff changeset
310 dest = _block_map->at(bci + lookupswitch.default_offset());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
311 assert(dest != NULL, "branch desination must start a block.");
a61af66fc99e Initial load
duke
parents:
diff changeset
312 dest->add_normal_predecessor(current_block);
a61af66fc99e Initial load
duke
parents:
diff changeset
313 while(--npairs >= 0) {
2142
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1972
diff changeset
314 LookupswitchPair pair = lookupswitch.pair_at(npairs);
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1972
diff changeset
315 dest = _block_map->at( bci + pair.offset());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
316 assert(dest != NULL, "branch desination must start a block.");
a61af66fc99e Initial load
duke
parents:
diff changeset
317 dest->add_normal_predecessor(current_block);
a61af66fc99e Initial load
duke
parents:
diff changeset
318 }
a61af66fc99e Initial load
duke
parents:
diff changeset
319 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
320 }
a61af66fc99e Initial load
duke
parents:
diff changeset
321
a61af66fc99e Initial load
duke
parents:
diff changeset
322 case Bytecodes::_jsr:
a61af66fc99e Initial load
duke
parents:
diff changeset
323 {
a61af66fc99e Initial load
duke
parents:
diff changeset
324 assert(bytes.is_wide()==false, "sanity check");
a61af66fc99e Initial load
duke
parents:
diff changeset
325 dest = _block_map->at(bytes.get_dest());
a61af66fc99e Initial load
duke
parents:
diff changeset
326 assert(dest != NULL, "branch desination must start a block.");
a61af66fc99e Initial load
duke
parents:
diff changeset
327 dest->add_normal_predecessor(current_block);
a61af66fc99e Initial load
duke
parents:
diff changeset
328 BasicBlock *jsrExit = _block_map->at(current_block->limit_bci());
a61af66fc99e Initial load
duke
parents:
diff changeset
329 assert(jsrExit != NULL, "jsr return bci must start a block.");
a61af66fc99e Initial load
duke
parents:
diff changeset
330 jsr_exit_list->append(jsrExit);
a61af66fc99e Initial load
duke
parents:
diff changeset
331 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
332 }
a61af66fc99e Initial load
duke
parents:
diff changeset
333 case Bytecodes::_jsr_w:
a61af66fc99e Initial load
duke
parents:
diff changeset
334 {
a61af66fc99e Initial load
duke
parents:
diff changeset
335 dest = _block_map->at(bytes.get_far_dest());
a61af66fc99e Initial load
duke
parents:
diff changeset
336 assert(dest != NULL, "branch desination must start a block.");
a61af66fc99e Initial load
duke
parents:
diff changeset
337 dest->add_normal_predecessor(current_block);
a61af66fc99e Initial load
duke
parents:
diff changeset
338 BasicBlock *jsrExit = _block_map->at(current_block->limit_bci());
a61af66fc99e Initial load
duke
parents:
diff changeset
339 assert(jsrExit != NULL, "jsr return bci must start a block.");
a61af66fc99e Initial load
duke
parents:
diff changeset
340 jsr_exit_list->append(jsrExit);
a61af66fc99e Initial load
duke
parents:
diff changeset
341 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
342 }
a61af66fc99e Initial load
duke
parents:
diff changeset
343
a61af66fc99e Initial load
duke
parents:
diff changeset
344 case Bytecodes::_wide:
a61af66fc99e Initial load
duke
parents:
diff changeset
345 assert(false, "wide opcodes should not be seen here");
a61af66fc99e Initial load
duke
parents:
diff changeset
346 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
347 case Bytecodes::_athrow:
a61af66fc99e Initial load
duke
parents:
diff changeset
348 case Bytecodes::_ireturn:
a61af66fc99e Initial load
duke
parents:
diff changeset
349 case Bytecodes::_lreturn:
a61af66fc99e Initial load
duke
parents:
diff changeset
350 case Bytecodes::_freturn:
a61af66fc99e Initial load
duke
parents:
diff changeset
351 case Bytecodes::_dreturn:
a61af66fc99e Initial load
duke
parents:
diff changeset
352 case Bytecodes::_areturn:
a61af66fc99e Initial load
duke
parents:
diff changeset
353 case Bytecodes::_return:
a61af66fc99e Initial load
duke
parents:
diff changeset
354 // These opcodes are not the normal predecessors of any other opcodes.
a61af66fc99e Initial load
duke
parents:
diff changeset
355 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
356 case Bytecodes::_ret:
a61af66fc99e Initial load
duke
parents:
diff changeset
357 // We will patch up jsr/rets in a subsequent pass.
a61af66fc99e Initial load
duke
parents:
diff changeset
358 ret_list->append(current_block);
a61af66fc99e Initial load
duke
parents:
diff changeset
359 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
360 case Bytecodes::_breakpoint:
a61af66fc99e Initial load
duke
parents:
diff changeset
361 // Bail out of there are breakpoints in here.
a61af66fc99e Initial load
duke
parents:
diff changeset
362 bailout = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
363 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
364 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
365 // Do nothing.
a61af66fc99e Initial load
duke
parents:
diff changeset
366 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
367 }
a61af66fc99e Initial load
duke
parents:
diff changeset
368 }
a61af66fc99e Initial load
duke
parents:
diff changeset
369 // Patch up the jsr/ret's. We conservatively assume that any ret
a61af66fc99e Initial load
duke
parents:
diff changeset
370 // can return to any jsr site.
a61af66fc99e Initial load
duke
parents:
diff changeset
371 int ret_list_len = ret_list->length();
a61af66fc99e Initial load
duke
parents:
diff changeset
372 int jsr_exit_list_len = jsr_exit_list->length();
a61af66fc99e Initial load
duke
parents:
diff changeset
373 if (ret_list_len > 0 && jsr_exit_list_len > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
374 for (int i = jsr_exit_list_len - 1; i >= 0; i--) {
a61af66fc99e Initial load
duke
parents:
diff changeset
375 BasicBlock *jsrExit = jsr_exit_list->at(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
376 for (int i = ret_list_len - 1; i >= 0; i--) {
a61af66fc99e Initial load
duke
parents:
diff changeset
377 jsrExit->add_normal_predecessor(ret_list->at(i));
a61af66fc99e Initial load
duke
parents:
diff changeset
378 }
a61af66fc99e Initial load
duke
parents:
diff changeset
379 }
a61af66fc99e Initial load
duke
parents:
diff changeset
380 }
a61af66fc99e Initial load
duke
parents:
diff changeset
381
a61af66fc99e Initial load
duke
parents:
diff changeset
382 // Compute exception edges.
a61af66fc99e Initial load
duke
parents:
diff changeset
383 for (int b=_block_count-1; b >= 0; b--) {
a61af66fc99e Initial load
duke
parents:
diff changeset
384 BasicBlock *block = _block_list[b];
a61af66fc99e Initial load
duke
parents:
diff changeset
385 int block_start = block->start_bci();
a61af66fc99e Initial load
duke
parents:
diff changeset
386 int block_limit = block->limit_bci();
a61af66fc99e Initial load
duke
parents:
diff changeset
387 ciExceptionHandlerStream handlers(method());
a61af66fc99e Initial load
duke
parents:
diff changeset
388 for (; !handlers.is_done(); handlers.next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
389 ciExceptionHandler* handler = handlers.handler();
a61af66fc99e Initial load
duke
parents:
diff changeset
390 int start = handler->start();
a61af66fc99e Initial load
duke
parents:
diff changeset
391 int limit = handler->limit();
a61af66fc99e Initial load
duke
parents:
diff changeset
392 int handler_bci = handler->handler_bci();
a61af66fc99e Initial load
duke
parents:
diff changeset
393
a61af66fc99e Initial load
duke
parents:
diff changeset
394 int intersect_start = MAX2(block_start, start);
a61af66fc99e Initial load
duke
parents:
diff changeset
395 int intersect_limit = MIN2(block_limit, limit);
a61af66fc99e Initial load
duke
parents:
diff changeset
396 if (intersect_start < intersect_limit) {
a61af66fc99e Initial load
duke
parents:
diff changeset
397 // The catch range has a nonempty intersection with this
a61af66fc99e Initial load
duke
parents:
diff changeset
398 // basic block. That means this basic block can be an
a61af66fc99e Initial load
duke
parents:
diff changeset
399 // exceptional predecessor.
a61af66fc99e Initial load
duke
parents:
diff changeset
400 _block_map->at(handler_bci)->add_exception_predecessor(block);
a61af66fc99e Initial load
duke
parents:
diff changeset
401
a61af66fc99e Initial load
duke
parents:
diff changeset
402 if (handler->is_catch_all()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
403 // This is a catch-all block.
a61af66fc99e Initial load
duke
parents:
diff changeset
404 if (intersect_start == block_start && intersect_limit == block_limit) {
a61af66fc99e Initial load
duke
parents:
diff changeset
405 // The basic block is entirely contained in this catch-all block.
a61af66fc99e Initial load
duke
parents:
diff changeset
406 // Skip the rest of the exception handlers -- they can never be
a61af66fc99e Initial load
duke
parents:
diff changeset
407 // reached in execution.
a61af66fc99e Initial load
duke
parents:
diff changeset
408 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
409 }
a61af66fc99e Initial load
duke
parents:
diff changeset
410 }
a61af66fc99e Initial load
duke
parents:
diff changeset
411 }
a61af66fc99e Initial load
duke
parents:
diff changeset
412 }
a61af66fc99e Initial load
duke
parents:
diff changeset
413 }
a61af66fc99e Initial load
duke
parents:
diff changeset
414 }
a61af66fc99e Initial load
duke
parents:
diff changeset
415
a61af66fc99e Initial load
duke
parents:
diff changeset
416 void MethodLiveness::init_gen_kill() {
a61af66fc99e Initial load
duke
parents:
diff changeset
417 for (int i=_block_count-1; i >= 0; i--) {
a61af66fc99e Initial load
duke
parents:
diff changeset
418 _block_list[i]->compute_gen_kill(method());
a61af66fc99e Initial load
duke
parents:
diff changeset
419 }
a61af66fc99e Initial load
duke
parents:
diff changeset
420 }
a61af66fc99e Initial load
duke
parents:
diff changeset
421
a61af66fc99e Initial load
duke
parents:
diff changeset
422 void MethodLiveness::propagate_liveness() {
a61af66fc99e Initial load
duke
parents:
diff changeset
423 int num_blocks = _block_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
424 BasicBlock *block;
a61af66fc99e Initial load
duke
parents:
diff changeset
425
a61af66fc99e Initial load
duke
parents:
diff changeset
426 // We start our work list off with all blocks in it.
a61af66fc99e Initial load
duke
parents:
diff changeset
427 // Alternately, we could start off the work list with the list of all
a61af66fc99e Initial load
duke
parents:
diff changeset
428 // blocks which could exit the method directly, along with one block
a61af66fc99e Initial load
duke
parents:
diff changeset
429 // from any infinite loop. If this matters, it can be changed. It
a61af66fc99e Initial load
duke
parents:
diff changeset
430 // may not be clear from looking at the code, but the order of the
a61af66fc99e Initial load
duke
parents:
diff changeset
431 // workList will be the opposite of the creation order of the basic
a61af66fc99e Initial load
duke
parents:
diff changeset
432 // blocks, which should be decent for quick convergence (with the
a61af66fc99e Initial load
duke
parents:
diff changeset
433 // possible exception of exception handlers, which are all created
a61af66fc99e Initial load
duke
parents:
diff changeset
434 // early).
a61af66fc99e Initial load
duke
parents:
diff changeset
435 _work_list = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
436 for (int i = 0; i < num_blocks; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
437 block = _block_list[i];
a61af66fc99e Initial load
duke
parents:
diff changeset
438 block->set_next(_work_list);
a61af66fc99e Initial load
duke
parents:
diff changeset
439 block->set_on_work_list(true);
a61af66fc99e Initial load
duke
parents:
diff changeset
440 _work_list = block;
a61af66fc99e Initial load
duke
parents:
diff changeset
441 }
a61af66fc99e Initial load
duke
parents:
diff changeset
442
a61af66fc99e Initial load
duke
parents:
diff changeset
443
a61af66fc99e Initial load
duke
parents:
diff changeset
444 while ((block = work_list_get()) != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
445 block->propagate(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
446 NOT_PRODUCT(_total_visits++;)
a61af66fc99e Initial load
duke
parents:
diff changeset
447 }
a61af66fc99e Initial load
duke
parents:
diff changeset
448 }
a61af66fc99e Initial load
duke
parents:
diff changeset
449
a61af66fc99e Initial load
duke
parents:
diff changeset
450 void MethodLiveness::work_list_add(BasicBlock *block) {
a61af66fc99e Initial load
duke
parents:
diff changeset
451 if (!block->on_work_list()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
452 block->set_next(_work_list);
a61af66fc99e Initial load
duke
parents:
diff changeset
453 block->set_on_work_list(true);
a61af66fc99e Initial load
duke
parents:
diff changeset
454 _work_list = block;
a61af66fc99e Initial load
duke
parents:
diff changeset
455 }
a61af66fc99e Initial load
duke
parents:
diff changeset
456 }
a61af66fc99e Initial load
duke
parents:
diff changeset
457
a61af66fc99e Initial load
duke
parents:
diff changeset
458 MethodLiveness::BasicBlock *MethodLiveness::work_list_get() {
a61af66fc99e Initial load
duke
parents:
diff changeset
459 BasicBlock *block = _work_list;
a61af66fc99e Initial load
duke
parents:
diff changeset
460 if (block != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
461 block->set_on_work_list(false);
a61af66fc99e Initial load
duke
parents:
diff changeset
462 _work_list = block->next();
a61af66fc99e Initial load
duke
parents:
diff changeset
463 }
a61af66fc99e Initial load
duke
parents:
diff changeset
464 return block;
a61af66fc99e Initial load
duke
parents:
diff changeset
465 }
a61af66fc99e Initial load
duke
parents:
diff changeset
466
a61af66fc99e Initial load
duke
parents:
diff changeset
467
a61af66fc99e Initial load
duke
parents:
diff changeset
468 MethodLivenessResult MethodLiveness::get_liveness_at(int entry_bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
469 int bci = entry_bci;
a61af66fc99e Initial load
duke
parents:
diff changeset
470 bool is_entry = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
471 if (entry_bci == InvocationEntryBci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
472 is_entry = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
473 bci = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
474 }
a61af66fc99e Initial load
duke
parents:
diff changeset
475
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
476 MethodLivenessResult answer((uintptr_t*)NULL,0);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
477
a61af66fc99e Initial load
duke
parents:
diff changeset
478 if (_block_count > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
479 if (TimeLivenessAnalysis) _time_total.start();
a61af66fc99e Initial load
duke
parents:
diff changeset
480 if (TimeLivenessAnalysis) _time_query.start();
a61af66fc99e Initial load
duke
parents:
diff changeset
481
a61af66fc99e Initial load
duke
parents:
diff changeset
482 assert( 0 <= bci && bci < method()->code_size(), "bci out of range" );
a61af66fc99e Initial load
duke
parents:
diff changeset
483 BasicBlock *block = _block_map->at(bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
484 // We may not be at the block start, so search backwards to find the block
a61af66fc99e Initial load
duke
parents:
diff changeset
485 // containing bci.
a61af66fc99e Initial load
duke
parents:
diff changeset
486 int t = bci;
a61af66fc99e Initial load
duke
parents:
diff changeset
487 while (block == NULL && t > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
488 block = _block_map->at(--t);
a61af66fc99e Initial load
duke
parents:
diff changeset
489 }
a61af66fc99e Initial load
duke
parents:
diff changeset
490 assert( block != NULL, "invalid bytecode index; must be instruction index" );
a61af66fc99e Initial load
duke
parents:
diff changeset
491 assert(bci >= block->start_bci() && bci < block->limit_bci(), "block must contain bci.");
a61af66fc99e Initial load
duke
parents:
diff changeset
492
a61af66fc99e Initial load
duke
parents:
diff changeset
493 answer = block->get_liveness_at(method(), bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
494
a61af66fc99e Initial load
duke
parents:
diff changeset
495 if (is_entry && method()->is_synchronized() && !method()->is_static()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
496 // Synchronized methods use the receiver once on entry.
a61af66fc99e Initial load
duke
parents:
diff changeset
497 answer.at_put(0, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
498 }
a61af66fc99e Initial load
duke
parents:
diff changeset
499
a61af66fc99e Initial load
duke
parents:
diff changeset
500 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
501 if (TraceLivenessQuery) {
a61af66fc99e Initial load
duke
parents:
diff changeset
502 tty->print("Liveness query of ");
a61af66fc99e Initial load
duke
parents:
diff changeset
503 method()->print_short_name();
a61af66fc99e Initial load
duke
parents:
diff changeset
504 tty->print(" @ %d : result is ", bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
505 answer.print_on(tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
506 }
a61af66fc99e Initial load
duke
parents:
diff changeset
507
a61af66fc99e Initial load
duke
parents:
diff changeset
508 if (TimeLivenessAnalysis) _time_query.stop();
a61af66fc99e Initial load
duke
parents:
diff changeset
509 if (TimeLivenessAnalysis) _time_total.stop();
a61af66fc99e Initial load
duke
parents:
diff changeset
510 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
511 }
a61af66fc99e Initial load
duke
parents:
diff changeset
512
a61af66fc99e Initial load
duke
parents:
diff changeset
513 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
514 if (TimeLivenessAnalysis) {
a61af66fc99e Initial load
duke
parents:
diff changeset
515 // Collect statistics.
a61af66fc99e Initial load
duke
parents:
diff changeset
516 _total_locals_queried += _bit_map_size_bits;
a61af66fc99e Initial load
duke
parents:
diff changeset
517 BitCounter counter;
a61af66fc99e Initial load
duke
parents:
diff changeset
518 answer.iterate(&counter);
a61af66fc99e Initial load
duke
parents:
diff changeset
519 _total_live_locals_queried += counter.count();
a61af66fc99e Initial load
duke
parents:
diff changeset
520 }
a61af66fc99e Initial load
duke
parents:
diff changeset
521 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
522
a61af66fc99e Initial load
duke
parents:
diff changeset
523 return answer;
a61af66fc99e Initial load
duke
parents:
diff changeset
524 }
a61af66fc99e Initial load
duke
parents:
diff changeset
525
a61af66fc99e Initial load
duke
parents:
diff changeset
526
a61af66fc99e Initial load
duke
parents:
diff changeset
527 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
528
a61af66fc99e Initial load
duke
parents:
diff changeset
529 void MethodLiveness::print_times() {
a61af66fc99e Initial load
duke
parents:
diff changeset
530 tty->print_cr ("Accumulated liveness analysis times/statistics:");
a61af66fc99e Initial load
duke
parents:
diff changeset
531 tty->print_cr ("-----------------------------------------------");
a61af66fc99e Initial load
duke
parents:
diff changeset
532 tty->print_cr (" Total : %3.3f sec.", _time_total.seconds());
a61af66fc99e Initial load
duke
parents:
diff changeset
533 tty->print_cr (" Build graph : %3.3f sec. (%2.2f%%)", _time_build_graph.seconds(),
a61af66fc99e Initial load
duke
parents:
diff changeset
534 _time_build_graph.seconds() * 100 / _time_total.seconds());
a61af66fc99e Initial load
duke
parents:
diff changeset
535 tty->print_cr (" Gen / Kill : %3.3f sec. (%2.2f%%)", _time_gen_kill.seconds(),
a61af66fc99e Initial load
duke
parents:
diff changeset
536 _time_gen_kill.seconds() * 100 / _time_total.seconds());
a61af66fc99e Initial load
duke
parents:
diff changeset
537 tty->print_cr (" Dataflow : %3.3f sec. (%2.2f%%)", _time_flow.seconds(),
a61af66fc99e Initial load
duke
parents:
diff changeset
538 _time_flow.seconds() * 100 / _time_total.seconds());
a61af66fc99e Initial load
duke
parents:
diff changeset
539 tty->print_cr (" Query : %3.3f sec. (%2.2f%%)", _time_query.seconds(),
a61af66fc99e Initial load
duke
parents:
diff changeset
540 _time_query.seconds() * 100 / _time_total.seconds());
a61af66fc99e Initial load
duke
parents:
diff changeset
541 tty->print_cr (" #bytes : %8d (%3.0f bytes per sec)",
a61af66fc99e Initial load
duke
parents:
diff changeset
542 _total_bytes,
a61af66fc99e Initial load
duke
parents:
diff changeset
543 _total_bytes / _time_total.seconds());
a61af66fc99e Initial load
duke
parents:
diff changeset
544 tty->print_cr (" #methods : %8d (%3.0f methods per sec)",
a61af66fc99e Initial load
duke
parents:
diff changeset
545 _total_methods,
a61af66fc99e Initial load
duke
parents:
diff changeset
546 _total_methods / _time_total.seconds());
a61af66fc99e Initial load
duke
parents:
diff changeset
547 tty->print_cr (" avg locals : %3.3f max locals : %3d",
a61af66fc99e Initial load
duke
parents:
diff changeset
548 (float)_total_method_locals / _total_methods,
a61af66fc99e Initial load
duke
parents:
diff changeset
549 _max_method_locals);
a61af66fc99e Initial load
duke
parents:
diff changeset
550 tty->print_cr (" avg blocks : %3.3f max blocks : %3d",
a61af66fc99e Initial load
duke
parents:
diff changeset
551 (float)_total_blocks / _total_methods,
a61af66fc99e Initial load
duke
parents:
diff changeset
552 _max_method_blocks);
a61af66fc99e Initial load
duke
parents:
diff changeset
553 tty->print_cr (" avg bytes : %3.3f",
a61af66fc99e Initial load
duke
parents:
diff changeset
554 (float)_total_bytes / _total_methods);
a61af66fc99e Initial load
duke
parents:
diff changeset
555 tty->print_cr (" #blocks : %8d",
a61af66fc99e Initial load
duke
parents:
diff changeset
556 _total_blocks);
a61af66fc99e Initial load
duke
parents:
diff changeset
557 tty->print_cr (" avg normal predecessors : %3.3f max normal predecessors : %3d",
a61af66fc99e Initial load
duke
parents:
diff changeset
558 (float)_total_edges / _total_blocks,
a61af66fc99e Initial load
duke
parents:
diff changeset
559 _max_block_edges);
a61af66fc99e Initial load
duke
parents:
diff changeset
560 tty->print_cr (" avg exception predecessors : %3.3f max exception predecessors : %3d",
a61af66fc99e Initial load
duke
parents:
diff changeset
561 (float)_total_exc_edges / _total_blocks,
a61af66fc99e Initial load
duke
parents:
diff changeset
562 _max_block_exc_edges);
a61af66fc99e Initial load
duke
parents:
diff changeset
563 tty->print_cr (" avg visits : %3.3f",
a61af66fc99e Initial load
duke
parents:
diff changeset
564 (float)_total_visits / _total_blocks);
a61af66fc99e Initial load
duke
parents:
diff changeset
565 tty->print_cr (" #locals queried : %8d #live : %8d %%live : %2.2f%%",
a61af66fc99e Initial load
duke
parents:
diff changeset
566 _total_locals_queried,
a61af66fc99e Initial load
duke
parents:
diff changeset
567 _total_live_locals_queried,
a61af66fc99e Initial load
duke
parents:
diff changeset
568 100.0 * _total_live_locals_queried / _total_locals_queried);
a61af66fc99e Initial load
duke
parents:
diff changeset
569 }
a61af66fc99e Initial load
duke
parents:
diff changeset
570
a61af66fc99e Initial load
duke
parents:
diff changeset
571 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
572
a61af66fc99e Initial load
duke
parents:
diff changeset
573
a61af66fc99e Initial load
duke
parents:
diff changeset
574 MethodLiveness::BasicBlock::BasicBlock(MethodLiveness *analyzer, int start, int limit) :
a61af66fc99e Initial load
duke
parents:
diff changeset
575 _gen((uintptr_t*)analyzer->arena()->Amalloc(BytesPerWord * analyzer->bit_map_size_words()),
a61af66fc99e Initial load
duke
parents:
diff changeset
576 analyzer->bit_map_size_bits()),
a61af66fc99e Initial load
duke
parents:
diff changeset
577 _kill((uintptr_t*)analyzer->arena()->Amalloc(BytesPerWord * analyzer->bit_map_size_words()),
a61af66fc99e Initial load
duke
parents:
diff changeset
578 analyzer->bit_map_size_bits()),
a61af66fc99e Initial load
duke
parents:
diff changeset
579 _entry((uintptr_t*)analyzer->arena()->Amalloc(BytesPerWord * analyzer->bit_map_size_words()),
a61af66fc99e Initial load
duke
parents:
diff changeset
580 analyzer->bit_map_size_bits()),
a61af66fc99e Initial load
duke
parents:
diff changeset
581 _normal_exit((uintptr_t*)analyzer->arena()->Amalloc(BytesPerWord * analyzer->bit_map_size_words()),
a61af66fc99e Initial load
duke
parents:
diff changeset
582 analyzer->bit_map_size_bits()),
a61af66fc99e Initial load
duke
parents:
diff changeset
583 _exception_exit((uintptr_t*)analyzer->arena()->Amalloc(BytesPerWord * analyzer->bit_map_size_words()),
a61af66fc99e Initial load
duke
parents:
diff changeset
584 analyzer->bit_map_size_bits()),
a61af66fc99e Initial load
duke
parents:
diff changeset
585 _last_bci(-1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
586 _analyzer = analyzer;
a61af66fc99e Initial load
duke
parents:
diff changeset
587 _start_bci = start;
a61af66fc99e Initial load
duke
parents:
diff changeset
588 _limit_bci = limit;
a61af66fc99e Initial load
duke
parents:
diff changeset
589 _normal_predecessors =
a61af66fc99e Initial load
duke
parents:
diff changeset
590 new (analyzer->arena()) GrowableArray<MethodLiveness::BasicBlock*>(analyzer->arena(), 5, 0, NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
591 _exception_predecessors =
a61af66fc99e Initial load
duke
parents:
diff changeset
592 new (analyzer->arena()) GrowableArray<MethodLiveness::BasicBlock*>(analyzer->arena(), 5, 0, NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
593 _normal_exit.clear();
a61af66fc99e Initial load
duke
parents:
diff changeset
594 _exception_exit.clear();
a61af66fc99e Initial load
duke
parents:
diff changeset
595 _entry.clear();
a61af66fc99e Initial load
duke
parents:
diff changeset
596
a61af66fc99e Initial load
duke
parents:
diff changeset
597 // this initialization is not strictly necessary.
a61af66fc99e Initial load
duke
parents:
diff changeset
598 // _gen and _kill are cleared at the beginning of compute_gen_kill_range()
a61af66fc99e Initial load
duke
parents:
diff changeset
599 _gen.clear();
a61af66fc99e Initial load
duke
parents:
diff changeset
600 _kill.clear();
a61af66fc99e Initial load
duke
parents:
diff changeset
601 }
a61af66fc99e Initial load
duke
parents:
diff changeset
602
a61af66fc99e Initial load
duke
parents:
diff changeset
603
a61af66fc99e Initial load
duke
parents:
diff changeset
604
a61af66fc99e Initial load
duke
parents:
diff changeset
605 MethodLiveness::BasicBlock *MethodLiveness::BasicBlock::split(int split_bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
606 int start = _start_bci;
a61af66fc99e Initial load
duke
parents:
diff changeset
607 int limit = _limit_bci;
a61af66fc99e Initial load
duke
parents:
diff changeset
608
a61af66fc99e Initial load
duke
parents:
diff changeset
609 if (TraceLivenessGen) {
a61af66fc99e Initial load
duke
parents:
diff changeset
610 tty->print_cr(" ** Splitting block (%d,%d) at %d", start, limit, split_bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
611 }
a61af66fc99e Initial load
duke
parents:
diff changeset
612
a61af66fc99e Initial load
duke
parents:
diff changeset
613 GrowableArray<BasicBlock*>* save_predecessors = _normal_predecessors;
a61af66fc99e Initial load
duke
parents:
diff changeset
614
a61af66fc99e Initial load
duke
parents:
diff changeset
615 assert (start < split_bci && split_bci < limit, "improper split");
a61af66fc99e Initial load
duke
parents:
diff changeset
616
a61af66fc99e Initial load
duke
parents:
diff changeset
617 // Make a new block to cover the first half of the range.
a61af66fc99e Initial load
duke
parents:
diff changeset
618 BasicBlock *first_half = new (_analyzer->arena()) BasicBlock(_analyzer, start, split_bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
619
a61af66fc99e Initial load
duke
parents:
diff changeset
620 // Assign correct values to the second half (this)
a61af66fc99e Initial load
duke
parents:
diff changeset
621 _normal_predecessors = first_half->_normal_predecessors;
a61af66fc99e Initial load
duke
parents:
diff changeset
622 _start_bci = split_bci;
a61af66fc99e Initial load
duke
parents:
diff changeset
623 add_normal_predecessor(first_half);
a61af66fc99e Initial load
duke
parents:
diff changeset
624
a61af66fc99e Initial load
duke
parents:
diff changeset
625 // Assign correct predecessors to the new first half
a61af66fc99e Initial load
duke
parents:
diff changeset
626 first_half->_normal_predecessors = save_predecessors;
a61af66fc99e Initial load
duke
parents:
diff changeset
627
a61af66fc99e Initial load
duke
parents:
diff changeset
628 return first_half;
a61af66fc99e Initial load
duke
parents:
diff changeset
629 }
a61af66fc99e Initial load
duke
parents:
diff changeset
630
a61af66fc99e Initial load
duke
parents:
diff changeset
631 void MethodLiveness::BasicBlock::compute_gen_kill(ciMethod* method) {
a61af66fc99e Initial load
duke
parents:
diff changeset
632 ciBytecodeStream bytes(method);
a61af66fc99e Initial load
duke
parents:
diff changeset
633 bytes.reset_to_bci(start_bci());
a61af66fc99e Initial load
duke
parents:
diff changeset
634 bytes.set_max_bci(limit_bci());
a61af66fc99e Initial load
duke
parents:
diff changeset
635 compute_gen_kill_range(&bytes);
a61af66fc99e Initial load
duke
parents:
diff changeset
636
a61af66fc99e Initial load
duke
parents:
diff changeset
637 }
a61af66fc99e Initial load
duke
parents:
diff changeset
638
a61af66fc99e Initial load
duke
parents:
diff changeset
639 void MethodLiveness::BasicBlock::compute_gen_kill_range(ciBytecodeStream *bytes) {
a61af66fc99e Initial load
duke
parents:
diff changeset
640 _gen.clear();
a61af66fc99e Initial load
duke
parents:
diff changeset
641 _kill.clear();
a61af66fc99e Initial load
duke
parents:
diff changeset
642
a61af66fc99e Initial load
duke
parents:
diff changeset
643 while (bytes->next() != ciBytecodeStream::EOBC()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
644 compute_gen_kill_single(bytes);
a61af66fc99e Initial load
duke
parents:
diff changeset
645 }
a61af66fc99e Initial load
duke
parents:
diff changeset
646 }
a61af66fc99e Initial load
duke
parents:
diff changeset
647
a61af66fc99e Initial load
duke
parents:
diff changeset
648 void MethodLiveness::BasicBlock::compute_gen_kill_single(ciBytecodeStream *instruction) {
a61af66fc99e Initial load
duke
parents:
diff changeset
649 int localNum;
a61af66fc99e Initial load
duke
parents:
diff changeset
650
a61af66fc99e Initial load
duke
parents:
diff changeset
651 // We prohibit _gen and _kill from having locals in common. If we
a61af66fc99e Initial load
duke
parents:
diff changeset
652 // know that one is definitely going to be applied before the other,
a61af66fc99e Initial load
duke
parents:
diff changeset
653 // we could save some computation time by relaxing this prohibition.
a61af66fc99e Initial load
duke
parents:
diff changeset
654
a61af66fc99e Initial load
duke
parents:
diff changeset
655 switch (instruction->cur_bc()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
656 case Bytecodes::_nop:
a61af66fc99e Initial load
duke
parents:
diff changeset
657 case Bytecodes::_goto:
a61af66fc99e Initial load
duke
parents:
diff changeset
658 case Bytecodes::_goto_w:
a61af66fc99e Initial load
duke
parents:
diff changeset
659 case Bytecodes::_aconst_null:
a61af66fc99e Initial load
duke
parents:
diff changeset
660 case Bytecodes::_new:
a61af66fc99e Initial load
duke
parents:
diff changeset
661 case Bytecodes::_iconst_m1:
a61af66fc99e Initial load
duke
parents:
diff changeset
662 case Bytecodes::_iconst_0:
a61af66fc99e Initial load
duke
parents:
diff changeset
663 case Bytecodes::_iconst_1:
a61af66fc99e Initial load
duke
parents:
diff changeset
664 case Bytecodes::_iconst_2:
a61af66fc99e Initial load
duke
parents:
diff changeset
665 case Bytecodes::_iconst_3:
a61af66fc99e Initial load
duke
parents:
diff changeset
666 case Bytecodes::_iconst_4:
a61af66fc99e Initial load
duke
parents:
diff changeset
667 case Bytecodes::_iconst_5:
a61af66fc99e Initial load
duke
parents:
diff changeset
668 case Bytecodes::_fconst_0:
a61af66fc99e Initial load
duke
parents:
diff changeset
669 case Bytecodes::_fconst_1:
a61af66fc99e Initial load
duke
parents:
diff changeset
670 case Bytecodes::_fconst_2:
a61af66fc99e Initial load
duke
parents:
diff changeset
671 case Bytecodes::_bipush:
a61af66fc99e Initial load
duke
parents:
diff changeset
672 case Bytecodes::_sipush:
a61af66fc99e Initial load
duke
parents:
diff changeset
673 case Bytecodes::_lconst_0:
a61af66fc99e Initial load
duke
parents:
diff changeset
674 case Bytecodes::_lconst_1:
a61af66fc99e Initial load
duke
parents:
diff changeset
675 case Bytecodes::_dconst_0:
a61af66fc99e Initial load
duke
parents:
diff changeset
676 case Bytecodes::_dconst_1:
a61af66fc99e Initial load
duke
parents:
diff changeset
677 case Bytecodes::_ldc2_w:
a61af66fc99e Initial load
duke
parents:
diff changeset
678 case Bytecodes::_ldc:
a61af66fc99e Initial load
duke
parents:
diff changeset
679 case Bytecodes::_ldc_w:
a61af66fc99e Initial load
duke
parents:
diff changeset
680 case Bytecodes::_iaload:
a61af66fc99e Initial load
duke
parents:
diff changeset
681 case Bytecodes::_faload:
a61af66fc99e Initial load
duke
parents:
diff changeset
682 case Bytecodes::_baload:
a61af66fc99e Initial load
duke
parents:
diff changeset
683 case Bytecodes::_caload:
a61af66fc99e Initial load
duke
parents:
diff changeset
684 case Bytecodes::_saload:
a61af66fc99e Initial load
duke
parents:
diff changeset
685 case Bytecodes::_laload:
a61af66fc99e Initial load
duke
parents:
diff changeset
686 case Bytecodes::_daload:
a61af66fc99e Initial load
duke
parents:
diff changeset
687 case Bytecodes::_aaload:
a61af66fc99e Initial load
duke
parents:
diff changeset
688 case Bytecodes::_iastore:
a61af66fc99e Initial load
duke
parents:
diff changeset
689 case Bytecodes::_fastore:
a61af66fc99e Initial load
duke
parents:
diff changeset
690 case Bytecodes::_bastore:
a61af66fc99e Initial load
duke
parents:
diff changeset
691 case Bytecodes::_castore:
a61af66fc99e Initial load
duke
parents:
diff changeset
692 case Bytecodes::_sastore:
a61af66fc99e Initial load
duke
parents:
diff changeset
693 case Bytecodes::_lastore:
a61af66fc99e Initial load
duke
parents:
diff changeset
694 case Bytecodes::_dastore:
a61af66fc99e Initial load
duke
parents:
diff changeset
695 case Bytecodes::_aastore:
a61af66fc99e Initial load
duke
parents:
diff changeset
696 case Bytecodes::_pop:
a61af66fc99e Initial load
duke
parents:
diff changeset
697 case Bytecodes::_pop2:
a61af66fc99e Initial load
duke
parents:
diff changeset
698 case Bytecodes::_dup:
a61af66fc99e Initial load
duke
parents:
diff changeset
699 case Bytecodes::_dup_x1:
a61af66fc99e Initial load
duke
parents:
diff changeset
700 case Bytecodes::_dup_x2:
a61af66fc99e Initial load
duke
parents:
diff changeset
701 case Bytecodes::_dup2:
a61af66fc99e Initial load
duke
parents:
diff changeset
702 case Bytecodes::_dup2_x1:
a61af66fc99e Initial load
duke
parents:
diff changeset
703 case Bytecodes::_dup2_x2:
a61af66fc99e Initial load
duke
parents:
diff changeset
704 case Bytecodes::_swap:
a61af66fc99e Initial load
duke
parents:
diff changeset
705 case Bytecodes::_iadd:
a61af66fc99e Initial load
duke
parents:
diff changeset
706 case Bytecodes::_fadd:
a61af66fc99e Initial load
duke
parents:
diff changeset
707 case Bytecodes::_isub:
a61af66fc99e Initial load
duke
parents:
diff changeset
708 case Bytecodes::_fsub:
a61af66fc99e Initial load
duke
parents:
diff changeset
709 case Bytecodes::_imul:
a61af66fc99e Initial load
duke
parents:
diff changeset
710 case Bytecodes::_fmul:
a61af66fc99e Initial load
duke
parents:
diff changeset
711 case Bytecodes::_idiv:
a61af66fc99e Initial load
duke
parents:
diff changeset
712 case Bytecodes::_fdiv:
a61af66fc99e Initial load
duke
parents:
diff changeset
713 case Bytecodes::_irem:
a61af66fc99e Initial load
duke
parents:
diff changeset
714 case Bytecodes::_frem:
a61af66fc99e Initial load
duke
parents:
diff changeset
715 case Bytecodes::_ishl:
a61af66fc99e Initial load
duke
parents:
diff changeset
716 case Bytecodes::_ishr:
a61af66fc99e Initial load
duke
parents:
diff changeset
717 case Bytecodes::_iushr:
a61af66fc99e Initial load
duke
parents:
diff changeset
718 case Bytecodes::_iand:
a61af66fc99e Initial load
duke
parents:
diff changeset
719 case Bytecodes::_ior:
a61af66fc99e Initial load
duke
parents:
diff changeset
720 case Bytecodes::_ixor:
a61af66fc99e Initial load
duke
parents:
diff changeset
721 case Bytecodes::_l2f:
a61af66fc99e Initial load
duke
parents:
diff changeset
722 case Bytecodes::_l2i:
a61af66fc99e Initial load
duke
parents:
diff changeset
723 case Bytecodes::_d2f:
a61af66fc99e Initial load
duke
parents:
diff changeset
724 case Bytecodes::_d2i:
a61af66fc99e Initial load
duke
parents:
diff changeset
725 case Bytecodes::_fcmpl:
a61af66fc99e Initial load
duke
parents:
diff changeset
726 case Bytecodes::_fcmpg:
a61af66fc99e Initial load
duke
parents:
diff changeset
727 case Bytecodes::_ladd:
a61af66fc99e Initial load
duke
parents:
diff changeset
728 case Bytecodes::_dadd:
a61af66fc99e Initial load
duke
parents:
diff changeset
729 case Bytecodes::_lsub:
a61af66fc99e Initial load
duke
parents:
diff changeset
730 case Bytecodes::_dsub:
a61af66fc99e Initial load
duke
parents:
diff changeset
731 case Bytecodes::_lmul:
a61af66fc99e Initial load
duke
parents:
diff changeset
732 case Bytecodes::_dmul:
a61af66fc99e Initial load
duke
parents:
diff changeset
733 case Bytecodes::_ldiv:
a61af66fc99e Initial load
duke
parents:
diff changeset
734 case Bytecodes::_ddiv:
a61af66fc99e Initial load
duke
parents:
diff changeset
735 case Bytecodes::_lrem:
a61af66fc99e Initial load
duke
parents:
diff changeset
736 case Bytecodes::_drem:
a61af66fc99e Initial load
duke
parents:
diff changeset
737 case Bytecodes::_land:
a61af66fc99e Initial load
duke
parents:
diff changeset
738 case Bytecodes::_lor:
a61af66fc99e Initial load
duke
parents:
diff changeset
739 case Bytecodes::_lxor:
a61af66fc99e Initial load
duke
parents:
diff changeset
740 case Bytecodes::_ineg:
a61af66fc99e Initial load
duke
parents:
diff changeset
741 case Bytecodes::_fneg:
a61af66fc99e Initial load
duke
parents:
diff changeset
742 case Bytecodes::_i2f:
a61af66fc99e Initial load
duke
parents:
diff changeset
743 case Bytecodes::_f2i:
a61af66fc99e Initial load
duke
parents:
diff changeset
744 case Bytecodes::_i2c:
a61af66fc99e Initial load
duke
parents:
diff changeset
745 case Bytecodes::_i2s:
a61af66fc99e Initial load
duke
parents:
diff changeset
746 case Bytecodes::_i2b:
a61af66fc99e Initial load
duke
parents:
diff changeset
747 case Bytecodes::_lneg:
a61af66fc99e Initial load
duke
parents:
diff changeset
748 case Bytecodes::_dneg:
a61af66fc99e Initial load
duke
parents:
diff changeset
749 case Bytecodes::_l2d:
a61af66fc99e Initial load
duke
parents:
diff changeset
750 case Bytecodes::_d2l:
a61af66fc99e Initial load
duke
parents:
diff changeset
751 case Bytecodes::_lshl:
a61af66fc99e Initial load
duke
parents:
diff changeset
752 case Bytecodes::_lshr:
a61af66fc99e Initial load
duke
parents:
diff changeset
753 case Bytecodes::_lushr:
a61af66fc99e Initial load
duke
parents:
diff changeset
754 case Bytecodes::_i2l:
a61af66fc99e Initial load
duke
parents:
diff changeset
755 case Bytecodes::_i2d:
a61af66fc99e Initial load
duke
parents:
diff changeset
756 case Bytecodes::_f2l:
a61af66fc99e Initial load
duke
parents:
diff changeset
757 case Bytecodes::_f2d:
a61af66fc99e Initial load
duke
parents:
diff changeset
758 case Bytecodes::_lcmp:
a61af66fc99e Initial load
duke
parents:
diff changeset
759 case Bytecodes::_dcmpl:
a61af66fc99e Initial load
duke
parents:
diff changeset
760 case Bytecodes::_dcmpg:
a61af66fc99e Initial load
duke
parents:
diff changeset
761 case Bytecodes::_ifeq:
a61af66fc99e Initial load
duke
parents:
diff changeset
762 case Bytecodes::_ifne:
a61af66fc99e Initial load
duke
parents:
diff changeset
763 case Bytecodes::_iflt:
a61af66fc99e Initial load
duke
parents:
diff changeset
764 case Bytecodes::_ifge:
a61af66fc99e Initial load
duke
parents:
diff changeset
765 case Bytecodes::_ifgt:
a61af66fc99e Initial load
duke
parents:
diff changeset
766 case Bytecodes::_ifle:
a61af66fc99e Initial load
duke
parents:
diff changeset
767 case Bytecodes::_tableswitch:
a61af66fc99e Initial load
duke
parents:
diff changeset
768 case Bytecodes::_ireturn:
a61af66fc99e Initial load
duke
parents:
diff changeset
769 case Bytecodes::_freturn:
a61af66fc99e Initial load
duke
parents:
diff changeset
770 case Bytecodes::_if_icmpeq:
a61af66fc99e Initial load
duke
parents:
diff changeset
771 case Bytecodes::_if_icmpne:
a61af66fc99e Initial load
duke
parents:
diff changeset
772 case Bytecodes::_if_icmplt:
a61af66fc99e Initial load
duke
parents:
diff changeset
773 case Bytecodes::_if_icmpge:
a61af66fc99e Initial load
duke
parents:
diff changeset
774 case Bytecodes::_if_icmpgt:
a61af66fc99e Initial load
duke
parents:
diff changeset
775 case Bytecodes::_if_icmple:
a61af66fc99e Initial load
duke
parents:
diff changeset
776 case Bytecodes::_lreturn:
a61af66fc99e Initial load
duke
parents:
diff changeset
777 case Bytecodes::_dreturn:
a61af66fc99e Initial load
duke
parents:
diff changeset
778 case Bytecodes::_if_acmpeq:
a61af66fc99e Initial load
duke
parents:
diff changeset
779 case Bytecodes::_if_acmpne:
a61af66fc99e Initial load
duke
parents:
diff changeset
780 case Bytecodes::_jsr:
a61af66fc99e Initial load
duke
parents:
diff changeset
781 case Bytecodes::_jsr_w:
a61af66fc99e Initial load
duke
parents:
diff changeset
782 case Bytecodes::_getstatic:
a61af66fc99e Initial load
duke
parents:
diff changeset
783 case Bytecodes::_putstatic:
a61af66fc99e Initial load
duke
parents:
diff changeset
784 case Bytecodes::_getfield:
a61af66fc99e Initial load
duke
parents:
diff changeset
785 case Bytecodes::_putfield:
a61af66fc99e Initial load
duke
parents:
diff changeset
786 case Bytecodes::_invokevirtual:
a61af66fc99e Initial load
duke
parents:
diff changeset
787 case Bytecodes::_invokespecial:
a61af66fc99e Initial load
duke
parents:
diff changeset
788 case Bytecodes::_invokestatic:
a61af66fc99e Initial load
duke
parents:
diff changeset
789 case Bytecodes::_invokeinterface:
1135
e66fd840cb6b 6893081: method handle & invokedynamic code needs additional cleanup (post 6815692, 6858164)
twisti
parents: 342
diff changeset
790 case Bytecodes::_invokedynamic:
0
a61af66fc99e Initial load
duke
parents:
diff changeset
791 case Bytecodes::_newarray:
a61af66fc99e Initial load
duke
parents:
diff changeset
792 case Bytecodes::_anewarray:
a61af66fc99e Initial load
duke
parents:
diff changeset
793 case Bytecodes::_checkcast:
a61af66fc99e Initial load
duke
parents:
diff changeset
794 case Bytecodes::_arraylength:
a61af66fc99e Initial load
duke
parents:
diff changeset
795 case Bytecodes::_instanceof:
a61af66fc99e Initial load
duke
parents:
diff changeset
796 case Bytecodes::_athrow:
a61af66fc99e Initial load
duke
parents:
diff changeset
797 case Bytecodes::_areturn:
a61af66fc99e Initial load
duke
parents:
diff changeset
798 case Bytecodes::_monitorenter:
a61af66fc99e Initial load
duke
parents:
diff changeset
799 case Bytecodes::_monitorexit:
a61af66fc99e Initial load
duke
parents:
diff changeset
800 case Bytecodes::_ifnull:
a61af66fc99e Initial load
duke
parents:
diff changeset
801 case Bytecodes::_ifnonnull:
a61af66fc99e Initial load
duke
parents:
diff changeset
802 case Bytecodes::_multianewarray:
a61af66fc99e Initial load
duke
parents:
diff changeset
803 case Bytecodes::_lookupswitch:
a61af66fc99e Initial load
duke
parents:
diff changeset
804 // These bytecodes have no effect on the method's locals.
a61af66fc99e Initial load
duke
parents:
diff changeset
805 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
806
a61af66fc99e Initial load
duke
parents:
diff changeset
807 case Bytecodes::_return:
a61af66fc99e Initial load
duke
parents:
diff changeset
808 if (instruction->method()->intrinsic_id() == vmIntrinsics::_Object_init) {
a61af66fc99e Initial load
duke
parents:
diff changeset
809 // return from Object.init implicitly registers a finalizer
a61af66fc99e Initial load
duke
parents:
diff changeset
810 // for the receiver if needed, so keep it alive.
a61af66fc99e Initial load
duke
parents:
diff changeset
811 load_one(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
812 }
a61af66fc99e Initial load
duke
parents:
diff changeset
813 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
814
a61af66fc99e Initial load
duke
parents:
diff changeset
815
a61af66fc99e Initial load
duke
parents:
diff changeset
816 case Bytecodes::_lload:
a61af66fc99e Initial load
duke
parents:
diff changeset
817 case Bytecodes::_dload:
a61af66fc99e Initial load
duke
parents:
diff changeset
818 load_two(instruction->get_index());
a61af66fc99e Initial load
duke
parents:
diff changeset
819 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
820
a61af66fc99e Initial load
duke
parents:
diff changeset
821 case Bytecodes::_lload_0:
a61af66fc99e Initial load
duke
parents:
diff changeset
822 case Bytecodes::_dload_0:
a61af66fc99e Initial load
duke
parents:
diff changeset
823 load_two(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
824 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
825
a61af66fc99e Initial load
duke
parents:
diff changeset
826 case Bytecodes::_lload_1:
a61af66fc99e Initial load
duke
parents:
diff changeset
827 case Bytecodes::_dload_1:
a61af66fc99e Initial load
duke
parents:
diff changeset
828 load_two(1);
a61af66fc99e Initial load
duke
parents:
diff changeset
829 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
830
a61af66fc99e Initial load
duke
parents:
diff changeset
831 case Bytecodes::_lload_2:
a61af66fc99e Initial load
duke
parents:
diff changeset
832 case Bytecodes::_dload_2:
a61af66fc99e Initial load
duke
parents:
diff changeset
833 load_two(2);
a61af66fc99e Initial load
duke
parents:
diff changeset
834 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
835
a61af66fc99e Initial load
duke
parents:
diff changeset
836 case Bytecodes::_lload_3:
a61af66fc99e Initial load
duke
parents:
diff changeset
837 case Bytecodes::_dload_3:
a61af66fc99e Initial load
duke
parents:
diff changeset
838 load_two(3);
a61af66fc99e Initial load
duke
parents:
diff changeset
839 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
840
a61af66fc99e Initial load
duke
parents:
diff changeset
841 case Bytecodes::_iload:
a61af66fc99e Initial load
duke
parents:
diff changeset
842 case Bytecodes::_iinc:
a61af66fc99e Initial load
duke
parents:
diff changeset
843 case Bytecodes::_fload:
a61af66fc99e Initial load
duke
parents:
diff changeset
844 case Bytecodes::_aload:
a61af66fc99e Initial load
duke
parents:
diff changeset
845 case Bytecodes::_ret:
a61af66fc99e Initial load
duke
parents:
diff changeset
846 load_one(instruction->get_index());
a61af66fc99e Initial load
duke
parents:
diff changeset
847 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
848
a61af66fc99e Initial load
duke
parents:
diff changeset
849 case Bytecodes::_iload_0:
a61af66fc99e Initial load
duke
parents:
diff changeset
850 case Bytecodes::_fload_0:
a61af66fc99e Initial load
duke
parents:
diff changeset
851 case Bytecodes::_aload_0:
a61af66fc99e Initial load
duke
parents:
diff changeset
852 load_one(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
853 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
854
a61af66fc99e Initial load
duke
parents:
diff changeset
855 case Bytecodes::_iload_1:
a61af66fc99e Initial load
duke
parents:
diff changeset
856 case Bytecodes::_fload_1:
a61af66fc99e Initial load
duke
parents:
diff changeset
857 case Bytecodes::_aload_1:
a61af66fc99e Initial load
duke
parents:
diff changeset
858 load_one(1);
a61af66fc99e Initial load
duke
parents:
diff changeset
859 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
860
a61af66fc99e Initial load
duke
parents:
diff changeset
861 case Bytecodes::_iload_2:
a61af66fc99e Initial load
duke
parents:
diff changeset
862 case Bytecodes::_fload_2:
a61af66fc99e Initial load
duke
parents:
diff changeset
863 case Bytecodes::_aload_2:
a61af66fc99e Initial load
duke
parents:
diff changeset
864 load_one(2);
a61af66fc99e Initial load
duke
parents:
diff changeset
865 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
866
a61af66fc99e Initial load
duke
parents:
diff changeset
867 case Bytecodes::_iload_3:
a61af66fc99e Initial load
duke
parents:
diff changeset
868 case Bytecodes::_fload_3:
a61af66fc99e Initial load
duke
parents:
diff changeset
869 case Bytecodes::_aload_3:
a61af66fc99e Initial load
duke
parents:
diff changeset
870 load_one(3);
a61af66fc99e Initial load
duke
parents:
diff changeset
871 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
872
a61af66fc99e Initial load
duke
parents:
diff changeset
873 case Bytecodes::_lstore:
a61af66fc99e Initial load
duke
parents:
diff changeset
874 case Bytecodes::_dstore:
a61af66fc99e Initial load
duke
parents:
diff changeset
875 store_two(localNum = instruction->get_index());
a61af66fc99e Initial load
duke
parents:
diff changeset
876 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
877
a61af66fc99e Initial load
duke
parents:
diff changeset
878 case Bytecodes::_lstore_0:
a61af66fc99e Initial load
duke
parents:
diff changeset
879 case Bytecodes::_dstore_0:
a61af66fc99e Initial load
duke
parents:
diff changeset
880 store_two(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
881 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
882
a61af66fc99e Initial load
duke
parents:
diff changeset
883 case Bytecodes::_lstore_1:
a61af66fc99e Initial load
duke
parents:
diff changeset
884 case Bytecodes::_dstore_1:
a61af66fc99e Initial load
duke
parents:
diff changeset
885 store_two(1);
a61af66fc99e Initial load
duke
parents:
diff changeset
886 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
887
a61af66fc99e Initial load
duke
parents:
diff changeset
888 case Bytecodes::_lstore_2:
a61af66fc99e Initial load
duke
parents:
diff changeset
889 case Bytecodes::_dstore_2:
a61af66fc99e Initial load
duke
parents:
diff changeset
890 store_two(2);
a61af66fc99e Initial load
duke
parents:
diff changeset
891 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
892
a61af66fc99e Initial load
duke
parents:
diff changeset
893 case Bytecodes::_lstore_3:
a61af66fc99e Initial load
duke
parents:
diff changeset
894 case Bytecodes::_dstore_3:
a61af66fc99e Initial load
duke
parents:
diff changeset
895 store_two(3);
a61af66fc99e Initial load
duke
parents:
diff changeset
896 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
897
a61af66fc99e Initial load
duke
parents:
diff changeset
898 case Bytecodes::_istore:
a61af66fc99e Initial load
duke
parents:
diff changeset
899 case Bytecodes::_fstore:
a61af66fc99e Initial load
duke
parents:
diff changeset
900 case Bytecodes::_astore:
a61af66fc99e Initial load
duke
parents:
diff changeset
901 store_one(instruction->get_index());
a61af66fc99e Initial load
duke
parents:
diff changeset
902 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
903
a61af66fc99e Initial load
duke
parents:
diff changeset
904 case Bytecodes::_istore_0:
a61af66fc99e Initial load
duke
parents:
diff changeset
905 case Bytecodes::_fstore_0:
a61af66fc99e Initial load
duke
parents:
diff changeset
906 case Bytecodes::_astore_0:
a61af66fc99e Initial load
duke
parents:
diff changeset
907 store_one(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
908 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
909
a61af66fc99e Initial load
duke
parents:
diff changeset
910 case Bytecodes::_istore_1:
a61af66fc99e Initial load
duke
parents:
diff changeset
911 case Bytecodes::_fstore_1:
a61af66fc99e Initial load
duke
parents:
diff changeset
912 case Bytecodes::_astore_1:
a61af66fc99e Initial load
duke
parents:
diff changeset
913 store_one(1);
a61af66fc99e Initial load
duke
parents:
diff changeset
914 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
915
a61af66fc99e Initial load
duke
parents:
diff changeset
916 case Bytecodes::_istore_2:
a61af66fc99e Initial load
duke
parents:
diff changeset
917 case Bytecodes::_fstore_2:
a61af66fc99e Initial load
duke
parents:
diff changeset
918 case Bytecodes::_astore_2:
a61af66fc99e Initial load
duke
parents:
diff changeset
919 store_one(2);
a61af66fc99e Initial load
duke
parents:
diff changeset
920 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
921
a61af66fc99e Initial load
duke
parents:
diff changeset
922 case Bytecodes::_istore_3:
a61af66fc99e Initial load
duke
parents:
diff changeset
923 case Bytecodes::_fstore_3:
a61af66fc99e Initial load
duke
parents:
diff changeset
924 case Bytecodes::_astore_3:
a61af66fc99e Initial load
duke
parents:
diff changeset
925 store_one(3);
a61af66fc99e Initial load
duke
parents:
diff changeset
926 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
927
a61af66fc99e Initial load
duke
parents:
diff changeset
928 case Bytecodes::_wide:
a61af66fc99e Initial load
duke
parents:
diff changeset
929 fatal("Iterator should skip this bytecode");
a61af66fc99e Initial load
duke
parents:
diff changeset
930 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
931
a61af66fc99e Initial load
duke
parents:
diff changeset
932 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
933 tty->print("unexpected opcode: %d\n", instruction->cur_bc());
a61af66fc99e Initial load
duke
parents:
diff changeset
934 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
935 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
936 }
a61af66fc99e Initial load
duke
parents:
diff changeset
937 }
a61af66fc99e Initial load
duke
parents:
diff changeset
938
a61af66fc99e Initial load
duke
parents:
diff changeset
939 void MethodLiveness::BasicBlock::load_two(int local) {
a61af66fc99e Initial load
duke
parents:
diff changeset
940 load_one(local);
a61af66fc99e Initial load
duke
parents:
diff changeset
941 load_one(local+1);
a61af66fc99e Initial load
duke
parents:
diff changeset
942 }
a61af66fc99e Initial load
duke
parents:
diff changeset
943
a61af66fc99e Initial load
duke
parents:
diff changeset
944 void MethodLiveness::BasicBlock::load_one(int local) {
a61af66fc99e Initial load
duke
parents:
diff changeset
945 if (!_kill.at(local)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
946 _gen.at_put(local, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
947 }
a61af66fc99e Initial load
duke
parents:
diff changeset
948 }
a61af66fc99e Initial load
duke
parents:
diff changeset
949
a61af66fc99e Initial load
duke
parents:
diff changeset
950 void MethodLiveness::BasicBlock::store_two(int local) {
a61af66fc99e Initial load
duke
parents:
diff changeset
951 store_one(local);
a61af66fc99e Initial load
duke
parents:
diff changeset
952 store_one(local+1);
a61af66fc99e Initial load
duke
parents:
diff changeset
953 }
a61af66fc99e Initial load
duke
parents:
diff changeset
954
a61af66fc99e Initial load
duke
parents:
diff changeset
955 void MethodLiveness::BasicBlock::store_one(int local) {
a61af66fc99e Initial load
duke
parents:
diff changeset
956 if (!_gen.at(local)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
957 _kill.at_put(local, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
958 }
a61af66fc99e Initial load
duke
parents:
diff changeset
959 }
a61af66fc99e Initial load
duke
parents:
diff changeset
960
a61af66fc99e Initial load
duke
parents:
diff changeset
961 void MethodLiveness::BasicBlock::propagate(MethodLiveness *ml) {
a61af66fc99e Initial load
duke
parents:
diff changeset
962 // These set operations could be combined for efficiency if the
a61af66fc99e Initial load
duke
parents:
diff changeset
963 // performance of this analysis becomes an issue.
a61af66fc99e Initial load
duke
parents:
diff changeset
964 _entry.set_union(_normal_exit);
a61af66fc99e Initial load
duke
parents:
diff changeset
965 _entry.set_difference(_kill);
a61af66fc99e Initial load
duke
parents:
diff changeset
966 _entry.set_union(_gen);
a61af66fc99e Initial load
duke
parents:
diff changeset
967
a61af66fc99e Initial load
duke
parents:
diff changeset
968 // Note that we merge information from our exceptional successors
a61af66fc99e Initial load
duke
parents:
diff changeset
969 // just once, rather than at individual bytecodes.
a61af66fc99e Initial load
duke
parents:
diff changeset
970 _entry.set_union(_exception_exit);
a61af66fc99e Initial load
duke
parents:
diff changeset
971
a61af66fc99e Initial load
duke
parents:
diff changeset
972 if (TraceLivenessGen) {
a61af66fc99e Initial load
duke
parents:
diff changeset
973 tty->print_cr(" ** Visiting block at %d **", start_bci());
a61af66fc99e Initial load
duke
parents:
diff changeset
974 print_on(tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
975 }
a61af66fc99e Initial load
duke
parents:
diff changeset
976
a61af66fc99e Initial load
duke
parents:
diff changeset
977 int i;
a61af66fc99e Initial load
duke
parents:
diff changeset
978 for (i=_normal_predecessors->length()-1; i>=0; i--) {
a61af66fc99e Initial load
duke
parents:
diff changeset
979 BasicBlock *block = _normal_predecessors->at(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
980 if (block->merge_normal(_entry)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
981 ml->work_list_add(block);
a61af66fc99e Initial load
duke
parents:
diff changeset
982 }
a61af66fc99e Initial load
duke
parents:
diff changeset
983 }
a61af66fc99e Initial load
duke
parents:
diff changeset
984 for (i=_exception_predecessors->length()-1; i>=0; i--) {
a61af66fc99e Initial load
duke
parents:
diff changeset
985 BasicBlock *block = _exception_predecessors->at(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
986 if (block->merge_exception(_entry)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
987 ml->work_list_add(block);
a61af66fc99e Initial load
duke
parents:
diff changeset
988 }
a61af66fc99e Initial load
duke
parents:
diff changeset
989 }
a61af66fc99e Initial load
duke
parents:
diff changeset
990 }
a61af66fc99e Initial load
duke
parents:
diff changeset
991
a61af66fc99e Initial load
duke
parents:
diff changeset
992 bool MethodLiveness::BasicBlock::merge_normal(BitMap other) {
a61af66fc99e Initial load
duke
parents:
diff changeset
993 return _normal_exit.set_union_with_result(other);
a61af66fc99e Initial load
duke
parents:
diff changeset
994 }
a61af66fc99e Initial load
duke
parents:
diff changeset
995
a61af66fc99e Initial load
duke
parents:
diff changeset
996 bool MethodLiveness::BasicBlock::merge_exception(BitMap other) {
a61af66fc99e Initial load
duke
parents:
diff changeset
997 return _exception_exit.set_union_with_result(other);
a61af66fc99e Initial load
duke
parents:
diff changeset
998 }
a61af66fc99e Initial load
duke
parents:
diff changeset
999
a61af66fc99e Initial load
duke
parents:
diff changeset
1000 MethodLivenessResult MethodLiveness::BasicBlock::get_liveness_at(ciMethod* method, int bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1001 MethodLivenessResult answer(NEW_RESOURCE_ARRAY(uintptr_t, _analyzer->bit_map_size_words()),
a61af66fc99e Initial load
duke
parents:
diff changeset
1002 _analyzer->bit_map_size_bits());
a61af66fc99e Initial load
duke
parents:
diff changeset
1003 answer.set_is_valid();
a61af66fc99e Initial load
duke
parents:
diff changeset
1004
a61af66fc99e Initial load
duke
parents:
diff changeset
1005 #ifndef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
1006 if (bci == start_bci()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1007 answer.set_from(_entry);
a61af66fc99e Initial load
duke
parents:
diff changeset
1008 return answer;
a61af66fc99e Initial load
duke
parents:
diff changeset
1009 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1010 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1011
a61af66fc99e Initial load
duke
parents:
diff changeset
1012 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
1013 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1014 BitMap g(_gen.size()); g.set_from(_gen);
a61af66fc99e Initial load
duke
parents:
diff changeset
1015 BitMap k(_kill.size()); k.set_from(_kill);
a61af66fc99e Initial load
duke
parents:
diff changeset
1016 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1017 if (_last_bci != bci || trueInDebug) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1018 ciBytecodeStream bytes(method);
a61af66fc99e Initial load
duke
parents:
diff changeset
1019 bytes.reset_to_bci(bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
1020 bytes.set_max_bci(limit_bci());
a61af66fc99e Initial load
duke
parents:
diff changeset
1021 compute_gen_kill_range(&bytes);
a61af66fc99e Initial load
duke
parents:
diff changeset
1022 assert(_last_bci != bci ||
a61af66fc99e Initial load
duke
parents:
diff changeset
1023 (g.is_same(_gen) && k.is_same(_kill)), "cached computation is incorrect");
a61af66fc99e Initial load
duke
parents:
diff changeset
1024 _last_bci = bci;
a61af66fc99e Initial load
duke
parents:
diff changeset
1025 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1026
a61af66fc99e Initial load
duke
parents:
diff changeset
1027 answer.clear();
a61af66fc99e Initial load
duke
parents:
diff changeset
1028 answer.set_union(_normal_exit);
a61af66fc99e Initial load
duke
parents:
diff changeset
1029 answer.set_difference(_kill);
a61af66fc99e Initial load
duke
parents:
diff changeset
1030 answer.set_union(_gen);
a61af66fc99e Initial load
duke
parents:
diff changeset
1031 answer.set_union(_exception_exit);
a61af66fc99e Initial load
duke
parents:
diff changeset
1032
a61af66fc99e Initial load
duke
parents:
diff changeset
1033 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
1034 if (bci == start_bci()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1035 assert(answer.is_same(_entry), "optimized answer must be accurate");
a61af66fc99e Initial load
duke
parents:
diff changeset
1036 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1037 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1038
a61af66fc99e Initial load
duke
parents:
diff changeset
1039 return answer;
a61af66fc99e Initial load
duke
parents:
diff changeset
1040 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1041
a61af66fc99e Initial load
duke
parents:
diff changeset
1042 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
1043
a61af66fc99e Initial load
duke
parents:
diff changeset
1044 void MethodLiveness::BasicBlock::print_on(outputStream *os) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1045 os->print_cr("===================================================================");
a61af66fc99e Initial load
duke
parents:
diff changeset
1046 os->print_cr(" Block start: %4d, limit: %4d", _start_bci, _limit_bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
1047 os->print (" Normal predecessors (%2d) @", _normal_predecessors->length());
a61af66fc99e Initial load
duke
parents:
diff changeset
1048 int i;
a61af66fc99e Initial load
duke
parents:
diff changeset
1049 for (i=0; i < _normal_predecessors->length(); i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1050 os->print(" %4d", _normal_predecessors->at(i)->start_bci());
a61af66fc99e Initial load
duke
parents:
diff changeset
1051 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1052 os->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
1053 os->print (" Exceptional predecessors (%2d) @", _exception_predecessors->length());
a61af66fc99e Initial load
duke
parents:
diff changeset
1054 for (i=0; i < _exception_predecessors->length(); i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1055 os->print(" %4d", _exception_predecessors->at(i)->start_bci());
a61af66fc99e Initial load
duke
parents:
diff changeset
1056 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1057 os->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
1058 os->print (" Normal Exit : ");
a61af66fc99e Initial load
duke
parents:
diff changeset
1059 _normal_exit.print_on(os);
a61af66fc99e Initial load
duke
parents:
diff changeset
1060 os->print (" Gen : ");
a61af66fc99e Initial load
duke
parents:
diff changeset
1061 _gen.print_on(os);
a61af66fc99e Initial load
duke
parents:
diff changeset
1062 os->print (" Kill : ");
a61af66fc99e Initial load
duke
parents:
diff changeset
1063 _kill.print_on(os);
a61af66fc99e Initial load
duke
parents:
diff changeset
1064 os->print (" Exception Exit: ");
a61af66fc99e Initial load
duke
parents:
diff changeset
1065 _exception_exit.print_on(os);
a61af66fc99e Initial load
duke
parents:
diff changeset
1066 os->print (" Entry : ");
a61af66fc99e Initial load
duke
parents:
diff changeset
1067 _entry.print_on(os);
a61af66fc99e Initial load
duke
parents:
diff changeset
1068 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1069
a61af66fc99e Initial load
duke
parents:
diff changeset
1070 #endif // PRODUCT