Revert changes to DexItemFactory#createType
Reason for revert: Nondeterminism in JetNewsAppPartial benchmark
Test: run_benchmark.py --benchmark JetNewsAppPartial --target r8-full -w 0 -i 100
Change-Id: I29db25d3094dfc6636c951413a72bd89fa3c6683
diff --git a/src/main/java/com/android/tools/r8/graph/DexItemFactory.java b/src/main/java/com/android/tools/r8/graph/DexItemFactory.java
index ad19a9f..ce75e87 100644
--- a/src/main/java/com/android/tools/r8/graph/DexItemFactory.java
+++ b/src/main/java/com/android/tools/r8/graph/DexItemFactory.java
@@ -3360,6 +3360,28 @@
return markers;
}
+ // Non-synchronized internal create.
+ private DexType internalCreateType(DexString descriptor) {
+ assert descriptor != null;
+ DexType result = types.get(descriptor);
+ if (result == null) {
+ if (descriptor.getFirstByteAsChar() != '[') {
+ result = new DexType(descriptor);
+ } else {
+ DexType elementType = createType(descriptor.toArrayElementDescriptor(this));
+ result = new DexArrayType(descriptor, elementType);
+ }
+ assert result.isArrayType()
+ || result.isClassType()
+ || result.isPrimitiveType()
+ || result.isVoidType()
+ : descriptor.toString();
+ assert !isInternalSentinel(result);
+ types.put(descriptor, result);
+ }
+ return result;
+ }
+
private DexType createStaticallyKnownType(String descriptor) {
return createStaticallyKnownType(createString(descriptor));
}
@@ -3372,7 +3394,7 @@
}
private DexType createStaticallyKnownType(DexString descriptor) {
- DexType type = createType(descriptor);
+ DexType type = internalCreateType(descriptor);
// Conservatively add all statically known types to "compiler synthesized types set".
addPossiblySynthesizedType(type);
return type;
@@ -3380,8 +3402,8 @@
// Safe synchronized external create. May be used for statically known types in synthetic code.
// See the generated BackportedMethods.java for reference.
- public DexType createSynthesizedType(String descriptor) {
- DexType type = createType(createString(descriptor));
+ public synchronized DexType createSynthesizedType(String descriptor) {
+ DexType type = internalCreateType(createString(descriptor));
addPossiblySynthesizedType(type);
return type;
}
@@ -3409,21 +3431,9 @@
possibleCompilerSynthesizedTypes.forEach(fn);
}
- public DexType createType(DexString descriptor) {
- assert descriptor != null;
- DexType committed = committedTypes.get(descriptor);
- if (committed != null) {
- return committed;
- }
- if (descriptor.getFirstByteAsChar() != '[') {
- return types.computeIfAbsent(descriptor, DexType::new);
- }
- DexType pending = types.get(descriptor);
- if (pending != null) {
- return pending;
- }
- DexType elementType = createType(descriptor.toArrayElementDescriptor(this));
- return types.computeIfAbsent(descriptor, d -> new DexArrayType(d, elementType));
+ // Safe synchronized external create. Should never be used to create a statically known type!
+ public synchronized DexType createType(DexString descriptor) {
+ return internalCreateType(descriptor);
}
public DexType createType(String descriptor) {
@@ -3676,7 +3686,7 @@
public void commitPendingItems() {
commitPendingItems(committedMethodHandles, methodHandles);
commitPendingItems(committedStrings, strings);
- commitPendingItems(committedTypes, types);
+ // commitPendingItems(committedTypes, types);
commitPendingItems(committedFields, fields);
commitPendingItems(committedProtos, protos);
commitPendingItems(committedMethods, methods);