Tue, 18 Jun 2013 12:31:07 -0700
8015237: Parallelize string table scanning during strong root processing
Summary: Parallelize the scanning of the intern string table by having each GC worker claim a given number of buckets. Changes were also reviewed by Per Liden <per.liden@oracle.com>.
Reviewed-by: tschatzl, stefank, twisti
1 /*
2 * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
3 * Copyright 2008, 2009 Red Hat, Inc.
4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 *
6 * This code is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License version 2 only, as
8 * published by the Free Software Foundation.
9 *
10 * This code is distributed in the hope that it will be useful, but WITHOUT
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
13 * version 2 for more details (a copy is included in the LICENSE file that
14 * accompanied this code).
15 *
16 * You should have received a copy of the GNU General Public License version
17 * 2 along with this work; if not, write to the Free Software Foundation,
18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
19 *
20 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
21 * or visit www.oracle.com if you need additional information or have any
22 * questions.
23 *
24 */
26 #ifndef SHARE_VM_SHARK_SHARKBLOCK_HPP
27 #define SHARE_VM_SHARK_SHARKBLOCK_HPP
29 #include "ci/ciMethod.hpp"
30 #include "ci/ciStreams.hpp"
31 #include "memory/allocation.hpp"
32 #include "shark/llvmHeaders.hpp"
33 #include "shark/sharkBuilder.hpp"
34 #include "shark/sharkConstant.hpp"
35 #include "shark/sharkInvariants.hpp"
36 #include "shark/sharkState.hpp"
37 #include "shark/sharkValue.hpp"
38 #include "utilities/debug.hpp"
40 class SharkState;
42 class SharkBlock : public SharkTargetInvariants {
43 protected:
44 SharkBlock(const SharkTargetInvariants* parent)
45 : SharkTargetInvariants(parent),
46 _iter(target()),
47 _current_state(NULL) {}
49 SharkBlock(const SharkCompileInvariants* parent, ciMethod* target)
50 : SharkTargetInvariants(parent, target),
51 _iter(target),
52 _current_state(NULL) {}
54 private:
55 ciBytecodeStream _iter;
56 SharkState* _current_state;
58 public:
59 ciBytecodeStream* iter() {
60 return &_iter;
61 }
62 Bytecodes::Code bc() {
63 return iter()->cur_bc();
64 }
65 int bci() {
66 return iter()->cur_bci();
67 }
69 // Entry state
70 protected:
71 virtual SharkState* entry_state();
73 // Current state
74 private:
75 SharkState* initial_current_state();
77 public:
78 SharkState* current_state() {
79 if (_current_state == NULL)
80 set_current_state(initial_current_state());
81 return _current_state;
82 }
84 protected:
85 void set_current_state(SharkState* current_state) {
86 _current_state = current_state;
87 }
89 // Local variables
90 protected:
91 SharkValue* local(int index) {
92 SharkValue *value = current_state()->local(index);
93 assert(value != NULL, "shouldn't be");
94 assert(value->is_one_word() ||
95 (index + 1 < max_locals() &&
96 current_state()->local(index + 1) == NULL), "should be");
97 return value;
98 }
99 void set_local(int index, SharkValue* value) {
100 assert(value != NULL, "shouldn't be");
101 current_state()->set_local(index, value);
102 if (value->is_two_word())
103 current_state()->set_local(index + 1, NULL);
104 }
106 // Expression stack (raw)
107 protected:
108 void xpush(SharkValue* value) {
109 current_state()->push(value);
110 }
111 SharkValue* xpop() {
112 return current_state()->pop();
113 }
114 SharkValue* xstack(int slot) {
115 SharkValue *value = current_state()->stack(slot);
116 assert(value != NULL, "shouldn't be");
117 assert(value->is_one_word() ||
118 (slot > 0 &&
119 current_state()->stack(slot - 1) == NULL), "should be");
120 return value;
121 }
122 int xstack_depth() {
123 return current_state()->stack_depth();
124 }
126 // Expression stack (cooked)
127 protected:
128 void push(SharkValue* value) {
129 assert(value != NULL, "shouldn't be");
130 xpush(value);
131 if (value->is_two_word())
132 xpush(NULL);
133 }
134 SharkValue* pop() {
135 int size = current_state()->stack(0) == NULL ? 2 : 1;
136 if (size == 2)
137 xpop();
138 SharkValue *value = xpop();
139 assert(value && value->size() == size, "should be");
140 return value;
141 }
142 SharkValue* pop_result(BasicType type) {
143 SharkValue *result = pop();
145 #ifdef ASSERT
146 switch (result->basic_type()) {
147 case T_BOOLEAN:
148 case T_BYTE:
149 case T_CHAR:
150 case T_SHORT:
151 assert(type == T_INT, "type mismatch");
152 break;
154 case T_ARRAY:
155 assert(type == T_OBJECT, "type mismatch");
156 break;
158 default:
159 assert(result->basic_type() == type, "type mismatch");
160 }
161 #endif // ASSERT
163 return result;
164 }
166 // Code generation
167 public:
168 virtual void emit_IR();
170 protected:
171 void parse_bytecode(int start, int limit);
173 // Helpers
174 protected:
175 virtual void do_zero_check(SharkValue* value);
177 // Zero checking
178 protected:
179 void check_null(SharkValue* object) {
180 zero_check(object);
181 }
182 void check_divide_by_zero(SharkValue* value) {
183 zero_check(value);
184 }
185 private:
186 void zero_check(SharkValue* value) {
187 if (!value->zero_checked())
188 do_zero_check(value);
189 }
191 // Safepoints
192 protected:
193 virtual void maybe_add_backedge_safepoint();
195 // Traps
196 protected:
197 virtual bool has_trap();
198 virtual int trap_request();
199 virtual int trap_bci();
200 virtual void do_trap(int trap_request);
202 // arraylength
203 protected:
204 virtual void do_arraylength();
206 // *aload and *astore
207 protected:
208 virtual void do_aload(BasicType basic_type);
209 virtual void do_astore(BasicType basic_type);
211 // *div and *rem
212 private:
213 void do_idiv() {
214 do_div_or_rem(false, false);
215 }
216 void do_irem() {
217 do_div_or_rem(false, true);
218 }
219 void do_ldiv() {
220 do_div_or_rem(true, false);
221 }
222 void do_lrem() {
223 do_div_or_rem(true, true);
224 }
225 void do_div_or_rem(bool is_long, bool is_rem);
227 // get* and put*
228 private:
229 void do_getstatic() {
230 do_field_access(true, false);
231 }
232 void do_getfield() {
233 do_field_access(true, true);
234 }
235 void do_putstatic() {
236 do_field_access(false, false);
237 }
238 void do_putfield() {
239 do_field_access(false, true);
240 }
241 void do_field_access(bool is_get, bool is_field);
243 // lcmp and [fd]cmp[lg]
244 private:
245 void do_lcmp();
246 void do_fcmp(bool is_double, bool unordered_is_greater);
248 // *return and athrow
249 protected:
250 virtual void do_return(BasicType type);
251 virtual void do_athrow();
253 // goto*
254 protected:
255 virtual void do_goto();
257 // jsr* and ret
258 protected:
259 virtual void do_jsr();
260 virtual void do_ret();
262 // if*
263 protected:
264 virtual void do_if(llvm::ICmpInst::Predicate p, SharkValue* b, SharkValue* a);
266 // *switch
267 protected:
268 int switch_default_dest();
269 int switch_table_length();
270 int switch_key(int i);
271 int switch_dest(int i);
273 virtual void do_switch();
275 // invoke*
276 protected:
277 virtual void do_call();
279 // checkcast and instanceof
280 protected:
281 virtual void do_instance_check();
282 virtual bool maybe_do_instanceof_if();
284 // new and *newarray
285 protected:
286 virtual void do_new();
287 virtual void do_newarray();
288 virtual void do_anewarray();
289 virtual void do_multianewarray();
291 // monitorenter and monitorexit
292 protected:
293 virtual void do_monitorenter();
294 virtual void do_monitorexit();
295 };
297 #endif // SHARE_VM_SHARK_SHARKBLOCK_HPP