Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

8305896: Alternative full GC forwarding #13582

Closed
wants to merge 127 commits into from
Closed
Changes from 1 commit
Commits
Show all changes
127 commits
Select commit Hold shift + click to select a range
6d97335
8305896: Alternative full GC forwarding
rkennke Apr 21, 2023
070f59e
Implement fallback-hashtable for G1 serial compaction
rkennke Apr 26, 2023
4bbfae0
Improve handling of Serial GC spaces; some refactorings
rkennke Apr 26, 2023
c2bcc3b
Fix 32 bit builds
rkennke Apr 27, 2023
0ba890b
Some cleanups
rkennke Apr 27, 2023
4fad333
Add gtest for SlidingForwarding
rkennke Apr 27, 2023
ca81f54
Clarify comments for SlidingForwarding
rkennke Apr 27, 2023
30f1971
Merge branch 'master' into JDK-8305896
rkennke Apr 27, 2023
d7d6948
Make flag off by default
rkennke Apr 27, 2023
a79a0ed
Fix
rkennke Apr 27, 2023
75f69ea
Fix 32 bit build
rkennke Apr 27, 2023
086f628
Add missing include
rkennke Apr 27, 2023
03b3f28
Fix wrong cast
rkennke Apr 27, 2023
72e4c95
Add missing include
rkennke Apr 27, 2023
98f32ac
Fix cast again
rkennke Apr 27, 2023
c0c3675
Windows build fixes
rkennke Apr 27, 2023
c1b844b
Move ifdef to right place
rkennke Apr 27, 2023
743ca09
Fix minimal build
rkennke Apr 28, 2023
0ef9950
Address @shipilev's comments
rkennke Apr 28, 2023
f280481
Improve comment/explanation at top of SlidingForwarding, thanks @ship…
rkennke Apr 28, 2023
2f5b30e
Fix pointer_delta() underflow
rkennke Apr 28, 2023
31e90e4
Use murmur3 hash-code
rkennke Apr 28, 2023
74d4ad1
Some more changes by @shipilev
rkennke Apr 28, 2023
5892ad5
Address @shipilev's review
rkennke May 2, 2023
494ec9a
More @shipilev's review comments
rkennke May 2, 2023
84181db
Address @tstuefe's review comments
rkennke May 2, 2023
8366454
Initialize 'heap' elements in test case
rkennke May 2, 2023
b623db5
More Thomas' comments
rkennke May 3, 2023
568e5ea
Refactor GCForwarding into SlidingForwarding
rkennke May 3, 2023
eb15d26
Set UseAltGCForwarding flag in test case
rkennke May 3, 2023
d8d201a
Use member assignment, instead of explicitly copying the struct
rkennke May 3, 2023
7691eb8
Place 'public' correctly
rkennke May 3, 2023
f30039a
Bunch of fixes
rkennke May 3, 2023
fe0915e
Flatten SlidingForwarding and use heads of FallbackTable
rkennke May 3, 2023
5ee1759
Fix type narrowing
rkennke May 3, 2023
daefd40
Address @tschatzl's review
rkennke May 4, 2023
2762f1b
Switch back to size_t for some fields
rkennke May 4, 2023
0cc732e
Fix release build
rkennke May 4, 2023
ad9fb17
Use @rose00's fast-hash impl instead of murmur
rkennke May 4, 2023
0f3604a
Add usual header include guards
rkennke May 4, 2023
c3b9ae9
Clamp home index. Duh.
rkennke May 4, 2023
a7de863
Add some test configs that use +UseAltGCForwarding
rkennke May 4, 2023
4306ac9
@tstuefe review
rkennke May 4, 2023
f85e491
@shipilev comments
rkennke May 4, 2023
0ccd5a0
Fix asserts
rkennke May 4, 2023
40fc46f
8305896: Alternative full GC forwarding
rkennke Apr 21, 2023
cc43cde
Implement fallback-hashtable for G1 serial compaction
rkennke Apr 26, 2023
a330157
Improve handling of Serial GC spaces; some refactorings
rkennke Apr 26, 2023
502759d
Fix 32 bit builds
rkennke Apr 27, 2023
28daeba
Some cleanups
rkennke Apr 27, 2023
f8ae2f5
Add gtest for SlidingForwarding
rkennke Apr 27, 2023
db2c0bb
Clarify comments for SlidingForwarding
rkennke Apr 27, 2023
e06738f
Make flag off by default
rkennke Apr 27, 2023
f1d96d9
Fix
rkennke Apr 27, 2023
a150ea0
Fix 32 bit build
rkennke Apr 27, 2023
fe75b59
Add missing include
rkennke Apr 27, 2023
ab5b9db
Fix wrong cast
rkennke Apr 27, 2023
014fcbd
Add missing include
rkennke Apr 27, 2023
60d1039
Fix cast again
rkennke Apr 27, 2023
33ca040
Windows build fixes
rkennke Apr 27, 2023
672f067
Move ifdef to right place
rkennke Apr 27, 2023
cc9a85a
Fix minimal build
rkennke Apr 28, 2023
a24ca95
Address @shipilev's comments
rkennke Apr 28, 2023
0f5d9ee
Improve comment/explanation at top of SlidingForwarding, thanks @ship…
rkennke Apr 28, 2023
67b2dec
Fix pointer_delta() underflow
rkennke Apr 28, 2023
778c07b
Use murmur3 hash-code
rkennke Apr 28, 2023
6e7105b
Some more changes by @shipilev
rkennke Apr 28, 2023
1958603
Address @shipilev's review
rkennke May 2, 2023
aa19441
More @shipilev's review comments
rkennke May 2, 2023
2563135
Address @tstuefe's review comments
rkennke May 2, 2023
93364da
Initialize 'heap' elements in test case
rkennke May 2, 2023
49bb9ea
More Thomas' comments
rkennke May 3, 2023
9d44c02
Refactor GCForwarding into SlidingForwarding
rkennke May 3, 2023
38227cf
Set UseAltGCForwarding flag in test case
rkennke May 3, 2023
79f6719
Use member assignment, instead of explicitly copying the struct
rkennke May 3, 2023
3a76341
Place 'public' correctly
rkennke May 3, 2023
f54b4fa
Bunch of fixes
rkennke May 3, 2023
1005906
Flatten SlidingForwarding and use heads of FallbackTable
rkennke May 3, 2023
6f1f614
Fix type narrowing
rkennke May 3, 2023
bdabdc0
Address @tschatzl's review
rkennke May 4, 2023
a9ea660
Switch back to size_t for some fields
rkennke May 4, 2023
cba8d65
Fix release build
rkennke May 4, 2023
efb1264
Use @rose00's fast-hash impl instead of murmur
rkennke May 4, 2023
79247b8
Add usual header include guards
rkennke May 4, 2023
c8def5d
Clamp home index. Duh.
rkennke May 4, 2023
92de5c3
Add some test configs that use +UseAltGCForwarding
rkennke May 4, 2023
21ecc41
@tstuefe review
rkennke May 4, 2023
443d672
@shipilev comments
rkennke May 4, 2023
36ebb48
Fix asserts
rkennke May 4, 2023
10e1f43
strength reduction
tschatzl May 5, 2023
3f307bb
separate region bases
tschatzl May 5, 2023
6945f66
cleanup
tschatzl May 5, 2023
c259c85
Cleanup; remove commented out code, renames, "alt_region" -> "alterna…
tschatzl May 8, 2023
3704193
Make FallbackTable an inner class of SlidingForwarding
May 8, 2023
3a8d07b
Fix typos
May 8, 2023
c1ce8a7
Merge remote-tracking branch 'tschatzl/alt-fullgc-forwarding' into JD…
May 8, 2023
c2df268
Fix ASCII art
rkennke May 8, 2023
59549ae
Merge branch 'master' into JDK-8305896
rkennke May 8, 2023
c0147ca
Merge remote-tracking branch 'origin/JDK-8305896' into JDK-8305896
rkennke May 8, 2023
bea6e8a
Update src/hotspot/share/gc/shared/slidingForwarding.cpp
rkennke May 9, 2023
840d2da
Update src/hotspot/share/gc/shared/slidingForwarding.cpp
rkennke May 9, 2023
0d001db
Fix build
rkennke May 9, 2023
158e8b2
@tschatzl's latest fix, cleanup and a test that checks unaligned heap…
rkennke May 9, 2023
69c78eb
Fix gtest: Align fake-heaps, avoid re-forwardings
May 9, 2023
b0deb2b
Align fake-heap without GCC warnings (duh)
rkennke May 10, 2023
3cc2afb
Update src/hotspot/share/gc/shared/slidingForwarding.hpp
rkennke May 11, 2023
3271b29
Some more @shipilev comments
rkennke May 11, 2023
7a90149
Merge branch 'master' into JDK-8305896
May 12, 2023
f1ad342
Merge remote-tracking branch 'origin/JDK-8305896' into JDK-8305896
May 12, 2023
3f7cc37
Replace homegrown FallbackTable with a ResourceHashtable based impl
rkennke May 17, 2023
bff747f
Merge branch 'master' into JDK-8305896
rkennke May 17, 2023
6bbb8e0
Remove G1-only assert for fallback forwarding, and comment with expla…
May 18, 2023
6bbd295
Specialize full-GC loops to get UseAltGCForwarding flag check out of …
rkennke May 22, 2023
045ba85
Merge branch 'master' into JDK-8305896
rkennke Jun 16, 2023
524f9c5
Further templatize Serial GC's adjust_pointers()
rkennke Jun 16, 2023
01fc573
Some @shipilev comments from downstream review
Jun 20, 2023
3483178
Various cleanups
Jun 26, 2023
d2b41e2
Merge branch 'master' into JDK-8305896
rkennke Aug 11, 2023
bc15569
Merge remote-tracking branch 'upstream/master' into JDK-8305896
rkennke Aug 25, 2023
95c2bd6
Merge remote-tracking branch 'upstream/master' into JDK-8305896
rkennke Sep 28, 2023
2d06801
Fix build
rkennke Sep 29, 2023
bdc8c82
Merge remote-tracking branch 'upstream/master' into JDK-8305896
rkennke Nov 9, 2023
d67b42f
Merge branch 'master' into JDK-8305896
rkennke Dec 11, 2023
5b53631
Remove flag and template madness
rkennke Feb 19, 2024
306a254
Fix 32/64 bit code paths
rkennke Feb 19, 2024
b808eca
Merge branch 'master' into JDK-8305896
rkennke Feb 19, 2024
4391b05
Fix preserved-marks gtest
rkennke Feb 20, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 2 additions & 13 deletions src/hotspot/share/gc/shared/slidingForwarding.cpp
Original file line number Diff line number Diff line change
@@ -26,6 +26,7 @@
#include "precompiled.hpp"
#include "gc/shared/gc_globals.hpp"
#include "gc/shared/slidingForwarding.hpp"
#include "utilities/fastHash.hpp"
#include "utilities/ostream.hpp"
#include "utilities/powerOfTwo.hpp"

