Skip to content

Commit cf68d9f

Browse files
committed
8299155: C2: SubTypeCheckNode::verify() should not produce dependencies / oop pool entries
Reviewed-by: thartmann, kvn
1 parent 11804b2 commit cf68d9f

File tree

2 files changed

+19
-10
lines changed

2 files changed

+19
-10
lines changed

src/hotspot/share/opto/subtypenode.cpp

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -167,19 +167,10 @@ bool SubTypeCheckNode::verify(PhaseGVN* phase) {
167167
const TypeKlassPtr* subk = sub_t->isa_klassptr() ? sub_t->is_klassptr() : sub_t->is_oopptr()->as_klass_type();
168168

169169
if (super_t->singleton() && subk != NULL) {
170-
Node* subklass = NULL;
171-
if (sub_t->isa_oopptr()) {
172-
Node* adr = phase->transform(new AddPNode(obj_or_subklass, obj_or_subklass, phase->MakeConX(oopDesc::klass_offset_in_bytes())));
173-
subklass = phase->transform(LoadKlassNode::make(*phase, NULL, C->immutable_memory(), adr, TypeInstPtr::KLASS));
174-
record_for_cleanup(subklass, phase);
175-
} else {
176-
subklass = obj_or_subklass;
177-
}
178-
179170
const Type* cached_t = Value(phase); // cache the type to validate consistency
180171
switch (C->static_subtype_check(superk, subk)) {
181172
case Compile::SSC_easy_test: {
182-
return verify_helper(phase, subklass, cached_t);
173+
return verify_helper(phase, load_klass(phase), cached_t);
183174
}
184175
case Compile::SSC_full_test: {
185176
Node* p1 = phase->transform(new AddPNode(superklass, superklass, phase->MakeConX(in_bytes(Klass::super_check_offset_offset()))));
@@ -189,6 +180,7 @@ bool SubTypeCheckNode::verify(PhaseGVN* phase) {
189180
int cacheoff_con = in_bytes(Klass::secondary_super_cache_offset());
190181
bool might_be_cache = (phase->find_int_con(chk_off, cacheoff_con) == cacheoff_con);
191182
if (!might_be_cache) {
183+
Node* subklass = load_klass(phase);
192184
Node* chk_off_X = chk_off;
193185
#ifdef _LP64
194186
chk_off_X = phase->transform(new ConvI2LNode(chk_off_X));
@@ -210,4 +202,19 @@ bool SubTypeCheckNode::verify(PhaseGVN* phase) {
210202

211203
return true;
212204
}
205+
206+
Node* SubTypeCheckNode::load_klass(PhaseGVN* phase) const {
207+
Node* obj_or_subklass = in(ObjOrSubKlass);
208+
const Type* sub_t = phase->type(obj_or_subklass);
209+
Node* subklass = NULL;
210+
if (sub_t->isa_oopptr()) {
211+
Node* adr = phase->transform(new AddPNode(obj_or_subklass, obj_or_subklass, phase->MakeConX(oopDesc::klass_offset_in_bytes())));
212+
subklass = phase->transform(LoadKlassNode::make(*phase, NULL, phase->C->immutable_memory(), adr, TypeInstPtr::KLASS));
213+
record_for_cleanup(subklass, phase);
214+
} else {
215+
subklass = obj_or_subklass;
216+
}
217+
return subklass;
218+
}
219+
213220
#endif

src/hotspot/share/opto/subtypenode.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ class SubTypeCheckNode : public CmpNode {
5757

5858
static bool is_oop(PhaseGVN* phase, Node* n);
5959
#endif // ASSERT
60+
61+
Node* load_klass(PhaseGVN* phase) const;
6062
};
6163

6264
#endif // SHARE_OPTO_SUBTYPENODE_HPP

0 commit comments

Comments
 (0)