Skip to content

Commit 27e8b6e

Browse files
committedMay 27, 2020
8245953: [lworld] Remove array storage property bits clearing from JIT code
1 parent 8422fb4 commit 27e8b6e

13 files changed

+29
-73
lines changed
 

‎src/hotspot/cpu/x86/c1_LIRAssembler_x86.cpp

-1
Original file line numberDiff line numberDiff line change
@@ -1400,7 +1400,6 @@ void LIR_Assembler::mem2reg(LIR_Opr src, LIR_Opr dest, BasicType type, LIR_Patch
14001400
__ verify_oop(dest->as_register());
14011401
}
14021402
} else if (type == T_ADDRESS && addr->disp() == oopDesc::klass_offset_in_bytes()) {
1403-
// TODO remove clear_prop_bits bits stuff once the runtime does not set it anymore
14041403
#ifdef _LP64
14051404
if (UseCompressedClassPointers) {
14061405
__ decode_klass_not_null(dest->as_register());

‎src/hotspot/cpu/x86/x86_64.ad

-15
Original file line numberDiff line numberDiff line change
@@ -11760,21 +11760,6 @@ instruct testI_mem_imm(rFlagsReg cr, memory mem, immI con, immI0 zero)
1176011760
ins_pipe(ialu_mem_imm);
1176111761
%}
1176211762

11763-
// Clear array property bits
11764-
instruct clear_property_bits(rRegN dst, memory mem, immU31 mask, rFlagsReg cr)
11765-
%{
11766-
match(Set dst (CastI2N (AndI (CastN2I (LoadNKlass mem)) mask)));
11767-
effect(KILL cr);
11768-
11769-
format %{ "movl $dst, $mem\t# clear property bits\n\t"
11770-
"andl $dst, $mask" %}
11771-
ins_encode %{
11772-
__ movl($dst$$Register, $mem$$Address);
11773-
__ andl($dst$$Register, $mask$$constant);
11774-
%}
11775-
ins_pipe(ialu_reg_mem);
11776-
%}
11777-
1177811763
// Unsigned compare Instructions; really, same as signed except they
1177911764
// produce an rFlagsRegU instead of rFlagsReg.
1178011765
instruct compU_rReg(rFlagsRegU cr, rRegI op1, rRegI op2)

‎src/hotspot/share/opto/graphKit.cpp

+2-3
Original file line numberDiff line numberDiff line change
@@ -1177,13 +1177,12 @@ Node* GraphKit::ConvL2I(Node* offset) {
11771177
}
11781178

11791179
//-------------------------load_object_klass-----------------------------------
1180-
Node* GraphKit::load_object_klass(Node* obj, bool clear_prop_bits) {
1180+
Node* GraphKit::load_object_klass(Node* obj) {
11811181
// Special-case a fresh allocation to avoid building nodes:
11821182
Node* akls = AllocateNode::Ideal_klass(obj, &_gvn);
11831183
if (akls != NULL) return akls;
11841184
Node* k_adr = basic_plus_adr(obj, oopDesc::klass_offset_in_bytes());
1185-
// TODO remove clear_prop_bits bits stuff once the runtime does not set it anymore
1186-
return _gvn.transform(LoadKlassNode::make(_gvn, NULL, immutable_memory(), k_adr, TypeInstPtr::KLASS, TypeKlassPtr::OBJECT, clear_prop_bits));
1185+
return _gvn.transform(LoadKlassNode::make(_gvn, NULL, immutable_memory(), k_adr, TypeInstPtr::KLASS, TypeKlassPtr::OBJECT));
11871186
}
11881187

11891188
//-------------------------load_array_length-----------------------------------

‎src/hotspot/share/opto/graphKit.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -342,7 +342,7 @@ class GraphKit : public Phase {
342342
Node* ConvI2UL(Node* offset);
343343
Node* ConvL2I(Node* offset);
344344
// Find out the klass of an object.
345-
Node* load_object_klass(Node* object, bool clear_prop_bits = true);
345+
Node* load_object_klass(Node* object);
346346
// Find out the length of an array.
347347
Node* load_array_length(Node* array);
348348

‎src/hotspot/share/opto/macro.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -2864,7 +2864,7 @@ void PhaseMacroExpand::expand_subtypecheck_node(SubTypeCheckNode *check) {
28642864
subklass = obj_or_subklass;
28652865
} else {
28662866
Node* k_adr = basic_plus_adr(obj_or_subklass, oopDesc::klass_offset_in_bytes());
2867-
subklass = _igvn.transform(LoadKlassNode::make(_igvn, NULL, C->immutable_memory(), k_adr, TypeInstPtr::KLASS, TypeKlassPtr::OBJECT, true));
2867+
subklass = _igvn.transform(LoadKlassNode::make(_igvn, NULL, C->immutable_memory(), k_adr, TypeInstPtr::KLASS, TypeKlassPtr::OBJECT));
28682868
}
28692869

28702870
Node* not_subtype_ctrl = Phase::gen_subtype_check(subklass, superklass, &ctrl, NULL, _igvn);

‎src/hotspot/share/opto/macroArrayCopy.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ Node* PhaseMacroExpand::generate_array_guard(Node** ctrl, Node* mem, Node* obj_o
203203
Node* kls = NULL;
204204
if (_igvn.type(obj_or_klass)->isa_oopptr()) {
205205
Node* k_adr = basic_plus_adr(obj_or_klass, oopDesc::klass_offset_in_bytes());
206-
kls = transform_later(LoadKlassNode::make(_igvn, NULL, C->immutable_memory(), k_adr, TypeInstPtr::KLASS, TypeKlassPtr::OBJECT, /* clear_prop_bits = */ true));
206+
kls = transform_later(LoadKlassNode::make(_igvn, NULL, C->immutable_memory(), k_adr, TypeInstPtr::KLASS, TypeKlassPtr::OBJECT));
207207
} else {
208208
assert(_igvn.type(obj_or_klass)->isa_klassptr(), "what else?");
209209
kls = obj_or_klass;

‎src/hotspot/share/opto/memnode.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -2184,19 +2184,19 @@ const Type* LoadSNode::Value(PhaseGVN* phase) const {
21842184
//----------------------------LoadKlassNode::make------------------------------
21852185
// Polymorphic factory method:
21862186
Node* LoadKlassNode::make(PhaseGVN& gvn, Node* ctl, Node* mem, Node* adr, const TypePtr* at,
2187-
const TypeKlassPtr* tk, bool clear_prop_bits) {
2187+
const TypeKlassPtr* tk) {
21882188
// sanity check the alias category against the created node type
21892189
const TypePtr *adr_type = adr->bottom_type()->isa_ptr();
21902190
assert(adr_type != NULL, "expecting TypeKlassPtr");
21912191
#ifdef _LP64
21922192
if (adr_type->is_ptr_to_narrowklass()) {
21932193
assert(UseCompressedClassPointers, "no compressed klasses");
2194-
Node* load_klass = gvn.transform(new LoadNKlassNode(ctl, mem, adr, at, tk->make_narrowklass(), MemNode::unordered, clear_prop_bits));
2194+
Node* load_klass = gvn.transform(new LoadNKlassNode(ctl, mem, adr, at, tk->make_narrowklass(), MemNode::unordered));
21952195
return new DecodeNKlassNode(load_klass, load_klass->bottom_type()->make_ptr());
21962196
}
21972197
#endif
21982198
assert(!adr_type->is_ptr_to_narrowklass() && !adr_type->is_ptr_to_narrowoop(), "should have got back a narrow oop");
2199-
return new LoadKlassNode(ctl, mem, adr, at, tk, MemNode::unordered, clear_prop_bits);
2199+
return new LoadKlassNode(ctl, mem, adr, at, tk, MemNode::unordered);
22002200
}
22012201

22022202
//------------------------------Value------------------------------------------

‎src/hotspot/share/opto/memnode.hpp

+5-21
Original file line numberDiff line numberDiff line change
@@ -515,44 +515,29 @@ class LoadNNode : public LoadNode {
515515
//------------------------------LoadKlassNode----------------------------------
516516
// Load a Klass from an object
517517
class LoadKlassNode : public LoadPNode {
518-
private:
519-
bool _clear_prop_bits; // Clear the ArrayStorageProperties bits
520518
protected:
521519
// In most cases, LoadKlassNode does not have the control input set. If the control
522520
// input is set, it must not be removed (by LoadNode::Ideal()).
523521
virtual bool can_remove_control() const;
524522
public:
525-
LoadKlassNode(Node *c, Node *mem, Node *adr, const TypePtr *at, const TypeKlassPtr *tk, MemOrd mo, bool clear_prop_bits)
526-
: LoadPNode(c, mem, adr, at, tk, mo), _clear_prop_bits(clear_prop_bits) {}
527-
virtual uint hash() const { return LoadPNode::hash() + _clear_prop_bits; }
528-
virtual bool cmp(const Node &n) const {
529-
return (_clear_prop_bits == ((LoadKlassNode&)n)._clear_prop_bits) && LoadPNode::cmp(n);
530-
}
531-
virtual uint size_of() const { return sizeof(*this); }
523+
LoadKlassNode(Node *c, Node *mem, Node *adr, const TypePtr *at, const TypeKlassPtr *tk, MemOrd mo)
524+
: LoadPNode(c, mem, adr, at, tk, mo) {}
532525
virtual int Opcode() const;
533526
virtual const Type* Value(PhaseGVN* phase) const;
534527
virtual Node* Identity(PhaseGVN* phase);
535528
virtual bool depends_only_on_test() const { return true; }
536-
bool clear_prop_bits() const { return _clear_prop_bits; }
537529

538530
// Polymorphic factory method:
539531
static Node* make(PhaseGVN& gvn, Node* ctl, Node* mem, Node* adr, const TypePtr* at,
540-
const TypeKlassPtr* tk = TypeKlassPtr::OBJECT, bool clear_prop_bits = false);
532+
const TypeKlassPtr* tk = TypeKlassPtr::OBJECT);
541533
};
542534

543535
//------------------------------LoadNKlassNode---------------------------------
544536
// Load a narrow Klass from an object.
545537
class LoadNKlassNode : public LoadNNode {
546-
private:
547-
bool _clear_prop_bits; // Clear the ArrayStorageProperties bits
548538
public:
549-
LoadNKlassNode(Node *c, Node *mem, Node *adr, const TypePtr *at, const TypeNarrowKlass *tk, MemOrd mo, bool clear_prop_bits)
550-
: LoadNNode(c, mem, adr, at, tk, mo), _clear_prop_bits(clear_prop_bits) {}
551-
virtual uint hash() const { return LoadNNode::hash() + _clear_prop_bits; }
552-
virtual bool cmp(const Node &n) const {
553-
return (_clear_prop_bits == ((LoadNKlassNode&)n)._clear_prop_bits) && LoadNNode::cmp(n);
554-
}
555-
virtual uint size_of() const { return sizeof(*this); }
539+
LoadNKlassNode(Node *c, Node *mem, Node *adr, const TypePtr *at, const TypeNarrowKlass *tk, MemOrd mo)
540+
: LoadNNode(c, mem, adr, at, tk, mo) {}
556541
virtual int Opcode() const;
557542
virtual uint ideal_reg() const { return Op_RegN; }
558543
virtual int store_Opcode() const { return Op_StoreNKlass; }
@@ -561,7 +546,6 @@ class LoadNKlassNode : public LoadNNode {
561546
virtual const Type* Value(PhaseGVN* phase) const;
562547
virtual Node* Identity(PhaseGVN* phase);
563548
virtual bool depends_only_on_test() const { return true; }
564-
bool clear_prop_bits() const { return _clear_prop_bits; }
565549
};
566550

567551
//------------------------------StoreNode--------------------------------------

‎src/hotspot/share/opto/parse2.cpp

+3-4
Original file line numberDiff line numberDiff line change
@@ -2162,10 +2162,9 @@ void Parse::do_acmp(BoolTest::mask btest, Node* a, Node* b) {
21622162
return;
21632163
}
21642164

2165-
// Check if both operands are of the same class. We don't need to clear the array property
2166-
// bits in the klass pointer for the cmp because we know that the first operand is a value type.
2167-
Node* kls_a = load_object_klass(not_null_a, /* clear_prop_bits = */ false);
2168-
Node* kls_b = load_object_klass(not_null_b, /* clear_prop_bits = */ false);
2165+
// Check if both operands are of the same class.
2166+
Node* kls_a = load_object_klass(not_null_a);
2167+
Node* kls_b = load_object_klass(not_null_b);
21692168
Node* kls_cmp = CmpP(kls_a, kls_b);
21702169
Node* kls_bol = _gvn.transform(new BoolNode(kls_cmp, BoolTest::ne));
21712170
IfNode* kls_iff = create_and_map_if(control(), kls_bol, PROB_FAIR, COUNT_UNKNOWN);

‎test/hotspot/jtreg/compiler/valhalla/valuetypes/TestArrays.java

+5-5
Original file line numberDiff line numberDiff line change
@@ -787,7 +787,7 @@ public void test33_verifier(boolean warmup) {
787787
Object[] result = test33(va);
788788
for (int i = 0; i < len; ++i) {
789789
Asserts.assertEQ(((MyValue1)result[i]).hash(), ((MyValue1)va[i]).hash());
790-
// Check that array has correct storage properties (null-ok)
790+
// Check that array has correct properties (null-ok)
791791
result[i] = null;
792792
}
793793
}
@@ -822,7 +822,7 @@ public void test34_verifier(boolean warmup) {
822822
for (int i = 0; i < 10; i++) { // make sure we do deopt
823823
Object[] result = test34(true);
824824
verify(test34_orig, result);
825-
// Check that array has correct storage properties (null-free)
825+
// Check that array has correct properties (null-free)
826826
try {
827827
result[0] = null;
828828
throw new RuntimeException("Should throw NullPointerException");
@@ -833,7 +833,7 @@ public void test34_verifier(boolean warmup) {
833833
if (compile_and_run_again_if_deoptimized(warmup, "TestArrays::test34")) {
834834
Object[] result = test34(true);
835835
verify(test34_orig, result);
836-
// Check that array has correct storage properties (null-free)
836+
// Check that array has correct properties (null-free)
837837
try {
838838
result[0] = null;
839839
throw new RuntimeException("Should throw NullPointerException");
@@ -1750,7 +1750,7 @@ public void test75_verifier(boolean warmup) {
17501750

17511751
for (int i = 0; i < va.length; ++i) {
17521752
Asserts.assertEQ(oa[i], result[i]);
1753-
// Check that array has correct storage properties (null-ok)
1753+
// Check that array has correct properties (null-ok)
17541754
result[i] = null;
17551755
}
17561756
}
@@ -1788,7 +1788,7 @@ public void test76_verifier(boolean warmup) {
17881788
test76_helper(42, va, oa);
17891789
Object[] result = test76(va, oa);
17901790
verify(verif, result);
1791-
// Check that array has correct storage properties (null-free)
1791+
// Check that array has correct properties (null-free)
17921792
if (len > 0) {
17931793
try {
17941794
result[0] = null;

‎test/hotspot/jtreg/compiler/valhalla/valuetypes/TestLWorld.java

+5-14
Original file line numberDiff line numberDiff line change
@@ -2361,10 +2361,7 @@ public void test88_verifier(boolean warmup) {
23612361
Asserts.assertTrue(Arrays.equals(src2, dst2)); });
23622362
}
23632363

2364-
// Verify that the storage property bits in the klass pointer are
2365-
// not cleared if we are comparing to a klass that can't be a inline
2366-
// type array klass anyway.
2367-
@Test(failOn = STORAGE_PROPERTY_CLEARING)
2364+
@Test
23682365
public boolean test89(Object obj) {
23692366
return obj.getClass() == Integer.class;
23702367
}
@@ -2375,8 +2372,7 @@ public void test89_verifier(boolean warmup) {
23752372
Asserts.assertFalse(test89(new Object()));
23762373
}
23772374

2378-
// Same as test89 but with a cast
2379-
@Test(failOn = STORAGE_PROPERTY_CLEARING)
2375+
@Test
23802376
public Integer test90(Object obj) {
23812377
return (Integer)obj;
23822378
}
@@ -2392,9 +2388,7 @@ public void test90_verifier(boolean warmup) {
23922388
}
23932389
}
23942390

2395-
// Same as test89 but bit clearing can not be removed because
2396-
// we are comparing to a inline type array klass.
2397-
@Test(match = {STORAGE_PROPERTY_CLEARING}, matchCount = { 1 })
2391+
@Test
23982392
public boolean test91(Object obj) {
23992393
return obj.getClass() == MyValue2[].class;
24002394
}
@@ -2498,10 +2492,8 @@ public void test94_verifier(boolean warmup) {
24982492
Asserts.assertEquals(result, 0x42 * 2);
24992493
}
25002494

2501-
// Test that no code for clearing the array klass property bits is emitted for acmp
2502-
// because when loading the klass, we already know that the operand is a value type.
25032495
@Warmup(10000)
2504-
@Test(failOn = STORAGE_PROPERTY_CLEARING)
2496+
@Test
25052497
public boolean test95(Object o1, Object o2) {
25062498
return o1 == o2;
25072499
}
@@ -2516,9 +2508,8 @@ public void test95_verifier(boolean warmup) {
25162508
Asserts.assertFalse(test95(o1, o2));
25172509
}
25182510

2519-
// Same as test95 but operands are never null
25202511
@Warmup(10000)
2521-
@Test(failOn = STORAGE_PROPERTY_CLEARING)
2512+
@Test
25222513
public boolean test96(Object o1, Object o2) {
25232514
return o1 == o2;
25242515
}

‎test/hotspot/jtreg/compiler/valhalla/valuetypes/TestNullableArrays.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2019, 2020, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -1933,7 +1933,7 @@ public void test74_verifier(boolean warmup) {
19331933

19341934
for (int i = 0; i < va.length; ++i) {
19351935
Asserts.assertEQ(oa[i], result[i]);
1936-
// Check that array has correct storage properties (null-ok)
1936+
// Check that array has correct properties (null-ok)
19371937
result[i] = null;
19381938
}
19391939
}
@@ -1972,7 +1972,7 @@ public void test75_verifier(boolean warmup) {
19721972
Object[] result = test75(va, oa);
19731973
verify(verif, result);
19741974
if (len > 0) {
1975-
// Check that array has correct storage properties (null-ok)
1975+
// Check that array has correct properties (null-ok)
19761976
result[0] = null;
19771977
}
19781978
}

‎test/hotspot/jtreg/compiler/valhalla/valuetypes/ValueTypeTest.java

-1
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,6 @@ public abstract class ValueTypeTest {
219219
protected static final String LOAD_UNKNOWN_VALUE = "(.*call_leaf,runtime load_unknown_value.*" + END;
220220
protected static final String STORE_UNKNOWN_VALUE = "(.*call_leaf,runtime store_unknown_value.*" + END;
221221
protected static final String VALUE_ARRAY_NULL_GUARD = "(.*call,static wrapper for: uncommon_trap.*reason='null_check' action='none'.*" + END;
222-
protected static final String STORAGE_PROPERTY_CLEARING = "(.*((int:536870911)|(salq.*3\\R.*sarq.*3)).*" + END;
223222
protected static final String CLASS_CHECK_TRAP = START + "CallStaticJava" + MID + "uncommon_trap.*class_check" + END;
224223
protected static final String NULL_CHECK_TRAP = START + "CallStaticJava" + MID + "uncommon_trap.*null_check" + END;
225224
protected static final String RANGE_CHECK_TRAP = START + "CallStaticJava" + MID + "uncommon_trap.*range_check" + END;

0 commit comments

Comments
 (0)
Please sign in to comment.