@@ -123,19 +124,7 @@ FallbackTable::~FallbackTable() {

size_t FallbackTable::home_index(HeapWord* from) {
uint64_t val = reinterpret_cast<uint64_t>(from);
// This is the mixer stage of the murmur3 hashing:
// https://github.com/aappleby/smhasher/blob/master/src/MurmurHash3.cpp
val ^= val >> 33;
val *= 0xff51afd7ed558ccdULL;
val ^= val >> 33;
val *= 0xc4ceb9fe1a85ec53ULL;
val ^= val >> 33;
// Shift to table-size.
val = val >> (64 - log2i_exact(TABLE_SIZE));
size_t idx = static_cast<size_t>(val);
assert(idx < TABLE_SIZE, "must fit in table: idx: " SIZE_FORMAT ", table-size: %u, table-size-bits: %d",
idx, TABLE_SIZE, log2i_exact(TABLE_SIZE));
return idx;
return FastHash::get_hash64(val, 0xAAAAAAAAAAAAAAAA);
}

void FallbackTable::forward_to(HeapWord* from, HeapWord* to) {
92 changes: 92 additions & 0 deletions src/hotspot/share/utilities/fastHash.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
/*
* Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/

#include "memory/allStatic.hpp"

class FastHash : public AllStatic {
private:
static void fullmul64(uint64_t& hi, uint64_t& lo, uint64_t op1, uint64_t op2) {
#if defined(__SIZEOF_INT128__)
__uint128_t prod = static_cast<__uint128_t>(op1) * static_cast<__uint128_t>(op2);
hi = static_cast<uint64_t>(prod >> 64);
lo = static_cast<uint64_t>(prod >> 0);
#else
/* First calculate all of the cross products. */
uint64_t lo_lo = (op1 & 0xFFFFFFFF) * (op2 & 0xFFFFFFFF);
uint64_t hi_lo = (op1 >> 32) * (op2 & 0xFFFFFFFF);
uint64_t lo_hi = (op1 & 0xFFFFFFFF) * (op2 >> 32);
uint64_t hi_hi = (op1 >> 32) * (op2 >> 32);

/* Now add the products together. These will never overflow. */
uint64_t cross = (lo_lo >> 32) + (hi_lo & 0xFFFFFFFF) + lo_hi;
uint64_t upper = (hi_lo >> 32) + (cross >> 32) + hi_hi;
hi = upper;
lo = (cross << 32) | (lo_lo & 0xFFFFFFFF);
#endif
}

static void fullmul32(uint32_t& hi, uint32_t& lo, uint32_t op1, uint32_t op2) {
uint64_t x64 = op1, y64 = op2, xy64 = x64 * y64;
hi = (uint32_t)(xy64 >> 32);
lo = (uint32_t)(xy64 >> 0);
}

static uint64_t ror(uint64_t x, uint64_t distance) {
distance = distance & 0x3F;
return (x >> distance) | (x << (64 - distance));
}

public:
static uint64_t get_hash64(uint64_t x, uint64_t y) {
const uint64_t M = 0x8ADAE89C337954D5;
const uint64_t A = 0xAAAAAAAAAAAAAAAA; // REPAA
const uint64_t H0 = (x ^ y), L0 = (x ^ A);

uint64_t U0, V0; fullmul64(U0, V0, L0, M);
const uint64_t Q0 = (H0 * M);
const uint64_t L1 = (Q0 ^ U0);

uint64_t U1, V1; fullmul64(U1, V1, L1, M);
const uint64_t P1 = (V0 ^ M);
const uint64_t Q1 = ror(P1, L1);
const uint64_t L2 = (Q1 ^ U1);
return V1 ^ L2;
}

static uint32_t get_hash32(uint32_t x, uint32_t y) {
const uint32_t M = 0x337954D5;
const uint32_t A = 0xAAAAAAAA; // REPAA
const uint32_t H0 = (x ^ y), L0 = (x ^ A);

uint32_t U0, V0; fullmul32(U0, V0, L0, M);
const uint32_t Q0 = (H0 * M);
const uint32_t L1 = (Q0 ^ U0);

uint32_t U1, V1; fullmul32(U1, V1, L1, M);
const uint32_t P1 = (V0 ^ M);
const uint32_t Q1 = ror(P1, L1);
const uint32_t L2 = (Q1 ^ U1);
return V1 ^ L2;
}
};