annotate src/share/vm/shark/sharkState.cpp @ 1941:79d04223b8a5

Added caching for resolved types and resolved fields. This is crucial, because the local load elimination will lead to wrong results, if field equality (of two RiField objects with the same object and the same RiType) is not given. The caching makes sure that the default equals implementation is sufficient.
author Thomas Wuerthinger <wuerthinger@ssw.jku.at>
date Tue, 28 Dec 2010 18:33:26 +0100
parents d2ede61b7a12
children f95d63e2154a
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 /*
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
2 * Copyright (c) 1999, 2007, Oracle and/or its affiliates. All rights reserved.
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
3 * Copyright 2008, 2009 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
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
26 #include "incls/_precompiled.incl"
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
27 #include "incls/_sharkState.cpp.incl"
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
28
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
29 using namespace llvm;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
30
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
31 void SharkState::initialize(const SharkState *state) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
32 _locals = NEW_RESOURCE_ARRAY(SharkValue*, max_locals());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
33 _stack = NEW_RESOURCE_ARRAY(SharkValue*, max_stack());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
34
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
35 NOT_PRODUCT(memset(_locals, 23, max_locals() * sizeof(SharkValue *)));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
36 NOT_PRODUCT(memset(_stack, 23, max_stack() * sizeof(SharkValue *)));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
37 _sp = _stack;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
38
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
39 if (state) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
40 for (int i = 0; i < max_locals(); i++) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
41 SharkValue *value = state->local(i);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
42 if (value)
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
43 value = value->clone();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
44 set_local(i, value);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
45 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
46
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
47 for (int i = state->stack_depth() - 1; i >= 0; i--) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
48 SharkValue *value = state->stack(i);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
49 if (value)
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
50 value = value->clone();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
51 push(value);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
52 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
53 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
54
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
55 set_num_monitors(state ? state->num_monitors() : 0);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
56 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
57
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
58 bool SharkState::equal_to(SharkState *other) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
59 if (target() != other->target())
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
60 return false;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
61
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
62 if (method() != other->method())
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
63 return false;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
64
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
65 if (oop_tmp() != other->oop_tmp())
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
66 return false;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
67
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
68 if (max_locals() != other->max_locals())
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
69 return false;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
70
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
71 if (stack_depth() != other->stack_depth())
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
72 return false;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
73
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
74 if (num_monitors() != other->num_monitors())
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
75 return false;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
76
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
77 if (has_safepointed() != other->has_safepointed())
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
78 return false;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
79
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
80 // Local variables
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
81 for (int i = 0; i < max_locals(); i++) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
82 SharkValue *value = local(i);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
83 SharkValue *other_value = other->local(i);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
84
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
85 if (value == NULL) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
86 if (other_value != NULL)
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
87 return false;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
88 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
89 else {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
90 if (other_value == NULL)
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
91 return false;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
92
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
93 if (!value->equal_to(other_value))
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
94 return false;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
95 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
96 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
97
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
98 // Expression stack
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
99 for (int i = 0; i < stack_depth(); i++) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
100 SharkValue *value = stack(i);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
101 SharkValue *other_value = other->stack(i);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
102
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
103 if (value == NULL) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
104 if (other_value != NULL)
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
105 return false;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
106 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
107 else {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
108 if (other_value == NULL)
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
109 return false;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
110
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
111 if (!value->equal_to(other_value))
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
112 return false;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
113 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
114 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
115
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
116 return true;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
117 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
118
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
119 void SharkState::merge(SharkState* other,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
120 BasicBlock* other_block,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
121 BasicBlock* this_block) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
122 // Method
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
123 Value *this_method = this->method();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
124 Value *other_method = other->method();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
125 if (this_method != other_method) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
126 PHINode *phi = builder()->CreatePHI(SharkType::methodOop_type(), "method");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
127 phi->addIncoming(this_method, this_block);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
128 phi->addIncoming(other_method, other_block);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
129 set_method(phi);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
130 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
131
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
132 // Temporary oop slot
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
133 Value *this_oop_tmp = this->oop_tmp();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
134 Value *other_oop_tmp = other->oop_tmp();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
135 if (this_oop_tmp != other_oop_tmp) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
136 assert(this_oop_tmp && other_oop_tmp, "can't merge NULL with non-NULL");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
137 PHINode *phi = builder()->CreatePHI(SharkType::oop_type(), "oop_tmp");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
138 phi->addIncoming(this_oop_tmp, this_block);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
139 phi->addIncoming(other_oop_tmp, other_block);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
140 set_oop_tmp(phi);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
141 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
142
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
143 // Monitors
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
144 assert(this->num_monitors() == other->num_monitors(), "should be");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
145
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
146 // Local variables
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
147 assert(this->max_locals() == other->max_locals(), "should be");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
148 for (int i = 0; i < max_locals(); i++) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
149 SharkValue *this_value = this->local(i);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
150 SharkValue *other_value = other->local(i);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
151 assert((this_value == NULL) == (other_value == NULL), "should be");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
152 if (this_value != NULL) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
153 char name[18];
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
154 snprintf(name, sizeof(name), "local_%d_", i);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
155 set_local(i, this_value->merge(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
156 builder(), other_value, other_block, this_block, name));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
157 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
158 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
159
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
160 // Expression stack
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
161 assert(this->stack_depth() == other->stack_depth(), "should be");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
162 for (int i = 0; i < stack_depth(); i++) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
163 SharkValue *this_value = this->stack(i);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
164 SharkValue *other_value = other->stack(i);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
165 assert((this_value == NULL) == (other_value == NULL), "should be");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
166 if (this_value != NULL) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
167 char name[18];
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
168 snprintf(name, sizeof(name), "stack_%d_", i);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
169 set_stack(i, this_value->merge(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
170 builder(), other_value, other_block, this_block, name));
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
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
174 // Safepointed status
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
175 set_has_safepointed(this->has_safepointed() && other->has_safepointed());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
176 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
177
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
178 void SharkState::replace_all(SharkValue* old_value, SharkValue* new_value) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
179 // Local variables
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
180 for (int i = 0; i < max_locals(); i++) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
181 if (local(i) == old_value)
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
182 set_local(i, new_value);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
183 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
184
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
185 // Expression stack
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
186 for (int i = 0; i < stack_depth(); i++) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
187 if (stack(i) == old_value)
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
188 set_stack(i, new_value);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
189 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
190 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
191
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
192 SharkNormalEntryState::SharkNormalEntryState(SharkTopLevelBlock* block,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
193 Value* method)
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
194 : SharkState(block) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
195 assert(!block->stack_depth_at_entry(), "entry block shouldn't have stack");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
196
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
197 // Local variables
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
198 for (int i = 0; i < max_locals(); i++) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
199 ciType *type = block->local_type_at_entry(i);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
200
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
201 SharkValue *value = NULL;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
202 switch (type->basic_type()) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
203 case T_INT:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
204 case T_LONG:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
205 case T_FLOAT:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
206 case T_DOUBLE:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
207 case T_OBJECT:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
208 case T_ARRAY:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
209 if (i >= arg_size()) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
210 ShouldNotReachHere();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
211 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
212 value = SharkValue::create_generic(type, NULL, i == 0 && !is_static());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
213 break;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
214
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
215 case ciTypeFlow::StateVector::T_NULL:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
216 value = SharkValue::null();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
217 break;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
218
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
219 case ciTypeFlow::StateVector::T_BOTTOM:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
220 break;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
221
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
222 case ciTypeFlow::StateVector::T_LONG2:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
223 case ciTypeFlow::StateVector::T_DOUBLE2:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
224 break;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
225
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
226 default:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
227 ShouldNotReachHere();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
228 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
229 set_local(i, value);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
230 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
231 SharkNormalEntryCacher(block->function(), method).scan(this);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
232 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
233
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
234 SharkOSREntryState::SharkOSREntryState(SharkTopLevelBlock* block,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
235 Value* method,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
236 Value* osr_buf)
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
237 : SharkState(block) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
238 assert(!block->stack_depth_at_entry(), "entry block shouldn't have stack");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
239 set_num_monitors(block->ciblock()->monitor_count());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
240
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
241 // Local variables
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
242 for (int i = 0; i < max_locals(); i++) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
243 ciType *type = block->local_type_at_entry(i);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
244
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
245 SharkValue *value = NULL;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
246 switch (type->basic_type()) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
247 case T_INT:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
248 case T_LONG:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
249 case T_FLOAT:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
250 case T_DOUBLE:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
251 case T_OBJECT:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
252 case T_ARRAY:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
253 value = SharkValue::create_generic(type, NULL, false);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
254 break;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
255
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
256 case ciTypeFlow::StateVector::T_NULL:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
257 value = SharkValue::null();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
258 break;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
259
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
260 case ciTypeFlow::StateVector::T_BOTTOM:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
261 break;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
262
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
263 case ciTypeFlow::StateVector::T_LONG2:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
264 case ciTypeFlow::StateVector::T_DOUBLE2:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
265 break;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
266
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
267 default:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
268 ShouldNotReachHere();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
269 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
270 set_local(i, value);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
271 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
272 SharkOSREntryCacher(block->function(), method, osr_buf).scan(this);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
273 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
274
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
275 SharkPHIState::SharkPHIState(SharkTopLevelBlock* block)
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
276 : SharkState(block), _block(block) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
277 BasicBlock *saved_insert_point = builder()->GetInsertBlock();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
278 builder()->SetInsertPoint(block->entry_block());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
279 char name[18];
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
280
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
281 // Method
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
282 set_method(builder()->CreatePHI(SharkType::methodOop_type(), "method"));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
283
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
284 // Local variables
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
285 for (int i = 0; i < max_locals(); i++) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
286 ciType *type = block->local_type_at_entry(i);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
287 if (type->basic_type() == (BasicType) ciTypeFlow::StateVector::T_NULL) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
288 // XXX we could do all kinds of clever stuff here
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
289 type = ciType::make(T_OBJECT); // XXX what about T_ARRAY?
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
290 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
291
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
292 SharkValue *value = NULL;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
293 switch (type->basic_type()) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
294 case T_INT:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
295 case T_LONG:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
296 case T_FLOAT:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
297 case T_DOUBLE:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
298 case T_OBJECT:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
299 case T_ARRAY:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
300 snprintf(name, sizeof(name), "local_%d_", i);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
301 value = SharkValue::create_phi(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
302 type, builder()->CreatePHI(SharkType::to_stackType(type), name));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
303 break;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
304
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
305 case T_ADDRESS:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
306 value = SharkValue::address_constant(type->as_return_address()->bci());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
307 break;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
308
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
309 case ciTypeFlow::StateVector::T_BOTTOM:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
310 break;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
311
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
312 case ciTypeFlow::StateVector::T_LONG2:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
313 case ciTypeFlow::StateVector::T_DOUBLE2:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
314 break;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
315
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
316 default:
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 set_local(i, value);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
320 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
321
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
322 // Expression stack
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
323 for (int i = 0; i < block->stack_depth_at_entry(); i++) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
324 ciType *type = block->stack_type_at_entry(i);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
325 if (type->basic_type() == (BasicType) ciTypeFlow::StateVector::T_NULL) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
326 // XXX we could do all kinds of clever stuff here
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
327 type = ciType::make(T_OBJECT); // XXX what about T_ARRAY?
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
328 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
329
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
330 SharkValue *value = NULL;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
331 switch (type->basic_type()) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
332 case T_INT:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
333 case T_LONG:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
334 case T_FLOAT:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
335 case T_DOUBLE:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
336 case T_OBJECT:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
337 case T_ARRAY:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
338 snprintf(name, sizeof(name), "stack_%d_", i);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
339 value = SharkValue::create_phi(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
340 type, builder()->CreatePHI(SharkType::to_stackType(type), name));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
341 break;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
342
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
343 case T_ADDRESS:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
344 value = SharkValue::address_constant(type->as_return_address()->bci());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
345 break;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
346
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
347 case ciTypeFlow::StateVector::T_LONG2:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
348 case ciTypeFlow::StateVector::T_DOUBLE2:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
349 break;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
350
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
351 default:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
352 ShouldNotReachHere();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
353 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
354 push(value);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
355 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
356
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
357 // Monitors
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
358 set_num_monitors(block->ciblock()->monitor_count());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
359
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
360 builder()->SetInsertPoint(saved_insert_point);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
361 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
362
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
363 void SharkPHIState::add_incoming(SharkState* incoming_state) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
364 BasicBlock *predecessor = builder()->GetInsertBlock();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
365
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
366 // Method
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
367 ((PHINode *) method())->addIncoming(incoming_state->method(), predecessor);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
368
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
369 // Local variables
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
370 for (int i = 0; i < max_locals(); i++) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
371 if (local(i) != NULL)
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
372 local(i)->addIncoming(incoming_state->local(i), predecessor);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
373 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
374
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
375 // Expression stack
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
376 int stack_depth = block()->stack_depth_at_entry();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
377 assert(stack_depth == incoming_state->stack_depth(), "should be");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
378 for (int i = 0; i < stack_depth; i++) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
379 assert((stack(i) == NULL) == (incoming_state->stack(i) == NULL), "oops");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
380 if (stack(i))
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
381 stack(i)->addIncoming(incoming_state->stack(i), predecessor);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
382 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
383
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
384 // Monitors
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
385 assert(num_monitors() == incoming_state->num_monitors(), "should be");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
386
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
387 // Temporary oop slot
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
388 assert(oop_tmp() == incoming_state->oop_tmp(), "should be");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
389 }