annotate src/share/vm/shark/sharkTopLevelBlock.cpp @ 5763:a3d71693e0ce

removed bytecode disassembly from CodeCacheRuntime into separate BytecodeDisassembler class removed VM call for doing bytecode disassembly added support for explicitly excluding classes from JaCoCo (put '// JaCoCo Exclude' somewhere in the source file) added node intrinsics to MaterializeNode added snippets for the UnsignedMath classes each file opened by CFGPrinter now includes a unique id in its name to avoid a race of multiple threads writing to the same file the IdealGraphPrinter uses the new BytecodeDisassembler mechanism teh UnsignedMath class is exclude from JaCoCo processing as it is used in snippets
author Doug Simon <doug.simon@oracle.com>
date Wed, 04 Jul 2012 21:57:49 +0200
parents 069ab3f976d3
children da91efe96a93
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1 /*
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
2 * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
3 * Copyright 2008, 2009, 2010 Red Hat, Inc.
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
5 *
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
6 * This code is free software; you can redistribute it and/or modify it
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
7 * under the terms of the GNU General Public License version 2 only, as
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
8 * published by the Free Software Foundation.
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
9 *
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
10 * This code is distributed in the hope that it will be useful, but WITHOUT
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
13 * version 2 for more details (a copy is included in the LICENSE file that
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
14 * accompanied this code).
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
15 *
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
16 * You should have received a copy of the GNU General Public License version
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
17 * 2 along with this work; if not, write to the Free Software Foundation,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
19 *
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
20 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
21 * or visit www.oracle.com if you need additional information or have any
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
22 * questions.
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
23 *
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
24 */
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
25
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
26 #include "precompiled.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
27 #include "ci/ciField.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
28 #include "ci/ciInstance.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
29 #include "ci/ciObjArrayKlass.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
30 #include "ci/ciStreams.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
31 #include "ci/ciType.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
32 #include "ci/ciTypeFlow.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
33 #include "interpreter/bytecodes.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
34 #include "memory/allocation.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
35 #include "runtime/deoptimization.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
36 #include "shark/llvmHeaders.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
37 #include "shark/llvmValue.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
38 #include "shark/sharkBuilder.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
39 #include "shark/sharkCacheDecache.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
40 #include "shark/sharkConstant.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
41 #include "shark/sharkInliner.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
42 #include "shark/sharkState.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
43 #include "shark/sharkTopLevelBlock.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
44 #include "shark/sharkValue.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
45 #include "shark/shark_globals.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
46 #include "utilities/debug.hpp"
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
47
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
48 using namespace llvm;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
49
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
50 void SharkTopLevelBlock::scan_for_traps() {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
51 // If typeflow found a trap then don't scan past it
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
52 int limit_bci = ciblock()->has_trap() ? ciblock()->trap_bci() : limit();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
53
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
54 // Scan the bytecode for traps that are always hit
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
55 iter()->reset_to_bci(start());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
56 while (iter()->next_bci() < limit_bci) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
57 iter()->next();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
58
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
59 ciField *field;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
60 ciMethod *method;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
61 ciInstanceKlass *klass;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
62 bool will_link;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
63 bool is_field;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
64
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
65 switch (bc()) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
66 case Bytecodes::_ldc:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
67 case Bytecodes::_ldc_w:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
68 if (!SharkConstant::for_ldc(iter())->is_loaded()) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
69 set_trap(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
70 Deoptimization::make_trap_request(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
71 Deoptimization::Reason_uninitialized,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
72 Deoptimization::Action_reinterpret), bci());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
73 return;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
74 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
75 break;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
76
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
77 case Bytecodes::_getfield:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
78 case Bytecodes::_getstatic:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
79 case Bytecodes::_putfield:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
80 case Bytecodes::_putstatic:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
81 field = iter()->get_field(will_link);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
82 assert(will_link, "typeflow responsibility");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
83 is_field = (bc() == Bytecodes::_getfield || bc() == Bytecodes::_putfield);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
84
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
85 // If the bytecode does not match the field then bail out to
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
86 // the interpreter to throw an IncompatibleClassChangeError
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
87 if (is_field == field->is_static()) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
88 set_trap(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
89 Deoptimization::make_trap_request(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
90 Deoptimization::Reason_unhandled,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
91 Deoptimization::Action_none), bci());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
92 return;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
93 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
94
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
95 // Bail out if we are trying to access a static variable
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
96 // before the class initializer has completed.
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
97 if (!is_field && !field->holder()->is_initialized()) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
98 if (!static_field_ok_in_clinit(field)) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
99 set_trap(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
100 Deoptimization::make_trap_request(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
101 Deoptimization::Reason_uninitialized,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
102 Deoptimization::Action_reinterpret), bci());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
103 return;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
104 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
105 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
106 break;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
107
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
108 case Bytecodes::_invokestatic:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
109 case Bytecodes::_invokespecial:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
110 case Bytecodes::_invokevirtual:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
111 case Bytecodes::_invokeinterface:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
112 method = iter()->get_method(will_link);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
113 assert(will_link, "typeflow responsibility");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
114
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
115 if (!method->holder()->is_linked()) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
116 set_trap(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
117 Deoptimization::make_trap_request(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
118 Deoptimization::Reason_uninitialized,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
119 Deoptimization::Action_reinterpret), bci());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
120 return;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
121 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
122
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
123 if (bc() == Bytecodes::_invokevirtual) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
124 klass = ciEnv::get_instance_klass_for_declared_method_holder(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
125 iter()->get_declared_method_holder());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
126 if (!klass->is_linked()) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
127 set_trap(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
128 Deoptimization::make_trap_request(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
129 Deoptimization::Reason_uninitialized,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
130 Deoptimization::Action_reinterpret), bci());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
131 return;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
132 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
133 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
134 break;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
135
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
136 case Bytecodes::_new:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
137 klass = iter()->get_klass(will_link)->as_instance_klass();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
138 assert(will_link, "typeflow responsibility");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
139
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
140 // Bail out if the class is unloaded
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
141 if (iter()->is_unresolved_klass() || !klass->is_initialized()) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
142 set_trap(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
143 Deoptimization::make_trap_request(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
144 Deoptimization::Reason_uninitialized,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
145 Deoptimization::Action_reinterpret), bci());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
146 return;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
147 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
148
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
149 // Bail out if the class cannot be instantiated
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
150 if (klass->is_abstract() || klass->is_interface() ||
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
151 klass->name() == ciSymbol::java_lang_Class()) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
152 set_trap(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
153 Deoptimization::make_trap_request(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
154 Deoptimization::Reason_unhandled,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
155 Deoptimization::Action_reinterpret), bci());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
156 return;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
157 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
158 break;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
159 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
160 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
161
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
162 // Trap if typeflow trapped (and we didn't before)
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
163 if (ciblock()->has_trap()) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
164 set_trap(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
165 Deoptimization::make_trap_request(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
166 Deoptimization::Reason_unloaded,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
167 Deoptimization::Action_reinterpret,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
168 ciblock()->trap_index()), ciblock()->trap_bci());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
169 return;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
170 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
171 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
172
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
173 bool SharkTopLevelBlock::static_field_ok_in_clinit(ciField* field) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
174 assert(field->is_static(), "should be");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
175
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
176 // This code is lifted pretty much verbatim from C2's
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
177 // Parse::static_field_ok_in_clinit() in parse3.cpp.
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
178 bool access_OK = false;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
179 if (target()->holder()->is_subclass_of(field->holder())) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
180 if (target()->is_static()) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
181 if (target()->name() == ciSymbol::class_initializer_name()) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
182 // It's OK to access static fields from the class initializer
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
183 access_OK = true;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
184 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
185 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
186 else {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
187 if (target()->name() == ciSymbol::object_initializer_name()) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
188 // It's also OK to access static fields inside a constructor,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
189 // because any thread calling the constructor must first have
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
190 // synchronized on the class by executing a "new" bytecode.
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
191 access_OK = true;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
192 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
193 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
194 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
195 return access_OK;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
196 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
197
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
198 SharkState* SharkTopLevelBlock::entry_state() {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
199 if (_entry_state == NULL) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
200 assert(needs_phis(), "should do");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
201 _entry_state = new SharkPHIState(this);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
202 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
203 return _entry_state;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
204 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
205
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
206 void SharkTopLevelBlock::add_incoming(SharkState* incoming_state) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
207 if (needs_phis()) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
208 ((SharkPHIState *) entry_state())->add_incoming(incoming_state);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
209 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
210 else if (_entry_state == NULL) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
211 _entry_state = incoming_state;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
212 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
213 else {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
214 assert(entry_state()->equal_to(incoming_state), "should be");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
215 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
216 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
217
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
218 void SharkTopLevelBlock::enter(SharkTopLevelBlock* predecessor,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
219 bool is_exception) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
220 // This block requires phis:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
221 // - if it is entered more than once
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
222 // - if it is an exception handler, because in which
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
223 // case we assume it's entered more than once.
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
224 // - if the predecessor will be compiled after this
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
225 // block, in which case we can't simple propagate
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
226 // the state forward.
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
227 if (!needs_phis() &&
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
228 (entered() ||
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
229 is_exception ||
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
230 (predecessor && predecessor->index() >= index())))
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
231 _needs_phis = true;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
232
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
233 // Recurse into the tree
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
234 if (!entered()) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
235 _entered = true;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
236
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
237 scan_for_traps();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
238 if (!has_trap()) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
239 for (int i = 0; i < num_successors(); i++) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
240 successor(i)->enter(this, false);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
241 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
242 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
243 compute_exceptions();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
244 for (int i = 0; i < num_exceptions(); i++) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
245 SharkTopLevelBlock *handler = exception(i);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
246 if (handler)
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
247 handler->enter(this, true);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
248 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
249 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
250 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
251
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
252 void SharkTopLevelBlock::initialize() {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
253 char name[28];
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
254 snprintf(name, sizeof(name),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
255 "bci_%d%s",
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
256 start(), is_backedge_copy() ? "_backedge_copy" : "");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
257 _entry_block = function()->CreateBlock(name);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
258 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
259
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
260 void SharkTopLevelBlock::decache_for_Java_call(ciMethod *callee) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
261 SharkJavaCallDecacher(function(), bci(), callee).scan(current_state());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
262 for (int i = 0; i < callee->arg_size(); i++)
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
263 xpop();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
264 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
265
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
266 void SharkTopLevelBlock::cache_after_Java_call(ciMethod *callee) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
267 if (callee->return_type()->size()) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
268 ciType *type;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
269 switch (callee->return_type()->basic_type()) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
270 case T_BOOLEAN:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
271 case T_BYTE:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
272 case T_CHAR:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
273 case T_SHORT:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
274 type = ciType::make(T_INT);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
275 break;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
276
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
277 default:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
278 type = callee->return_type();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
279 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
280
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
281 push(SharkValue::create_generic(type, NULL, false));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
282 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
283 SharkJavaCallCacher(function(), callee).scan(current_state());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
284 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
285
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
286 void SharkTopLevelBlock::decache_for_VM_call() {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
287 SharkVMCallDecacher(function(), bci()).scan(current_state());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
288 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
289
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
290 void SharkTopLevelBlock::cache_after_VM_call() {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
291 SharkVMCallCacher(function()).scan(current_state());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
292 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
293
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
294 void SharkTopLevelBlock::decache_for_trap() {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
295 SharkTrapDecacher(function(), bci()).scan(current_state());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
296 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
297
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
298 void SharkTopLevelBlock::emit_IR() {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
299 builder()->SetInsertPoint(entry_block());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
300
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
301 // Parse the bytecode
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
302 parse_bytecode(start(), limit());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
303
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
304 // If this block falls through to the next then it won't have been
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
305 // terminated by a bytecode and we have to add the branch ourselves
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
306 if (falls_through() && !has_trap())
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
307 do_branch(ciTypeFlow::FALL_THROUGH);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
308 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
309
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
310 SharkTopLevelBlock* SharkTopLevelBlock::bci_successor(int bci) const {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
311 // XXX now with Linear Search Technology (tm)
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
312 for (int i = 0; i < num_successors(); i++) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
313 ciTypeFlow::Block *successor = ciblock()->successors()->at(i);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
314 if (successor->start() == bci)
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
315 return function()->block(successor->pre_order());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
316 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
317 ShouldNotReachHere();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
318 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
319
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
320 void SharkTopLevelBlock::do_zero_check(SharkValue *value) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
321 if (value->is_phi() && value->as_phi()->all_incomers_zero_checked()) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
322 function()->add_deferred_zero_check(this, value);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
323 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
324 else {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
325 BasicBlock *continue_block = function()->CreateBlock("not_zero");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
326 SharkState *saved_state = current_state();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
327 set_current_state(saved_state->copy());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
328 zero_check_value(value, continue_block);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
329 builder()->SetInsertPoint(continue_block);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
330 set_current_state(saved_state);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
331 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
332
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
333 value->set_zero_checked(true);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
334 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
335
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
336 void SharkTopLevelBlock::do_deferred_zero_check(SharkValue* value,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
337 int bci,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
338 SharkState* saved_state,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
339 BasicBlock* continue_block) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
340 if (value->as_phi()->all_incomers_zero_checked()) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
341 builder()->CreateBr(continue_block);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
342 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
343 else {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
344 iter()->force_bci(start());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
345 set_current_state(saved_state);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
346 zero_check_value(value, continue_block);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
347 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
348 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
349
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
350 void SharkTopLevelBlock::zero_check_value(SharkValue* value,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
351 BasicBlock* continue_block) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
352 BasicBlock *zero_block = builder()->CreateBlock(continue_block, "zero");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
353
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
354 Value *a, *b;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
355 switch (value->basic_type()) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
356 case T_BYTE:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
357 case T_CHAR:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
358 case T_SHORT:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
359 case T_INT:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
360 a = value->jint_value();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
361 b = LLVMValue::jint_constant(0);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
362 break;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
363 case T_LONG:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
364 a = value->jlong_value();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
365 b = LLVMValue::jlong_constant(0);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
366 break;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
367 case T_OBJECT:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
368 case T_ARRAY:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
369 a = value->jobject_value();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
370 b = LLVMValue::LLVMValue::null();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
371 break;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
372 default:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
373 tty->print_cr("Unhandled type %s", type2name(value->basic_type()));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
374 ShouldNotReachHere();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
375 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
376
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
377 builder()->CreateCondBr(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
378 builder()->CreateICmpNE(a, b), continue_block, zero_block);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
379
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
380 builder()->SetInsertPoint(zero_block);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
381 if (value->is_jobject()) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
382 call_vm(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
383 builder()->throw_NullPointerException(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
384 builder()->CreateIntToPtr(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
385 LLVMValue::intptr_constant((intptr_t) __FILE__),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
386 PointerType::getUnqual(SharkType::jbyte_type())),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
387 LLVMValue::jint_constant(__LINE__),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
388 EX_CHECK_NONE);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
389 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
390 else {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
391 call_vm(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
392 builder()->throw_ArithmeticException(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
393 builder()->CreateIntToPtr(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
394 LLVMValue::intptr_constant((intptr_t) __FILE__),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
395 PointerType::getUnqual(SharkType::jbyte_type())),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
396 LLVMValue::jint_constant(__LINE__),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
397 EX_CHECK_NONE);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
398 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
399
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
400 Value *pending_exception = get_pending_exception();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
401 clear_pending_exception();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
402 handle_exception(pending_exception, EX_CHECK_FULL);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
403 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
404
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
405 void SharkTopLevelBlock::check_bounds(SharkValue* array, SharkValue* index) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
406 BasicBlock *out_of_bounds = function()->CreateBlock("out_of_bounds");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
407 BasicBlock *in_bounds = function()->CreateBlock("in_bounds");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
408
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
409 Value *length = builder()->CreateArrayLength(array->jarray_value());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
410 // we use an unsigned comparison to catch negative values
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
411 builder()->CreateCondBr(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
412 builder()->CreateICmpULT(index->jint_value(), length),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
413 in_bounds, out_of_bounds);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
414
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
415 builder()->SetInsertPoint(out_of_bounds);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
416 SharkState *saved_state = current_state()->copy();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
417
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
418 call_vm(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
419 builder()->throw_ArrayIndexOutOfBoundsException(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
420 builder()->CreateIntToPtr(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
421 LLVMValue::intptr_constant((intptr_t) __FILE__),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
422 PointerType::getUnqual(SharkType::jbyte_type())),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
423 LLVMValue::jint_constant(__LINE__),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
424 index->jint_value(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
425 EX_CHECK_NONE);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
426
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
427 Value *pending_exception = get_pending_exception();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
428 clear_pending_exception();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
429 handle_exception(pending_exception, EX_CHECK_FULL);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
430
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
431 set_current_state(saved_state);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
432
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
433 builder()->SetInsertPoint(in_bounds);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
434 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
435
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
436 void SharkTopLevelBlock::check_pending_exception(int action) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
437 assert(action & EAM_CHECK, "should be");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
438
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
439 BasicBlock *exception = function()->CreateBlock("exception");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
440 BasicBlock *no_exception = function()->CreateBlock("no_exception");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
441
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
442 Value *pending_exception = get_pending_exception();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
443 builder()->CreateCondBr(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
444 builder()->CreateICmpEQ(pending_exception, LLVMValue::null()),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
445 no_exception, exception);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
446
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
447 builder()->SetInsertPoint(exception);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
448 SharkState *saved_state = current_state()->copy();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
449 if (action & EAM_MONITOR_FUDGE) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
450 // The top monitor is marked live, but the exception was thrown
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
451 // while setting it up so we need to mark it dead before we enter
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
452 // any exception handlers as they will not expect it to be there.
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
453 set_num_monitors(num_monitors() - 1);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
454 action ^= EAM_MONITOR_FUDGE;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
455 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
456 clear_pending_exception();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
457 handle_exception(pending_exception, action);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
458 set_current_state(saved_state);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
459
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
460 builder()->SetInsertPoint(no_exception);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
461 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
462
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
463 void SharkTopLevelBlock::compute_exceptions() {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
464 ciExceptionHandlerStream str(target(), start());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
465
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
466 int exc_count = str.count();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
467 _exc_handlers = new GrowableArray<ciExceptionHandler*>(exc_count);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
468 _exceptions = new GrowableArray<SharkTopLevelBlock*>(exc_count);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
469
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
470 int index = 0;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
471 for (; !str.is_done(); str.next()) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
472 ciExceptionHandler *handler = str.handler();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
473 if (handler->handler_bci() == -1)
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
474 break;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
475 _exc_handlers->append(handler);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
476
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
477 // Try and get this exception's handler from typeflow. We should
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
478 // do it this way always, really, except that typeflow sometimes
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
479 // doesn't record exceptions, even loaded ones, and sometimes it
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
480 // returns them with a different handler bci. Why???
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
481 SharkTopLevelBlock *block = NULL;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
482 ciInstanceKlass* klass;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
483 if (handler->is_catch_all()) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
484 klass = java_lang_Throwable_klass();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
485 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
486 else {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
487 klass = handler->catch_klass();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
488 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
489 for (int i = 0; i < ciblock()->exceptions()->length(); i++) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
490 if (klass == ciblock()->exc_klasses()->at(i)) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
491 block = function()->block(ciblock()->exceptions()->at(i)->pre_order());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
492 if (block->start() == handler->handler_bci())
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
493 break;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
494 else
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
495 block = NULL;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
496 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
497 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
498
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
499 // If typeflow let us down then try and figure it out ourselves
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
500 if (block == NULL) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
501 for (int i = 0; i < function()->block_count(); i++) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
502 SharkTopLevelBlock *candidate = function()->block(i);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
503 if (candidate->start() == handler->handler_bci()) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
504 if (block != NULL) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
505 NOT_PRODUCT(warning("there may be trouble ahead"));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
506 block = NULL;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
507 break;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
508 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
509 block = candidate;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
510 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
511 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
512 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
513 _exceptions->append(block);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
514 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
515 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
516
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
517 void SharkTopLevelBlock::handle_exception(Value* exception, int action) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
518 if (action & EAM_HANDLE && num_exceptions() != 0) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
519 // Clear the stack and push the exception onto it
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
520 while (xstack_depth())
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
521 pop();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
522 push(SharkValue::create_jobject(exception, true));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
523
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
524 // Work out how many options we have to check
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
525 bool has_catch_all = exc_handler(num_exceptions() - 1)->is_catch_all();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
526 int num_options = num_exceptions();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
527 if (has_catch_all)
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
528 num_options--;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
529
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
530 // Marshal any non-catch-all handlers
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
531 if (num_options > 0) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
532 bool all_loaded = true;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
533 for (int i = 0; i < num_options; i++) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
534 if (!exc_handler(i)->catch_klass()->is_loaded()) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
535 all_loaded = false;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
536 break;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
537 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
538 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
539
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
540 if (all_loaded)
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
541 marshal_exception_fast(num_options);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
542 else
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
543 marshal_exception_slow(num_options);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
544 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
545
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
546 // Install the catch-all handler, if present
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
547 if (has_catch_all) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
548 SharkTopLevelBlock* handler = this->exception(num_options);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
549 assert(handler != NULL, "catch-all handler cannot be unloaded");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
550
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
551 builder()->CreateBr(handler->entry_block());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
552 handler->add_incoming(current_state());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
553 return;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
554 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
555 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
556
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
557 // No exception handler was found; unwind and return
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
558 handle_return(T_VOID, exception);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
559 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
560
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
561 void SharkTopLevelBlock::marshal_exception_fast(int num_options) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
562 Value *exception_klass = builder()->CreateValueOfStructEntry(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
563 xstack(0)->jobject_value(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
564 in_ByteSize(oopDesc::klass_offset_in_bytes()),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
565 SharkType::oop_type(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
566 "exception_klass");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
567
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
568 for (int i = 0; i < num_options; i++) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
569 Value *check_klass =
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
570 builder()->CreateInlineOop(exc_handler(i)->catch_klass());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
571
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
572 BasicBlock *not_exact = function()->CreateBlock("not_exact");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
573 BasicBlock *not_subtype = function()->CreateBlock("not_subtype");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
574
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
575 builder()->CreateCondBr(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
576 builder()->CreateICmpEQ(check_klass, exception_klass),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
577 handler_for_exception(i), not_exact);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
578
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
579 builder()->SetInsertPoint(not_exact);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
580 builder()->CreateCondBr(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
581 builder()->CreateICmpNE(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
582 builder()->CreateCall2(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
583 builder()->is_subtype_of(), check_klass, exception_klass),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
584 LLVMValue::jbyte_constant(0)),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
585 handler_for_exception(i), not_subtype);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
586
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
587 builder()->SetInsertPoint(not_subtype);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
588 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
589 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
590
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
591 void SharkTopLevelBlock::marshal_exception_slow(int num_options) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
592 int *indexes = NEW_RESOURCE_ARRAY(int, num_options);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
593 for (int i = 0; i < num_options; i++)
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
594 indexes[i] = exc_handler(i)->catch_klass_index();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
595
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
596 Value *index = call_vm(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
597 builder()->find_exception_handler(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
598 builder()->CreateInlineData(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
599 indexes,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
600 num_options * sizeof(int),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
601 PointerType::getUnqual(SharkType::jint_type())),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
602 LLVMValue::jint_constant(num_options),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
603 EX_CHECK_NO_CATCH);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
604
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
605 BasicBlock *no_handler = function()->CreateBlock("no_handler");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
606 SwitchInst *switchinst = builder()->CreateSwitch(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
607 index, no_handler, num_options);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
608
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
609 for (int i = 0; i < num_options; i++) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
610 switchinst->addCase(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
611 LLVMValue::jint_constant(i),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
612 handler_for_exception(i));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
613 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
614
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
615 builder()->SetInsertPoint(no_handler);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
616 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
617
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
618 BasicBlock* SharkTopLevelBlock::handler_for_exception(int index) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
619 SharkTopLevelBlock *successor = this->exception(index);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
620 if (successor) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
621 successor->add_incoming(current_state());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
622 return successor->entry_block();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
623 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
624 else {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
625 return make_trap(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
626 exc_handler(index)->handler_bci(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
627 Deoptimization::make_trap_request(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
628 Deoptimization::Reason_unhandled,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
629 Deoptimization::Action_reinterpret));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
630 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
631 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
632
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
633 void SharkTopLevelBlock::maybe_add_safepoint() {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
634 if (current_state()->has_safepointed())
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
635 return;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
636
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
637 BasicBlock *orig_block = builder()->GetInsertBlock();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
638 SharkState *orig_state = current_state()->copy();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
639
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
640 BasicBlock *do_safepoint = function()->CreateBlock("do_safepoint");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
641 BasicBlock *safepointed = function()->CreateBlock("safepointed");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
642
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
643 Value *state = builder()->CreateLoad(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
644 builder()->CreateIntToPtr(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
645 LLVMValue::intptr_constant(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
646 (intptr_t) SafepointSynchronize::address_of_state()),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
647 PointerType::getUnqual(SharkType::jint_type())),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
648 "state");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
649
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
650 builder()->CreateCondBr(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
651 builder()->CreateICmpEQ(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
652 state,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
653 LLVMValue::jint_constant(SafepointSynchronize::_synchronizing)),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
654 do_safepoint, safepointed);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
655
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
656 builder()->SetInsertPoint(do_safepoint);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
657 call_vm(builder()->safepoint(), EX_CHECK_FULL);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
658 BasicBlock *safepointed_block = builder()->GetInsertBlock();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
659 builder()->CreateBr(safepointed);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
660
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
661 builder()->SetInsertPoint(safepointed);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
662 current_state()->merge(orig_state, orig_block, safepointed_block);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
663
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
664 current_state()->set_has_safepointed(true);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
665 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
666
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
667 void SharkTopLevelBlock::maybe_add_backedge_safepoint() {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
668 if (current_state()->has_safepointed())
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
669 return;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
670
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
671 for (int i = 0; i < num_successors(); i++) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
672 if (successor(i)->can_reach(this)) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
673 maybe_add_safepoint();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
674 break;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
675 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
676 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
677 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
678
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
679 bool SharkTopLevelBlock::can_reach(SharkTopLevelBlock* other) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
680 for (int i = 0; i < function()->block_count(); i++)
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
681 function()->block(i)->_can_reach_visited = false;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
682
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
683 return can_reach_helper(other);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
684 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
685
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
686 bool SharkTopLevelBlock::can_reach_helper(SharkTopLevelBlock* other) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
687 if (this == other)
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
688 return true;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
689
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
690 if (_can_reach_visited)
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
691 return false;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
692 _can_reach_visited = true;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
693
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
694 if (!has_trap()) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
695 for (int i = 0; i < num_successors(); i++) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
696 if (successor(i)->can_reach_helper(other))
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
697 return true;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
698 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
699 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
700
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
701 for (int i = 0; i < num_exceptions(); i++) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
702 SharkTopLevelBlock *handler = exception(i);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
703 if (handler && handler->can_reach_helper(other))
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
704 return true;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
705 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
706
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
707 return false;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
708 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
709
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
710 BasicBlock* SharkTopLevelBlock::make_trap(int trap_bci, int trap_request) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
711 BasicBlock *trap_block = function()->CreateBlock("trap");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
712 BasicBlock *orig_block = builder()->GetInsertBlock();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
713 builder()->SetInsertPoint(trap_block);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
714
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
715 int orig_bci = bci();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
716 iter()->force_bci(trap_bci);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
717
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
718 do_trap(trap_request);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
719
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
720 builder()->SetInsertPoint(orig_block);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
721 iter()->force_bci(orig_bci);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
722
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
723 return trap_block;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
724 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
725
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
726 void SharkTopLevelBlock::do_trap(int trap_request) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
727 decache_for_trap();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
728 builder()->CreateRet(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
729 builder()->CreateCall2(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
730 builder()->uncommon_trap(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
731 thread(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
732 LLVMValue::jint_constant(trap_request)));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
733 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
734
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
735 void SharkTopLevelBlock::call_register_finalizer(Value *receiver) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
736 BasicBlock *orig_block = builder()->GetInsertBlock();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
737 SharkState *orig_state = current_state()->copy();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
738
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
739 BasicBlock *do_call = function()->CreateBlock("has_finalizer");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
740 BasicBlock *done = function()->CreateBlock("done");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
741
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
742 Value *klass = builder()->CreateValueOfStructEntry(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
743 receiver,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
744 in_ByteSize(oopDesc::klass_offset_in_bytes()),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
745 SharkType::oop_type(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
746 "klass");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
747
4762
069ab3f976d3 7118863: Move sizeof(klassOopDesc) into the *Klass::*_offset_in_bytes() functions
stefank
parents: 1972
diff changeset
748 Value *access_flags = builder()->CreateValueOfStructEntry(
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
749 klass,
4762
069ab3f976d3 7118863: Move sizeof(klassOopDesc) into the *Klass::*_offset_in_bytes() functions
stefank
parents: 1972
diff changeset
750 Klass::access_flags_offset(),
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
751 SharkType::jint_type(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
752 "access_flags");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
753
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
754 builder()->CreateCondBr(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
755 builder()->CreateICmpNE(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
756 builder()->CreateAnd(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
757 access_flags,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
758 LLVMValue::jint_constant(JVM_ACC_HAS_FINALIZER)),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
759 LLVMValue::jint_constant(0)),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
760 do_call, done);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
761
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
762 builder()->SetInsertPoint(do_call);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
763 call_vm(builder()->register_finalizer(), receiver, EX_CHECK_FULL);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
764 BasicBlock *branch_block = builder()->GetInsertBlock();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
765 builder()->CreateBr(done);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
766
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
767 builder()->SetInsertPoint(done);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
768 current_state()->merge(orig_state, orig_block, branch_block);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
769 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
770
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
771 void SharkTopLevelBlock::handle_return(BasicType type, Value* exception) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
772 assert (exception == NULL || type == T_VOID, "exception OR result, please");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
773
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
774 if (num_monitors()) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
775 // Protect our exception across possible monitor release decaches
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
776 if (exception)
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
777 set_oop_tmp(exception);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
778
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
779 // We don't need to check for exceptions thrown here. If
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
780 // we're returning a value then we just carry on as normal:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
781 // the caller will see the pending exception and handle it.
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
782 // If we're returning with an exception then that exception
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
783 // takes priority and the release_lock one will be ignored.
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
784 while (num_monitors())
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
785 release_lock(EX_CHECK_NONE);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
786
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
787 // Reload the exception we're throwing
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
788 if (exception)
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
789 exception = get_oop_tmp();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
790 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
791
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
792 if (exception) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
793 builder()->CreateStore(exception, pending_exception_address());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
794 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
795
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
796 Value *result_addr = stack()->CreatePopFrame(type2size[type]);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
797 if (type != T_VOID) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
798 builder()->CreateStore(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
799 pop_result(type)->generic_value(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
800 builder()->CreateIntToPtr(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
801 result_addr,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
802 PointerType::getUnqual(SharkType::to_stackType(type))));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
803 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
804
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
805 builder()->CreateRet(LLVMValue::jint_constant(0));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
806 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
807
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
808 void SharkTopLevelBlock::do_arraylength() {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
809 SharkValue *array = pop();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
810 check_null(array);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
811 Value *length = builder()->CreateArrayLength(array->jarray_value());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
812 push(SharkValue::create_jint(length, false));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
813 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
814
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
815 void SharkTopLevelBlock::do_aload(BasicType basic_type) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
816 SharkValue *index = pop();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
817 SharkValue *array = pop();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
818
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
819 check_null(array);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
820 check_bounds(array, index);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
821
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
822 Value *value = builder()->CreateLoad(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
823 builder()->CreateArrayAddress(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
824 array->jarray_value(), basic_type, index->jint_value()));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
825
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
826 const Type *stack_type = SharkType::to_stackType(basic_type);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
827 if (value->getType() != stack_type)
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
828 value = builder()->CreateIntCast(value, stack_type, basic_type != T_CHAR);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
829
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
830 switch (basic_type) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
831 case T_BYTE:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
832 case T_CHAR:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
833 case T_SHORT:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
834 case T_INT:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
835 push(SharkValue::create_jint(value, false));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
836 break;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
837
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
838 case T_LONG:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
839 push(SharkValue::create_jlong(value, false));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
840 break;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
841
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
842 case T_FLOAT:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
843 push(SharkValue::create_jfloat(value));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
844 break;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
845
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
846 case T_DOUBLE:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
847 push(SharkValue::create_jdouble(value));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
848 break;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
849
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
850 case T_OBJECT:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
851 // You might expect that array->type()->is_array_klass() would
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
852 // always be true, but it isn't. If ciTypeFlow detects that a
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
853 // value is always null then that value becomes an untyped null
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
854 // object. Shark doesn't presently support this, so a generic
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
855 // T_OBJECT is created. In this case we guess the type using
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
856 // the BasicType we were supplied. In reality the generated
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
857 // code will never be used, as the null value will be caught
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
858 // by the above null pointer check.
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
859 // http://icedtea.classpath.org/bugzilla/show_bug.cgi?id=324
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
860 push(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
861 SharkValue::create_generic(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
862 array->type()->is_array_klass() ?
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
863 ((ciArrayKlass *) array->type())->element_type() :
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
864 ciType::make(basic_type),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
865 value, false));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
866 break;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
867
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
868 default:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
869 tty->print_cr("Unhandled type %s", type2name(basic_type));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
870 ShouldNotReachHere();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
871 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
872 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
873
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
874 void SharkTopLevelBlock::do_astore(BasicType basic_type) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
875 SharkValue *svalue = pop();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
876 SharkValue *index = pop();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
877 SharkValue *array = pop();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
878
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
879 check_null(array);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
880 check_bounds(array, index);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
881
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
882 Value *value;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
883 switch (basic_type) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
884 case T_BYTE:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
885 case T_CHAR:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
886 case T_SHORT:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
887 case T_INT:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
888 value = svalue->jint_value();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
889 break;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
890
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
891 case T_LONG:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
892 value = svalue->jlong_value();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
893 break;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
894
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
895 case T_FLOAT:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
896 value = svalue->jfloat_value();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
897 break;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
898
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
899 case T_DOUBLE:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
900 value = svalue->jdouble_value();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
901 break;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
902
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
903 case T_OBJECT:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
904 value = svalue->jobject_value();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
905 // XXX assignability check
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
906 break;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
907
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
908 default:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
909 tty->print_cr("Unhandled type %s", type2name(basic_type));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
910 ShouldNotReachHere();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
911 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
912
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
913 const Type *array_type = SharkType::to_arrayType(basic_type);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
914 if (value->getType() != array_type)
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
915 value = builder()->CreateIntCast(value, array_type, basic_type != T_CHAR);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
916
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
917 Value *addr = builder()->CreateArrayAddress(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
918 array->jarray_value(), basic_type, index->jint_value(), "addr");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
919
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
920 builder()->CreateStore(value, addr);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
921
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
922 if (basic_type == T_OBJECT) // XXX or T_ARRAY?
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
923 builder()->CreateUpdateBarrierSet(oopDesc::bs(), addr);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
924 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
925
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
926 void SharkTopLevelBlock::do_return(BasicType type) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
927 if (target()->intrinsic_id() == vmIntrinsics::_Object_init)
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
928 call_register_finalizer(local(0)->jobject_value());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
929 maybe_add_safepoint();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
930 handle_return(type, NULL);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
931 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
932
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
933 void SharkTopLevelBlock::do_athrow() {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
934 SharkValue *exception = pop();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
935 check_null(exception);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
936 handle_exception(exception->jobject_value(), EX_CHECK_FULL);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
937 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
938
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
939 void SharkTopLevelBlock::do_goto() {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
940 do_branch(ciTypeFlow::GOTO_TARGET);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
941 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
942
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
943 void SharkTopLevelBlock::do_jsr() {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
944 push(SharkValue::address_constant(iter()->next_bci()));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
945 do_branch(ciTypeFlow::GOTO_TARGET);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
946 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
947
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
948 void SharkTopLevelBlock::do_ret() {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
949 assert(local(iter()->get_index())->address_value() ==
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
950 successor(ciTypeFlow::GOTO_TARGET)->start(), "should be");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
951 do_branch(ciTypeFlow::GOTO_TARGET);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
952 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
953
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
954 // All propagation of state from one block to the next (via
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
955 // dest->add_incoming) is handled by these methods:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
956 // do_branch
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
957 // do_if_helper
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
958 // do_switch
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
959 // handle_exception
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
960
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
961 void SharkTopLevelBlock::do_branch(int successor_index) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
962 SharkTopLevelBlock *dest = successor(successor_index);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
963 builder()->CreateBr(dest->entry_block());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
964 dest->add_incoming(current_state());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
965 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
966
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
967 void SharkTopLevelBlock::do_if(ICmpInst::Predicate p,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
968 SharkValue* b,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
969 SharkValue* a) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
970 Value *llvm_a, *llvm_b;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
971 if (a->is_jobject()) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
972 llvm_a = a->intptr_value(builder());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
973 llvm_b = b->intptr_value(builder());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
974 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
975 else {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
976 llvm_a = a->jint_value();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
977 llvm_b = b->jint_value();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
978 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
979 do_if_helper(p, llvm_b, llvm_a, current_state(), current_state());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
980 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
981
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
982 void SharkTopLevelBlock::do_if_helper(ICmpInst::Predicate p,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
983 Value* b,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
984 Value* a,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
985 SharkState* if_taken_state,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
986 SharkState* not_taken_state) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
987 SharkTopLevelBlock *if_taken = successor(ciTypeFlow::IF_TAKEN);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
988 SharkTopLevelBlock *not_taken = successor(ciTypeFlow::IF_NOT_TAKEN);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
989
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
990 builder()->CreateCondBr(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
991 builder()->CreateICmp(p, a, b),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
992 if_taken->entry_block(), not_taken->entry_block());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
993
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
994 if_taken->add_incoming(if_taken_state);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
995 not_taken->add_incoming(not_taken_state);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
996 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
997
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
998 void SharkTopLevelBlock::do_switch() {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
999 int len = switch_table_length();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1000
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1001 SharkTopLevelBlock *dest_block = successor(ciTypeFlow::SWITCH_DEFAULT);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1002 SwitchInst *switchinst = builder()->CreateSwitch(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1003 pop()->jint_value(), dest_block->entry_block(), len);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1004 dest_block->add_incoming(current_state());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1005
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1006 for (int i = 0; i < len; i++) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1007 int dest_bci = switch_dest(i);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1008 if (dest_bci != switch_default_dest()) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1009 dest_block = bci_successor(dest_bci);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1010 switchinst->addCase(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1011 LLVMValue::jint_constant(switch_key(i)),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1012 dest_block->entry_block());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1013 dest_block->add_incoming(current_state());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1014 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1015 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1016 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1017
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1018 ciMethod* SharkTopLevelBlock::improve_virtual_call(ciMethod* caller,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1019 ciInstanceKlass* klass,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1020 ciMethod* dest_method,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1021 ciType* receiver_type) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1022 // If the method is obviously final then we are already done
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1023 if (dest_method->can_be_statically_bound())
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1024 return dest_method;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1025
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1026 // Array methods are all inherited from Object and are monomorphic
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1027 if (receiver_type->is_array_klass() &&
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1028 dest_method->holder() == java_lang_Object_klass())
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1029 return dest_method;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1030
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1031 #ifdef SHARK_CAN_DEOPTIMIZE_ANYWHERE
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1032 // This code can replace a virtual call with a direct call if this
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1033 // class is the only one in the entire set of loaded classes that
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1034 // implements this method. This makes the compiled code dependent
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1035 // on other classes that implement the method not being loaded, a
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1036 // condition which is enforced by the dependency tracker. If the
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1037 // dependency tracker determines a method has become invalid it
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1038 // will mark it for recompilation, causing running copies to be
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1039 // deoptimized. Shark currently can't deoptimize arbitrarily like
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1040 // that, so this optimization cannot be used.
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1041 // http://icedtea.classpath.org/bugzilla/show_bug.cgi?id=481
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1042
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1043 // All other interesting cases are instance classes
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1044 if (!receiver_type->is_instance_klass())
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1045 return NULL;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1046
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1047 // Attempt to improve the receiver
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1048 ciInstanceKlass* actual_receiver = klass;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1049 ciInstanceKlass *improved_receiver = receiver_type->as_instance_klass();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1050 if (improved_receiver->is_loaded() &&
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1051 improved_receiver->is_initialized() &&
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1052 !improved_receiver->is_interface() &&
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1053 improved_receiver->is_subtype_of(actual_receiver)) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1054 actual_receiver = improved_receiver;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1055 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1056
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1057 // Attempt to find a monomorphic target for this call using
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1058 // class heirachy analysis.
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1059 ciInstanceKlass *calling_klass = caller->holder();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1060 ciMethod* monomorphic_target =
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1061 dest_method->find_monomorphic_target(calling_klass, klass, actual_receiver);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1062 if (monomorphic_target != NULL) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1063 assert(!monomorphic_target->is_abstract(), "shouldn't be");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1064
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1065 // Opto has a bunch of type checking here that I don't
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1066 // understand. It's to inhibit casting in one direction,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1067 // possibly because objects in Opto can have inexact
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1068 // types, but I can't even tell which direction it
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1069 // doesn't like. For now I'm going to block *any* cast.
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1070 if (monomorphic_target != dest_method) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1071 if (SharkPerformanceWarnings) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1072 warning("found monomorphic target, but inhibited cast:");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1073 tty->print(" dest_method = ");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1074 dest_method->print_short_name(tty);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1075 tty->cr();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1076 tty->print(" monomorphic_target = ");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1077 monomorphic_target->print_short_name(tty);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1078 tty->cr();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1079 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1080 monomorphic_target = NULL;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1081 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1082 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1083
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1084 // Replace the virtual call with a direct one. This makes
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1085 // us dependent on that target method not getting overridden
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1086 // by dynamic class loading.
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1087 if (monomorphic_target != NULL) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1088 dependencies()->assert_unique_concrete_method(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1089 actual_receiver, monomorphic_target);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1090 return monomorphic_target;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1091 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1092
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1093 // Because Opto distinguishes exact types from inexact ones
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1094 // it can perform a further optimization to replace calls
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1095 // with non-monomorphic targets if the receiver has an exact
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1096 // type. We don't mark types this way, so we can't do this.
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1097
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1098 #endif // SHARK_CAN_DEOPTIMIZE_ANYWHERE
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1099
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1100 return NULL;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1101 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1102
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1103 Value *SharkTopLevelBlock::get_direct_callee(ciMethod* method) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1104 return builder()->CreateBitCast(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1105 builder()->CreateInlineOop(method),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1106 SharkType::methodOop_type(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1107 "callee");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1108 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1109
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1110 Value *SharkTopLevelBlock::get_virtual_callee(SharkValue* receiver,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1111 int vtable_index) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1112 Value *klass = builder()->CreateValueOfStructEntry(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1113 receiver->jobject_value(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1114 in_ByteSize(oopDesc::klass_offset_in_bytes()),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1115 SharkType::oop_type(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1116 "klass");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1117
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1118 return builder()->CreateLoad(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1119 builder()->CreateArrayAddress(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1120 klass,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1121 SharkType::methodOop_type(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1122 vtableEntry::size() * wordSize,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1123 in_ByteSize(instanceKlass::vtable_start_offset() * wordSize),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1124 LLVMValue::intptr_constant(vtable_index)),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1125 "callee");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1126 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1127
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1128 Value* SharkTopLevelBlock::get_interface_callee(SharkValue *receiver,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1129 ciMethod* method) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1130 BasicBlock *loop = function()->CreateBlock("loop");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1131 BasicBlock *got_null = function()->CreateBlock("got_null");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1132 BasicBlock *not_null = function()->CreateBlock("not_null");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1133 BasicBlock *next = function()->CreateBlock("next");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1134 BasicBlock *got_entry = function()->CreateBlock("got_entry");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1135
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1136 // Locate the receiver's itable
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1137 Value *object_klass = builder()->CreateValueOfStructEntry(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1138 receiver->jobject_value(), in_ByteSize(oopDesc::klass_offset_in_bytes()),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1139 SharkType::oop_type(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1140 "object_klass");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1141
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1142 Value *vtable_start = builder()->CreateAdd(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1143 builder()->CreatePtrToInt(object_klass, SharkType::intptr_type()),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1144 LLVMValue::intptr_constant(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1145 instanceKlass::vtable_start_offset() * HeapWordSize),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1146 "vtable_start");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1147
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1148 Value *vtable_length = builder()->CreateValueOfStructEntry(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1149 object_klass,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1150 in_ByteSize(instanceKlass::vtable_length_offset() * HeapWordSize),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1151 SharkType::jint_type(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1152 "vtable_length");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1153 vtable_length =
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1154 builder()->CreateIntCast(vtable_length, SharkType::intptr_type(), false);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1155
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1156 bool needs_aligning = HeapWordsPerLong > 1;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1157 Value *itable_start = builder()->CreateAdd(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1158 vtable_start,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1159 builder()->CreateShl(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1160 vtable_length,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1161 LLVMValue::intptr_constant(exact_log2(vtableEntry::size() * wordSize))),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1162 needs_aligning ? "" : "itable_start");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1163 if (needs_aligning) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1164 itable_start = builder()->CreateAnd(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1165 builder()->CreateAdd(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1166 itable_start, LLVMValue::intptr_constant(BytesPerLong - 1)),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1167 LLVMValue::intptr_constant(~(BytesPerLong - 1)),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1168 "itable_start");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1169 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1170
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1171 // Locate this interface's entry in the table
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1172 Value *iklass = builder()->CreateInlineOop(method->holder());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1173 BasicBlock *loop_entry = builder()->GetInsertBlock();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1174 builder()->CreateBr(loop);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1175 builder()->SetInsertPoint(loop);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1176 PHINode *itable_entry_addr = builder()->CreatePHI(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1177 SharkType::intptr_type(), "itable_entry_addr");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1178 itable_entry_addr->addIncoming(itable_start, loop_entry);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1179
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1180 Value *itable_entry = builder()->CreateIntToPtr(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1181 itable_entry_addr, SharkType::itableOffsetEntry_type(), "itable_entry");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1182
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1183 Value *itable_iklass = builder()->CreateValueOfStructEntry(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1184 itable_entry,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1185 in_ByteSize(itableOffsetEntry::interface_offset_in_bytes()),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1186 SharkType::oop_type(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1187 "itable_iklass");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1188
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1189 builder()->CreateCondBr(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1190 builder()->CreateICmpEQ(itable_iklass, LLVMValue::null()),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1191 got_null, not_null);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1192
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1193 // A null entry means that the class doesn't implement the
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1194 // interface, and wasn't the same as the class checked when
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1195 // the interface was resolved.
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1196 builder()->SetInsertPoint(got_null);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1197 builder()->CreateUnimplemented(__FILE__, __LINE__);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1198 builder()->CreateUnreachable();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1199
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1200 builder()->SetInsertPoint(not_null);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1201 builder()->CreateCondBr(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1202 builder()->CreateICmpEQ(itable_iklass, iklass),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1203 got_entry, next);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1204
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1205 builder()->SetInsertPoint(next);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1206 Value *next_entry = builder()->CreateAdd(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1207 itable_entry_addr,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1208 LLVMValue::intptr_constant(itableOffsetEntry::size() * wordSize));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1209 builder()->CreateBr(loop);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1210 itable_entry_addr->addIncoming(next_entry, next);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1211
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1212 // Locate the method pointer
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1213 builder()->SetInsertPoint(got_entry);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1214 Value *offset = builder()->CreateValueOfStructEntry(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1215 itable_entry,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1216 in_ByteSize(itableOffsetEntry::offset_offset_in_bytes()),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1217 SharkType::jint_type(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1218 "offset");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1219 offset =
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1220 builder()->CreateIntCast(offset, SharkType::intptr_type(), false);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1221
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1222 return builder()->CreateLoad(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1223 builder()->CreateIntToPtr(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1224 builder()->CreateAdd(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1225 builder()->CreateAdd(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1226 builder()->CreateAdd(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1227 builder()->CreatePtrToInt(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1228 object_klass, SharkType::intptr_type()),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1229 offset),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1230 LLVMValue::intptr_constant(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1231 method->itable_index() * itableMethodEntry::size() * wordSize)),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1232 LLVMValue::intptr_constant(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1233 itableMethodEntry::method_offset_in_bytes())),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1234 PointerType::getUnqual(SharkType::methodOop_type())),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1235 "callee");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1236 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1237
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1238 void SharkTopLevelBlock::do_call() {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1239 // Set frequently used booleans
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1240 bool is_static = bc() == Bytecodes::_invokestatic;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1241 bool is_virtual = bc() == Bytecodes::_invokevirtual;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1242 bool is_interface = bc() == Bytecodes::_invokeinterface;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1243
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1244 // Find the method being called
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1245 bool will_link;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1246 ciMethod *dest_method = iter()->get_method(will_link);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1247 assert(will_link, "typeflow responsibility");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1248 assert(dest_method->is_static() == is_static, "must match bc");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1249
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1250 // Find the class of the method being called. Note
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1251 // that the superclass check in the second assertion
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1252 // is to cope with a hole in the spec that allows for
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1253 // invokeinterface instructions where the resolved
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1254 // method is a virtual method in java.lang.Object.
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1255 // javac doesn't generate code like that, but there's
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1256 // no reason a compliant Java compiler might not.
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1257 ciInstanceKlass *holder_klass = dest_method->holder();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1258 assert(holder_klass->is_loaded(), "scan_for_traps responsibility");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1259 assert(holder_klass->is_interface() ||
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1260 holder_klass->super() == NULL ||
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1261 !is_interface, "must match bc");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1262 ciKlass *holder = iter()->get_declared_method_holder();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1263 ciInstanceKlass *klass =
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1264 ciEnv::get_instance_klass_for_declared_method_holder(holder);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1265
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1266 // Find the receiver in the stack. We do this before
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1267 // trying to inline because the inliner can only use
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1268 // zero-checked values, not being able to perform the
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1269 // check itself.
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1270 SharkValue *receiver = NULL;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1271 if (!is_static) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1272 receiver = xstack(dest_method->arg_size() - 1);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1273 check_null(receiver);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1274 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1275
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1276 // Try to improve non-direct calls
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1277 bool call_is_virtual = is_virtual || is_interface;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1278 ciMethod *call_method = dest_method;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1279 if (call_is_virtual) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1280 ciMethod *optimized_method = improve_virtual_call(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1281 target(), klass, dest_method, receiver->type());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1282 if (optimized_method) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1283 call_method = optimized_method;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1284 call_is_virtual = false;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1285 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1286 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1287
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1288 // Try to inline the call
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1289 if (!call_is_virtual) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1290 if (SharkInliner::attempt_inline(call_method, current_state()))
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1291 return;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1292 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1293
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1294 // Find the method we are calling
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1295 Value *callee;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1296 if (call_is_virtual) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1297 if (is_virtual) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1298 assert(klass->is_linked(), "scan_for_traps responsibility");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1299 int vtable_index = call_method->resolve_vtable_index(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1300 target()->holder(), klass);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1301 assert(vtable_index >= 0, "should be");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1302 callee = get_virtual_callee(receiver, vtable_index);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1303 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1304 else {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1305 assert(is_interface, "should be");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1306 callee = get_interface_callee(receiver, call_method);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1307 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1308 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1309 else {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1310 callee = get_direct_callee(call_method);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1311 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1312
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1313 // Load the SharkEntry from the callee
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1314 Value *base_pc = builder()->CreateValueOfStructEntry(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1315 callee, methodOopDesc::from_interpreted_offset(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1316 SharkType::intptr_type(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1317 "base_pc");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1318
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1319 // Load the entry point from the SharkEntry
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1320 Value *entry_point = builder()->CreateLoad(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1321 builder()->CreateIntToPtr(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1322 builder()->CreateAdd(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1323 base_pc,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1324 LLVMValue::intptr_constant(in_bytes(ZeroEntry::entry_point_offset()))),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1325 PointerType::getUnqual(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1326 PointerType::getUnqual(SharkType::entry_point_type()))),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1327 "entry_point");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1328
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1329 // Make the call
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1330 decache_for_Java_call(call_method);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1331 Value *deoptimized_frames = builder()->CreateCall3(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1332 entry_point, callee, base_pc, thread());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1333
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1334 // If the callee got deoptimized then reexecute in the interpreter
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1335 BasicBlock *reexecute = function()->CreateBlock("reexecute");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1336 BasicBlock *call_completed = function()->CreateBlock("call_completed");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1337 builder()->CreateCondBr(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1338 builder()->CreateICmpNE(deoptimized_frames, LLVMValue::jint_constant(0)),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1339 reexecute, call_completed);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1340
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1341 builder()->SetInsertPoint(reexecute);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1342 builder()->CreateCall2(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1343 builder()->deoptimized_entry_point(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1344 builder()->CreateSub(deoptimized_frames, LLVMValue::jint_constant(1)),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1345 thread());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1346 builder()->CreateBr(call_completed);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1347
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1348 // Cache after the call
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1349 builder()->SetInsertPoint(call_completed);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1350 cache_after_Java_call(call_method);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1351
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1352 // Check for pending exceptions
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1353 check_pending_exception(EX_CHECK_FULL);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1354
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1355 // Mark that a safepoint check has occurred
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1356 current_state()->set_has_safepointed(true);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1357 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1358
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1359 bool SharkTopLevelBlock::static_subtype_check(ciKlass* check_klass,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1360 ciKlass* object_klass) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1361 // If the class we're checking against is java.lang.Object
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1362 // then this is a no brainer. Apparently this can happen
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1363 // in reflective code...
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1364 if (check_klass == java_lang_Object_klass())
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1365 return true;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1366
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1367 // Perform a subtype check. NB in opto's code for this
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1368 // (GraphKit::static_subtype_check) it says that static
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1369 // interface types cannot be trusted, and if opto can't
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1370 // trust them then I assume we can't either.
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1371 if (object_klass->is_loaded() && !object_klass->is_interface()) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1372 if (object_klass == check_klass)
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1373 return true;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1374
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1375 if (check_klass->is_loaded() && object_klass->is_subtype_of(check_klass))
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1376 return true;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1377 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1378
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1379 return false;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1380 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1381
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1382 void SharkTopLevelBlock::do_instance_check() {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1383 // Get the class we're checking against
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1384 bool will_link;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1385 ciKlass *check_klass = iter()->get_klass(will_link);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1386
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1387 // Get the class of the object we're checking
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1388 ciKlass *object_klass = xstack(0)->type()->as_klass();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1389
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1390 // Can we optimize this check away?
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1391 if (static_subtype_check(check_klass, object_klass)) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1392 if (bc() == Bytecodes::_instanceof) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1393 pop();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1394 push(SharkValue::jint_constant(1));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1395 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1396 return;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1397 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1398
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1399 // Need to check this one at runtime
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1400 if (will_link)
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1401 do_full_instance_check(check_klass);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1402 else
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1403 do_trapping_instance_check(check_klass);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1404 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1405
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1406 bool SharkTopLevelBlock::maybe_do_instanceof_if() {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1407 // Get the class we're checking against
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1408 bool will_link;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1409 ciKlass *check_klass = iter()->get_klass(will_link);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1410
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1411 // If the class is unloaded then the instanceof
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1412 // cannot possibly succeed.
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1413 if (!will_link)
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1414 return false;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1415
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1416 // Keep a copy of the object we're checking
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1417 SharkValue *old_object = xstack(0);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1418
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1419 // Get the class of the object we're checking
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1420 ciKlass *object_klass = old_object->type()->as_klass();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1421
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1422 // If the instanceof can be optimized away at compile time
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1423 // then any subsequent checkcasts will be too so we handle
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1424 // it normally.
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1425 if (static_subtype_check(check_klass, object_klass))
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1426 return false;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1427
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1428 // Perform the instance check
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1429 do_full_instance_check(check_klass);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1430 Value *result = pop()->jint_value();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1431
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1432 // Create the casted object
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1433 SharkValue *new_object = SharkValue::create_generic(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1434 check_klass, old_object->jobject_value(), old_object->zero_checked());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1435
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1436 // Create two copies of the current state, one with the
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1437 // original object and one with all instances of the
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1438 // original object replaced with the new, casted object.
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1439 SharkState *new_state = current_state();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1440 SharkState *old_state = new_state->copy();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1441 new_state->replace_all(old_object, new_object);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1442
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1443 // Perform the check-and-branch
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1444 switch (iter()->next_bc()) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1445 case Bytecodes::_ifeq:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1446 // branch if not an instance
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1447 do_if_helper(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1448 ICmpInst::ICMP_EQ,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1449 LLVMValue::jint_constant(0), result,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1450 old_state, new_state);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1451 break;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1452
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1453 case Bytecodes::_ifne:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1454 // branch if an instance
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1455 do_if_helper(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1456 ICmpInst::ICMP_NE,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1457 LLVMValue::jint_constant(0), result,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1458 new_state, old_state);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1459 break;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1460
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1461 default:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1462 ShouldNotReachHere();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1463 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1464
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1465 return true;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1466 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1467
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1468 void SharkTopLevelBlock::do_full_instance_check(ciKlass* klass) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1469 BasicBlock *not_null = function()->CreateBlock("not_null");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1470 BasicBlock *subtype_check = function()->CreateBlock("subtype_check");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1471 BasicBlock *is_instance = function()->CreateBlock("is_instance");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1472 BasicBlock *not_instance = function()->CreateBlock("not_instance");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1473 BasicBlock *merge1 = function()->CreateBlock("merge1");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1474 BasicBlock *merge2 = function()->CreateBlock("merge2");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1475
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1476 enum InstanceCheckStates {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1477 IC_IS_NULL,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1478 IC_IS_INSTANCE,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1479 IC_NOT_INSTANCE,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1480 };
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1481
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1482 // Pop the object off the stack
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1483 Value *object = pop()->jobject_value();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1484
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1485 // Null objects aren't instances of anything
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1486 builder()->CreateCondBr(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1487 builder()->CreateICmpEQ(object, LLVMValue::null()),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1488 merge2, not_null);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1489 BasicBlock *null_block = builder()->GetInsertBlock();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1490
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1491 // Get the class we're checking against
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1492 builder()->SetInsertPoint(not_null);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1493 Value *check_klass = builder()->CreateInlineOop(klass);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1494
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1495 // Get the class of the object being tested
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1496 Value *object_klass = builder()->CreateValueOfStructEntry(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1497 object, in_ByteSize(oopDesc::klass_offset_in_bytes()),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1498 SharkType::oop_type(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1499 "object_klass");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1500
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1501 // Perform the check
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1502 builder()->CreateCondBr(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1503 builder()->CreateICmpEQ(check_klass, object_klass),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1504 is_instance, subtype_check);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1505
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1506 builder()->SetInsertPoint(subtype_check);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1507 builder()->CreateCondBr(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1508 builder()->CreateICmpNE(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1509 builder()->CreateCall2(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1510 builder()->is_subtype_of(), check_klass, object_klass),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1511 LLVMValue::jbyte_constant(0)),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1512 is_instance, not_instance);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1513
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1514 builder()->SetInsertPoint(is_instance);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1515 builder()->CreateBr(merge1);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1516
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1517 builder()->SetInsertPoint(not_instance);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1518 builder()->CreateBr(merge1);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1519
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1520 // First merge
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1521 builder()->SetInsertPoint(merge1);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1522 PHINode *nonnull_result = builder()->CreatePHI(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1523 SharkType::jint_type(), "nonnull_result");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1524 nonnull_result->addIncoming(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1525 LLVMValue::jint_constant(IC_IS_INSTANCE), is_instance);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1526 nonnull_result->addIncoming(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1527 LLVMValue::jint_constant(IC_NOT_INSTANCE), not_instance);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1528 BasicBlock *nonnull_block = builder()->GetInsertBlock();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1529 builder()->CreateBr(merge2);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1530
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1531 // Second merge
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1532 builder()->SetInsertPoint(merge2);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1533 PHINode *result = builder()->CreatePHI(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1534 SharkType::jint_type(), "result");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1535 result->addIncoming(LLVMValue::jint_constant(IC_IS_NULL), null_block);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1536 result->addIncoming(nonnull_result, nonnull_block);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1537
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1538 // Handle the result
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1539 if (bc() == Bytecodes::_checkcast) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1540 BasicBlock *failure = function()->CreateBlock("failure");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1541 BasicBlock *success = function()->CreateBlock("success");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1542
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1543 builder()->CreateCondBr(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1544 builder()->CreateICmpNE(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1545 result, LLVMValue::jint_constant(IC_NOT_INSTANCE)),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1546 success, failure);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1547
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1548 builder()->SetInsertPoint(failure);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1549 SharkState *saved_state = current_state()->copy();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1550
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1551 call_vm(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1552 builder()->throw_ClassCastException(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1553 builder()->CreateIntToPtr(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1554 LLVMValue::intptr_constant((intptr_t) __FILE__),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1555 PointerType::getUnqual(SharkType::jbyte_type())),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1556 LLVMValue::jint_constant(__LINE__),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1557 EX_CHECK_NONE);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1558
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1559 Value *pending_exception = get_pending_exception();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1560 clear_pending_exception();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1561 handle_exception(pending_exception, EX_CHECK_FULL);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1562
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1563 set_current_state(saved_state);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1564 builder()->SetInsertPoint(success);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1565 push(SharkValue::create_generic(klass, object, false));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1566 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1567 else {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1568 push(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1569 SharkValue::create_jint(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1570 builder()->CreateIntCast(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1571 builder()->CreateICmpEQ(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1572 result, LLVMValue::jint_constant(IC_IS_INSTANCE)),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1573 SharkType::jint_type(), false), false));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1574 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1575 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1576
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1577 void SharkTopLevelBlock::do_trapping_instance_check(ciKlass* klass) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1578 BasicBlock *not_null = function()->CreateBlock("not_null");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1579 BasicBlock *is_null = function()->CreateBlock("null");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1580
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1581 // Leave the object on the stack so it's there if we trap
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1582 builder()->CreateCondBr(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1583 builder()->CreateICmpEQ(xstack(0)->jobject_value(), LLVMValue::null()),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1584 is_null, not_null);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1585 SharkState *saved_state = current_state()->copy();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1586
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1587 // If it's not null then we need to trap
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1588 builder()->SetInsertPoint(not_null);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1589 set_current_state(saved_state->copy());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1590 do_trap(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1591 Deoptimization::make_trap_request(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1592 Deoptimization::Reason_uninitialized,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1593 Deoptimization::Action_reinterpret));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1594
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1595 // If it's null then we're ok
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1596 builder()->SetInsertPoint(is_null);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1597 set_current_state(saved_state);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1598 if (bc() == Bytecodes::_checkcast) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1599 push(SharkValue::create_generic(klass, pop()->jobject_value(), false));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1600 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1601 else {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1602 pop();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1603 push(SharkValue::jint_constant(0));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1604 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1605 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1606
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1607 void SharkTopLevelBlock::do_new() {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1608 bool will_link;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1609 ciInstanceKlass* klass = iter()->get_klass(will_link)->as_instance_klass();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1610 assert(will_link, "typeflow responsibility");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1611
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1612 BasicBlock *got_tlab = NULL;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1613 BasicBlock *heap_alloc = NULL;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1614 BasicBlock *retry = NULL;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1615 BasicBlock *got_heap = NULL;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1616 BasicBlock *initialize = NULL;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1617 BasicBlock *got_fast = NULL;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1618 BasicBlock *slow_alloc_and_init = NULL;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1619 BasicBlock *got_slow = NULL;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1620 BasicBlock *push_object = NULL;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1621
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1622 SharkState *fast_state = NULL;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1623
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1624 Value *tlab_object = NULL;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1625 Value *heap_object = NULL;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1626 Value *fast_object = NULL;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1627 Value *slow_object = NULL;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1628 Value *object = NULL;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1629
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1630 // The fast path
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1631 if (!Klass::layout_helper_needs_slow_path(klass->layout_helper())) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1632 if (UseTLAB) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1633 got_tlab = function()->CreateBlock("got_tlab");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1634 heap_alloc = function()->CreateBlock("heap_alloc");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1635 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1636 retry = function()->CreateBlock("retry");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1637 got_heap = function()->CreateBlock("got_heap");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1638 initialize = function()->CreateBlock("initialize");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1639 slow_alloc_and_init = function()->CreateBlock("slow_alloc_and_init");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1640 push_object = function()->CreateBlock("push_object");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1641
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1642 size_t size_in_bytes = klass->size_helper() << LogHeapWordSize;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1643
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1644 // Thread local allocation
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1645 if (UseTLAB) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1646 Value *top_addr = builder()->CreateAddressOfStructEntry(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1647 thread(), Thread::tlab_top_offset(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1648 PointerType::getUnqual(SharkType::intptr_type()),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1649 "top_addr");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1650
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1651 Value *end = builder()->CreateValueOfStructEntry(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1652 thread(), Thread::tlab_end_offset(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1653 SharkType::intptr_type(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1654 "end");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1655
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1656 Value *old_top = builder()->CreateLoad(top_addr, "old_top");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1657 Value *new_top = builder()->CreateAdd(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1658 old_top, LLVMValue::intptr_constant(size_in_bytes));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1659
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1660 builder()->CreateCondBr(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1661 builder()->CreateICmpULE(new_top, end),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1662 got_tlab, heap_alloc);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1663
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1664 builder()->SetInsertPoint(got_tlab);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1665 tlab_object = builder()->CreateIntToPtr(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1666 old_top, SharkType::oop_type(), "tlab_object");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1667
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1668 builder()->CreateStore(new_top, top_addr);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1669 builder()->CreateBr(initialize);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1670
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1671 builder()->SetInsertPoint(heap_alloc);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1672 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1673
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1674 // Heap allocation
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1675 Value *top_addr = builder()->CreateIntToPtr(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1676 LLVMValue::intptr_constant((intptr_t) Universe::heap()->top_addr()),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1677 PointerType::getUnqual(SharkType::intptr_type()),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1678 "top_addr");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1679
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1680 Value *end = builder()->CreateLoad(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1681 builder()->CreateIntToPtr(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1682 LLVMValue::intptr_constant((intptr_t) Universe::heap()->end_addr()),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1683 PointerType::getUnqual(SharkType::intptr_type())),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1684 "end");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1685
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1686 builder()->CreateBr(retry);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1687 builder()->SetInsertPoint(retry);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1688
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1689 Value *old_top = builder()->CreateLoad(top_addr, "top");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1690 Value *new_top = builder()->CreateAdd(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1691 old_top, LLVMValue::intptr_constant(size_in_bytes));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1693 builder()->CreateCondBr(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1694 builder()->CreateICmpULE(new_top, end),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1695 got_heap, slow_alloc_and_init);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1696
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1697 builder()->SetInsertPoint(got_heap);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1698 heap_object = builder()->CreateIntToPtr(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1699 old_top, SharkType::oop_type(), "heap_object");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1700
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1701 Value *check = builder()->CreateCmpxchgPtr(new_top, top_addr, old_top);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1702 builder()->CreateCondBr(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1703 builder()->CreateICmpEQ(old_top, check),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1704 initialize, retry);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1705
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1706 // Initialize the object
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1707 builder()->SetInsertPoint(initialize);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1708 if (tlab_object) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1709 PHINode *phi = builder()->CreatePHI(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1710 SharkType::oop_type(), "fast_object");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1711 phi->addIncoming(tlab_object, got_tlab);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1712 phi->addIncoming(heap_object, got_heap);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1713 fast_object = phi;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1714 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1715 else {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1716 fast_object = heap_object;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1717 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1718
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1719 builder()->CreateMemset(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1720 builder()->CreateBitCast(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1721 fast_object, PointerType::getUnqual(SharkType::jbyte_type())),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1722 LLVMValue::jbyte_constant(0),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1723 LLVMValue::jint_constant(size_in_bytes),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1724 LLVMValue::jint_constant(HeapWordSize));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1725
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1726 Value *mark_addr = builder()->CreateAddressOfStructEntry(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1727 fast_object, in_ByteSize(oopDesc::mark_offset_in_bytes()),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1728 PointerType::getUnqual(SharkType::intptr_type()),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1729 "mark_addr");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1730
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1731 Value *klass_addr = builder()->CreateAddressOfStructEntry(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1732 fast_object, in_ByteSize(oopDesc::klass_offset_in_bytes()),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1733 PointerType::getUnqual(SharkType::oop_type()),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1734 "klass_addr");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1735
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1736 // Set the mark
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1737 intptr_t mark;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1738 if (UseBiasedLocking) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1739 Unimplemented();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1740 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1741 else {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1742 mark = (intptr_t) markOopDesc::prototype();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1743 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1744 builder()->CreateStore(LLVMValue::intptr_constant(mark), mark_addr);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1745
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1746 // Set the class
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1747 Value *rtklass = builder()->CreateInlineOop(klass);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1748 builder()->CreateStore(rtklass, klass_addr);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1749 got_fast = builder()->GetInsertBlock();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1750
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1751 builder()->CreateBr(push_object);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1752 builder()->SetInsertPoint(slow_alloc_and_init);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1753 fast_state = current_state()->copy();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1754 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1755
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1756 // The slow path
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1757 call_vm(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1758 builder()->new_instance(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1759 LLVMValue::jint_constant(iter()->get_klass_index()),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1760 EX_CHECK_FULL);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1761 slow_object = get_vm_result();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1762 got_slow = builder()->GetInsertBlock();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1763
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1764 // Push the object
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1765 if (push_object) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1766 builder()->CreateBr(push_object);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1767 builder()->SetInsertPoint(push_object);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1768 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1769 if (fast_object) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1770 PHINode *phi = builder()->CreatePHI(SharkType::oop_type(), "object");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1771 phi->addIncoming(fast_object, got_fast);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1772 phi->addIncoming(slow_object, got_slow);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1773 object = phi;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1774 current_state()->merge(fast_state, got_fast, got_slow);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1775 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1776 else {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1777 object = slow_object;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1778 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1779
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1780 push(SharkValue::create_jobject(object, true));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1781 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1782
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1783 void SharkTopLevelBlock::do_newarray() {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1784 BasicType type = (BasicType) iter()->get_index();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1785
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1786 call_vm(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1787 builder()->newarray(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1788 LLVMValue::jint_constant(type),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1789 pop()->jint_value(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1790 EX_CHECK_FULL);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1791
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1792 ciArrayKlass *array_klass = ciArrayKlass::make(ciType::make(type));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1793 push(SharkValue::create_generic(array_klass, get_vm_result(), true));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1794 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1795
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1796 void SharkTopLevelBlock::do_anewarray() {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1797 bool will_link;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1798 ciKlass *klass = iter()->get_klass(will_link);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1799 assert(will_link, "typeflow responsibility");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1800
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1801 ciObjArrayKlass *array_klass = ciObjArrayKlass::make(klass);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1802 if (!array_klass->is_loaded()) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1803 Unimplemented();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1804 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1805
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1806 call_vm(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1807 builder()->anewarray(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1808 LLVMValue::jint_constant(iter()->get_klass_index()),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1809 pop()->jint_value(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1810 EX_CHECK_FULL);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1811
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1812 push(SharkValue::create_generic(array_klass, get_vm_result(), true));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1813 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1814
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1815 void SharkTopLevelBlock::do_multianewarray() {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1816 bool will_link;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1817 ciArrayKlass *array_klass = iter()->get_klass(will_link)->as_array_klass();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1818 assert(will_link, "typeflow responsibility");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1819
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1820 // The dimensions are stack values, so we use their slots for the
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1821 // dimensions array. Note that we are storing them in the reverse
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1822 // of normal stack order.
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1823 int ndims = iter()->get_dimensions();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1824
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1825 Value *dimensions = stack()->slot_addr(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1826 stack()->stack_slots_offset() + max_stack() - xstack_depth(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1827 ArrayType::get(SharkType::jint_type(), ndims),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1828 "dimensions");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1829
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1830 for (int i = 0; i < ndims; i++) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1831 builder()->CreateStore(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1832 xstack(ndims - 1 - i)->jint_value(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1833 builder()->CreateStructGEP(dimensions, i));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1834 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1835
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1836 call_vm(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1837 builder()->multianewarray(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1838 LLVMValue::jint_constant(iter()->get_klass_index()),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1839 LLVMValue::jint_constant(ndims),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1840 builder()->CreateStructGEP(dimensions, 0),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1841 EX_CHECK_FULL);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1842
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1843 // Now we can pop the dimensions off the stack
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1844 for (int i = 0; i < ndims; i++)
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1845 pop();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1846
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1847 push(SharkValue::create_generic(array_klass, get_vm_result(), true));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1848 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1849
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1850 void SharkTopLevelBlock::acquire_method_lock() {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1851 Value *lockee;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1852 if (target()->is_static())
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1853 lockee = builder()->CreateInlineOop(target()->holder()->java_mirror());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1854 else
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1855 lockee = local(0)->jobject_value();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1856
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1857 iter()->force_bci(start()); // for the decache in acquire_lock
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1858 acquire_lock(lockee, EX_CHECK_NO_CATCH);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1859 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1860
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1861 void SharkTopLevelBlock::do_monitorenter() {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1862 SharkValue *lockee = pop();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1863 check_null(lockee);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1864 acquire_lock(lockee->jobject_value(), EX_CHECK_FULL);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1865 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1866
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1867 void SharkTopLevelBlock::do_monitorexit() {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1868 pop(); // don't need this (monitors are block structured)
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1869 release_lock(EX_CHECK_NO_CATCH);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1870 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1871
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1872 void SharkTopLevelBlock::acquire_lock(Value *lockee, int exception_action) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1873 BasicBlock *try_recursive = function()->CreateBlock("try_recursive");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1874 BasicBlock *got_recursive = function()->CreateBlock("got_recursive");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1875 BasicBlock *not_recursive = function()->CreateBlock("not_recursive");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1876 BasicBlock *acquired_fast = function()->CreateBlock("acquired_fast");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1877 BasicBlock *lock_acquired = function()->CreateBlock("lock_acquired");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1878
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1879 int monitor = num_monitors();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1880 Value *monitor_addr = stack()->monitor_addr(monitor);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1881 Value *monitor_object_addr = stack()->monitor_object_addr(monitor);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1882 Value *monitor_header_addr = stack()->monitor_header_addr(monitor);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1883
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1884 // Store the object and mark the slot as live
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1885 builder()->CreateStore(lockee, monitor_object_addr);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1886 set_num_monitors(monitor + 1);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1887
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1888 // Try a simple lock
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1889 Value *mark_addr = builder()->CreateAddressOfStructEntry(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1890 lockee, in_ByteSize(oopDesc::mark_offset_in_bytes()),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1891 PointerType::getUnqual(SharkType::intptr_type()),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1892 "mark_addr");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1893
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1894 Value *mark = builder()->CreateLoad(mark_addr, "mark");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1895 Value *disp = builder()->CreateOr(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1896 mark, LLVMValue::intptr_constant(markOopDesc::unlocked_value), "disp");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1897 builder()->CreateStore(disp, monitor_header_addr);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1898
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1899 Value *lock = builder()->CreatePtrToInt(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1900 monitor_header_addr, SharkType::intptr_type());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1901 Value *check = builder()->CreateCmpxchgPtr(lock, mark_addr, disp);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1902 builder()->CreateCondBr(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1903 builder()->CreateICmpEQ(disp, check),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1904 acquired_fast, try_recursive);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1905
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1906 // Locking failed, but maybe this thread already owns it
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1907 builder()->SetInsertPoint(try_recursive);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1908 Value *addr = builder()->CreateAnd(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1909 disp,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1910 LLVMValue::intptr_constant(~markOopDesc::lock_mask_in_place));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1911
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1912 // NB we use the entire stack, but JavaThread::is_lock_owned()
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1913 // uses a more limited range. I don't think it hurts though...
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1914 Value *stack_limit = builder()->CreateValueOfStructEntry(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1915 thread(), Thread::stack_base_offset(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1916 SharkType::intptr_type(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1917 "stack_limit");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1918
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1919 assert(sizeof(size_t) == sizeof(intptr_t), "should be");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1920 Value *stack_size = builder()->CreateValueOfStructEntry(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1921 thread(), Thread::stack_size_offset(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1922 SharkType::intptr_type(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1923 "stack_size");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1924
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1925 Value *stack_start =
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1926 builder()->CreateSub(stack_limit, stack_size, "stack_start");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1927
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1928 builder()->CreateCondBr(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1929 builder()->CreateAnd(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1930 builder()->CreateICmpUGE(addr, stack_start),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1931 builder()->CreateICmpULT(addr, stack_limit)),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1932 got_recursive, not_recursive);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1933
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1934 builder()->SetInsertPoint(got_recursive);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1935 builder()->CreateStore(LLVMValue::intptr_constant(0), monitor_header_addr);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1936 builder()->CreateBr(acquired_fast);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1937
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1938 // Create an edge for the state merge
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1939 builder()->SetInsertPoint(acquired_fast);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1940 SharkState *fast_state = current_state()->copy();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1941 builder()->CreateBr(lock_acquired);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1942
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1943 // It's not a recursive case so we need to drop into the runtime
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1944 builder()->SetInsertPoint(not_recursive);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1945 call_vm(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1946 builder()->monitorenter(), monitor_addr,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1947 exception_action | EAM_MONITOR_FUDGE);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1948 BasicBlock *acquired_slow = builder()->GetInsertBlock();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1949 builder()->CreateBr(lock_acquired);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1950
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1951 // All done
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1952 builder()->SetInsertPoint(lock_acquired);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1953 current_state()->merge(fast_state, acquired_fast, acquired_slow);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1954 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1955
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1956 void SharkTopLevelBlock::release_lock(int exception_action) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1957 BasicBlock *not_recursive = function()->CreateBlock("not_recursive");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1958 BasicBlock *released_fast = function()->CreateBlock("released_fast");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1959 BasicBlock *slow_path = function()->CreateBlock("slow_path");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1960 BasicBlock *lock_released = function()->CreateBlock("lock_released");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1961
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1962 int monitor = num_monitors() - 1;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1963 Value *monitor_addr = stack()->monitor_addr(monitor);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1964 Value *monitor_object_addr = stack()->monitor_object_addr(monitor);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1965 Value *monitor_header_addr = stack()->monitor_header_addr(monitor);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1966
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1967 // If it is recursive then we're already done
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1968 Value *disp = builder()->CreateLoad(monitor_header_addr);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1969 builder()->CreateCondBr(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1970 builder()->CreateICmpEQ(disp, LLVMValue::intptr_constant(0)),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1971 released_fast, not_recursive);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1972
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1973 // Try a simple unlock
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1974 builder()->SetInsertPoint(not_recursive);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1975
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1976 Value *lock = builder()->CreatePtrToInt(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1977 monitor_header_addr, SharkType::intptr_type());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1978
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1979 Value *lockee = builder()->CreateLoad(monitor_object_addr);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1980
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1981 Value *mark_addr = builder()->CreateAddressOfStructEntry(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1982 lockee, in_ByteSize(oopDesc::mark_offset_in_bytes()),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1983 PointerType::getUnqual(SharkType::intptr_type()),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1984 "mark_addr");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1985
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1986 Value *check = builder()->CreateCmpxchgPtr(disp, mark_addr, lock);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1987 builder()->CreateCondBr(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1988 builder()->CreateICmpEQ(lock, check),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1989 released_fast, slow_path);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1990
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1991 // Create an edge for the state merge
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1992 builder()->SetInsertPoint(released_fast);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1993 SharkState *fast_state = current_state()->copy();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1994 builder()->CreateBr(lock_released);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1995
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1996 // Need to drop into the runtime to release this one
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1997 builder()->SetInsertPoint(slow_path);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1998 call_vm(builder()->monitorexit(), monitor_addr, exception_action);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1999 BasicBlock *released_slow = builder()->GetInsertBlock();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
2000 builder()->CreateBr(lock_released);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
2001
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
2002 // All done
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
2003 builder()->SetInsertPoint(lock_released);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
2004 current_state()->merge(fast_state, released_fast, released_slow);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
2005
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
2006 // The object slot is now dead
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
2007 set_num_monitors(monitor);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
2008 }