Skip to content

Commit a4a039e

Browse files
committed
[GR-65615] TruffleStrings: fix cacheInsertFirstBeforePublished optimization.
PullRequest: graal/21024
2 parents 07f9eb3 + bdc9e2c commit a4a039e

File tree

2 files changed

+33
-18
lines changed

2 files changed

+33
-18
lines changed

truffle/src/com.oracle.truffle.api.strings/src/com/oracle/truffle/api/strings/TStringInternalNodes.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2010,13 +2010,14 @@ static TruffleString doNonEmpty(Node node, String javaString, int charOffset, in
20102010
}
20112011
}
20122012
int hash = TStringUnsafe.getJavaStringHashMasked(javaString);
2013-
TruffleString ret = TruffleString.createFromByteArray(array, offset, length, stride, Encoding.UTF_16, codePointLength, codeRange, hash, true);
2013+
final TruffleString cacheEntry;
20142014
if (length == javaString.length()) {
20152015
assert charOffset == 0;
2016-
TruffleString wrapped = TruffleString.createWrapJavaString(javaString, codePointLength, codeRange);
2017-
ret.cacheInsertFirstBeforePublished(wrapped);
2016+
cacheEntry = TruffleString.createWrapJavaString(javaString, codePointLength, codeRange);
2017+
} else {
2018+
cacheEntry = null;
20182019
}
2019-
return ret;
2020+
return TruffleString.createFromByteArrayWithCacheEntry(array, offset, length, stride, Encoding.UTF_16, codePointLength, codeRange, hash, cacheEntry);
20202021
}
20212022
}
20222023

truffle/src/com.oracle.truffle.api.strings/src/com/oracle/truffle/api/strings/TruffleString.java

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,18 @@ private TruffleString(Object data, int offset, int length, int stride, Encoding
148148
super(data, offset, length, stride, encoding, isCacheHead ? FLAG_CACHE_HEAD : 0, codePointLength, codeRange, hashCode);
149149
}
150150

151+
private TruffleString(Object data, int offset, int length, int stride, Encoding encoding, int codePointLength, int codeRange, int hashCode, boolean isCacheHead, TruffleString cacheEntry) {
152+
this(data, offset, length, stride, encoding, codePointLength, codeRange, hashCode, isCacheHead);
153+
if (cacheEntry != null) {
154+
assert !cacheEntry.isCacheHead();
155+
assert isCacheHead();
156+
assert next == null;
157+
TruffleString cacheHead = this;
158+
cacheEntry.next = cacheHead;
159+
cacheHead.next = cacheEntry;
160+
}
161+
}
162+
151163
private static TruffleString create(Object data, int offset, int length, int stride, Encoding encoding, int codePointLength, int codeRange, int hashCode, boolean isCacheHead) {
152164
TruffleString string = new TruffleString(data, offset, length, stride, encoding, codePointLength, codeRange, hashCode, isCacheHead);
153165
if (AbstractTruffleString.DEBUG_ALWAYS_CREATE_JAVA_STRING) {
@@ -156,6 +168,14 @@ private static TruffleString create(Object data, int offset, int length, int str
156168
return string;
157169
}
158170

171+
private static TruffleString createWithCacheEntry(Object data, int offset, int length, int stride, Encoding encoding, int codePointLength, int codeRange, int hashCode, TruffleString cacheEntry) {
172+
TruffleString string = new TruffleString(data, offset, length, stride, encoding, codePointLength, codeRange, hashCode, true, cacheEntry);
173+
if (AbstractTruffleString.DEBUG_ALWAYS_CREATE_JAVA_STRING) {
174+
string.toJavaStringUncached();
175+
}
176+
return string;
177+
}
178+
159179
static TruffleString createFromByteArray(byte[] bytes, int length, int stride, Encoding encoding, int codePointLength, int codeRange) {
160180
return createFromByteArray(bytes, 0, length, stride, encoding, codePointLength, codeRange, true);
161181
}
@@ -196,6 +216,14 @@ static TruffleString createFromArray(Object bytes, int offset, int length, int s
196216
return TruffleString.create(bytes, offset, length, stride, encoding, codePointLength, codeRange, hashCode, isCacheHead);
197217
}
198218

219+
static TruffleString createFromByteArrayWithCacheEntry(byte[] bytes, int offset, int length, int stride, Encoding encoding, int codePointLength, int codeRange, int hashCode,
220+
TruffleString cacheEntry) {
221+
assert offset >= 0;
222+
assert offset + ((long) length << stride) <= bytes.length;
223+
assert attrsAreCorrect(bytes, encoding, offset, length, codePointLength, codeRange, stride);
224+
return TruffleString.createWithCacheEntry(bytes, offset, length, stride, encoding, codePointLength, codeRange, hashCode, cacheEntry);
225+
}
226+
199227
static TruffleString createConstant(byte[] bytes, int length, int stride, Encoding encoding, int codePointLength, int codeRange) {
200228
return createConstant(bytes, length, stride, encoding, codePointLength, codeRange, true);
201229
}
@@ -298,20 +326,6 @@ void cacheInsert(TruffleString entry) {
298326
} while (!setNextAtomic(cacheHead, cacheHeadNext, entry));
299327
}
300328

301-
/*
302-
* Simpler and faster insertion for the case `this` and `entry` were just allocated together and
303-
* before they are published. The CAS is not needed in that case since we know nobody could
304-
* write to `next` fields before us.
305-
*/
306-
void cacheInsertFirstBeforePublished(TruffleString entry) {
307-
assert !entry.isCacheHead();
308-
assert isCacheHead();
309-
assert next == null;
310-
TruffleString cacheHead = this;
311-
entry.next = cacheHead;
312-
cacheHead.next = entry;
313-
}
314-
315329
private static boolean hasDuplicateEncoding(TruffleString cacheHead, TruffleString start, TruffleString insertEntry) {
316330
if (start == null) {
317331
return false;

0 commit comments

Comments
 (0)