Revert "Differentiate compiler synthesized ConstClass/CheckCast"
This reverts commit 11bee070c17707c229d802d7440aab028d00695f.
Reason for revert: Breaks Proto2ShrinkingTest
Change-Id: I23cf9ca6336b245e61e0d50ac1d8cd618317fe9c
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfCheckCast.java b/src/main/java/com/android/tools/r8/cf/code/CfCheckCast.java
index f44b0e8..cfad75e 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfCheckCast.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfCheckCast.java
@@ -30,19 +30,9 @@
public class CfCheckCast extends CfInstruction implements CfTypeInstruction {
private final DexType type;
- private final boolean ignoreCompatRules;
public CfCheckCast(DexType type) {
- this(type, false);
- }
-
- public CfCheckCast(DexType type, boolean ignoreCompatRules) {
this.type = type;
- this.ignoreCompatRules = ignoreCompatRules;
- }
-
- public boolean ignoreCompatRules() {
- return ignoreCompatRules;
}
@Override
@@ -62,7 +52,7 @@
@Override
public CfInstruction withType(DexType newType) {
- return new CfCheckCast(newType, ignoreCompatRules());
+ return new CfCheckCast(newType);
}
@Override
@@ -98,7 +88,7 @@
@Override
void internalRegisterUse(
UseRegistry registry, DexClassAndMethod context, ListIterator<CfInstruction> iterator) {
- registry.registerCheckCast(type, ignoreCompatRules());
+ registry.registerCheckCast(type);
}
@Override
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfConstClass.java b/src/main/java/com/android/tools/r8/cf/code/CfConstClass.java
index 0e25f60..b7524be 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfConstClass.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfConstClass.java
@@ -30,19 +30,9 @@
public class CfConstClass extends CfInstruction implements CfTypeInstruction {
private final DexType type;
- private final boolean ignoreCompatRules;
public CfConstClass(DexType type) {
- this(type, false);
- }
-
- public CfConstClass(DexType type, boolean ignoreCompatRules) {
this.type = type;
- this.ignoreCompatRules = ignoreCompatRules;
- }
-
- public boolean ignoreCompatRules() {
- return ignoreCompatRules;
}
@Override
@@ -129,7 +119,7 @@
@Override
void internalRegisterUse(
UseRegistry registry, DexClassAndMethod context, ListIterator<CfInstruction> iterator) {
- registry.registerConstClass(type, iterator, ignoreCompatRules());
+ registry.registerConstClass(type, iterator);
}
@Override
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfSafeCheckCast.java b/src/main/java/com/android/tools/r8/cf/code/CfSafeCheckCast.java
index 91fe60f..e1473d3 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfSafeCheckCast.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfSafeCheckCast.java
@@ -14,7 +14,7 @@
public class CfSafeCheckCast extends CfCheckCast {
public CfSafeCheckCast(DexType type) {
- super(type, true);
+ super(type);
}
@Override
diff --git a/src/main/java/com/android/tools/r8/code/CheckCast.java b/src/main/java/com/android/tools/r8/code/CheckCast.java
index d3effb5..9f3739a 100644
--- a/src/main/java/com/android/tools/r8/code/CheckCast.java
+++ b/src/main/java/com/android/tools/r8/code/CheckCast.java
@@ -21,16 +21,12 @@
public static final String NAME = "CheckCast";
public static final String SMALI_NAME = "check-cast";
- private final boolean ignoreCompatRules;
-
CheckCast(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
super(high, stream, mapping.getTypeMap());
- this.ignoreCompatRules = false;
}
- public CheckCast(int valueRegister, DexType type, boolean ignoreCompatRules) {
+ public CheckCast(int valueRegister, DexType type) {
super(valueRegister, type);
- this.ignoreCompatRules = ignoreCompatRules;
}
@Override
@@ -54,11 +50,6 @@
}
@Override
- public boolean ignoreCompatRules() {
- return ignoreCompatRules;
- }
-
- @Override
public void collectIndexedItems(
IndexedItemCollection indexedItems,
ProgramMethod context,
@@ -92,7 +83,7 @@
@Override
public void registerUse(UseRegistry registry) {
- registry.registerCheckCast(getType(), ignoreCompatRules());
+ registry.registerCheckCast(getType());
}
public DexType getType() {
diff --git a/src/main/java/com/android/tools/r8/code/ConstClass.java b/src/main/java/com/android/tools/r8/code/ConstClass.java
index e098705..b96f4aa 100644
--- a/src/main/java/com/android/tools/r8/code/ConstClass.java
+++ b/src/main/java/com/android/tools/r8/code/ConstClass.java
@@ -21,16 +21,12 @@
public static final String NAME = "ConstClass";
public static final String SMALI_NAME = "const-class";
- private final boolean ignoreCompatRules;
-
ConstClass(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
super(high, stream, mapping.getTypeMap());
- this.ignoreCompatRules = false;
}
- public ConstClass(int dest, DexType type, boolean ignoreCompatRules) {
+ public ConstClass(int dest, DexType type) {
super(dest, type);
- this.ignoreCompatRules = ignoreCompatRules;
}
@Override
@@ -39,11 +35,6 @@
}
@Override
- public boolean ignoreCompatRules() {
- return ignoreCompatRules;
- }
-
- @Override
public String getName() {
return NAME;
}
@@ -82,7 +73,7 @@
@Override
public void registerUse(UseRegistry registry) {
- registry.registerConstClass(getType(), null, ignoreCompatRules());
+ registry.registerConstClass(getType(), null);
}
public DexType getType() {
diff --git a/src/main/java/com/android/tools/r8/code/Instruction.java b/src/main/java/com/android/tools/r8/code/Instruction.java
index 617b2a2..ccfd713 100644
--- a/src/main/java/com/android/tools/r8/code/Instruction.java
+++ b/src/main/java/com/android/tools/r8/code/Instruction.java
@@ -243,10 +243,6 @@
return 0;
}
- public boolean ignoreCompatRules() {
- return false;
- }
-
static String formatOffset(int offset) {
return StringUtils.hexString(offset, 2);
}
diff --git a/src/main/java/com/android/tools/r8/code/SafeCheckCast.java b/src/main/java/com/android/tools/r8/code/SafeCheckCast.java
index be742e4..e4af2a0 100644
--- a/src/main/java/com/android/tools/r8/code/SafeCheckCast.java
+++ b/src/main/java/com/android/tools/r8/code/SafeCheckCast.java
@@ -16,7 +16,7 @@
}
public SafeCheckCast(int valueRegister, DexType type) {
- super(valueRegister, type, true);
+ super(valueRegister, type);
}
@Override
diff --git a/src/main/java/com/android/tools/r8/graph/UseRegistry.java b/src/main/java/com/android/tools/r8/graph/UseRegistry.java
index 85bcd39..aeed7c0 100644
--- a/src/main/java/com/android/tools/r8/graph/UseRegistry.java
+++ b/src/main/java/com/android/tools/r8/graph/UseRegistry.java
@@ -93,13 +93,6 @@
}
public void registerConstClass(
- DexType type,
- ListIterator<? extends CfOrDexInstruction> iterator,
- boolean ignoreCompatRules) {
- registerConstClass(type, iterator);
- }
-
- public void registerConstClass(
DexType type, ListIterator<? extends CfOrDexInstruction> iterator) {
registerTypeReference(type);
}
@@ -108,12 +101,8 @@
registerTypeReference(type);
}
- public void registerCheckCast(DexType type, boolean ignoreCompatRules) {
- registerCheckCast(type);
- }
-
public void registerSafeCheckCast(DexType type) {
- registerCheckCast(type, true);
+ registerCheckCast(type);
}
public void registerExceptionGuard(DexType guard) {
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/proto/schema/ProtoEnqueuerExtension.java b/src/main/java/com/android/tools/r8/ir/analysis/proto/schema/ProtoEnqueuerExtension.java
index 66747a7..e7d953a 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/proto/schema/ProtoEnqueuerExtension.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/proto/schema/ProtoEnqueuerExtension.java
@@ -497,7 +497,7 @@
object.asProtoObjectFromStaticGet().getField(), dynamicMethod);
} else if (object.isProtoTypeObject()) {
worklist.enqueueTraceConstClassAction(
- object.asProtoTypeObject().getType(), dynamicMethod, false);
+ object.asProtoTypeObject().getType(), dynamicMethod);
}
}
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/CheckCast.java b/src/main/java/com/android/tools/r8/ir/code/CheckCast.java
index 764167c..b5e4027 100644
--- a/src/main/java/com/android/tools/r8/ir/code/CheckCast.java
+++ b/src/main/java/com/android/tools/r8/ir/code/CheckCast.java
@@ -30,20 +30,14 @@
public class CheckCast extends Instruction {
private final DexType type;
- private final boolean ignoreCompatRules;
// A CheckCast dex instruction takes only one register containing a value and changes
// the associated type information for that value. In the IR we let the CheckCast
// instruction define a new value. During register allocation we then need to arrange it
// so that the source and destination are assigned the same register.
public CheckCast(Value dest, Value value, DexType type) {
- this(dest, value, type, false);
- }
-
- public CheckCast(Value dest, Value value, DexType type, boolean ignoreCompatRules) {
super(dest, value);
this.type = type;
- this.ignoreCompatRules = ignoreCompatRules;
}
public static Builder builder() {
@@ -72,11 +66,6 @@
}
@Override
- public boolean ignoreCompatRules() {
- return ignoreCompatRules;
- }
-
- @Override
public int opcode() {
return Opcodes.CHECK_CAST;
}
@@ -118,7 +107,7 @@
}
com.android.tools.r8.code.CheckCast createCheckCast(int register) {
- return new com.android.tools.r8.code.CheckCast(register, getType(), ignoreCompatRules());
+ return new com.android.tools.r8.code.CheckCast(register, getType());
}
@Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/ConstClass.java b/src/main/java/com/android/tools/r8/ir/code/ConstClass.java
index 93cefd2..0fa4236 100644
--- a/src/main/java/com/android/tools/r8/ir/code/ConstClass.java
+++ b/src/main/java/com/android/tools/r8/ir/code/ConstClass.java
@@ -26,16 +26,10 @@
public class ConstClass extends ConstInstruction {
private final DexType clazz;
- private final boolean ignoreCompatRules;
public ConstClass(Value dest, DexType clazz) {
- this(dest, clazz, false);
- }
-
- public ConstClass(Value dest, DexType clazz, boolean ignoreCompatRules) {
super(dest);
this.clazz = clazz;
- this.ignoreCompatRules = ignoreCompatRules;
}
public static Builder builder() {
@@ -78,12 +72,7 @@
@Override
public void buildDex(DexBuilder builder) {
int dest = builder.allocatedRegister(dest(), getNumber());
- builder.add(this, new com.android.tools.r8.code.ConstClass(dest, clazz, ignoreCompatRules()));
- }
-
- @Override
- public boolean ignoreCompatRules() {
- return ignoreCompatRules;
+ builder.add(this, new com.android.tools.r8.code.ConstClass(dest, clazz));
}
@Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/Instruction.java b/src/main/java/com/android/tools/r8/ir/code/Instruction.java
index 9bccbfc..85ac375 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Instruction.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Instruction.java
@@ -120,10 +120,6 @@
}
}
- public boolean ignoreCompatRules() {
- return false;
- }
-
public boolean hasInValueWithLocalInfo() {
return hasInValueThatMatches(Value::hasLocalInfo);
}
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java b/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java
index c7b07d3..d012cd6 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java
@@ -563,9 +563,7 @@
CheckCast checkCast = current.asCheckCast();
new InstructionReplacer(code, current, iterator, affectedPhis)
.replaceInstructionIfTypeChanged(
- checkCast.getType(),
- (t, v) ->
- new CheckCast(v, checkCast.object(), t, checkCast.ignoreCompatRules()));
+ checkCast.getType(), (t, v) -> new CheckCast(v, checkCast.object(), t));
}
break;
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/records/RecordDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/records/RecordDesugaring.java
index 0c1ee6e..09319b6 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/records/RecordDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/records/RecordDesugaring.java
@@ -391,7 +391,7 @@
assert recordInvokeDynamic.getRecordClass().lookupProgramMethod(getFieldsAsObjects) != null;
ArrayList<CfInstruction> instructions = new ArrayList<>();
instructions.add(new CfInvoke(Opcodes.INVOKESPECIAL, getFieldsAsObjects, false));
- instructions.add(new CfConstClass(recordInvokeDynamic.getRecordClass().type, true));
+ instructions.add(new CfConstClass(recordInvokeDynamic.getRecordClass().type));
instructions.add(new CfConstString(recordInvokeDynamic.getFieldNames()));
ProgramMethod programMethod =
synthesizeRecordHelper(
diff --git a/src/main/java/com/android/tools/r8/ir/synthetic/RecordCfCodeProvider.java b/src/main/java/com/android/tools/r8/ir/synthetic/RecordCfCodeProvider.java
index e9fc30b..ce66391 100644
--- a/src/main/java/com/android/tools/r8/ir/synthetic/RecordCfCodeProvider.java
+++ b/src/main/java/com/android/tools/r8/ir/synthetic/RecordCfCodeProvider.java
@@ -158,7 +158,7 @@
instructions.add(new CfLoad(recordType, 0));
instructions.add(new CfInvoke(Opcodes.INVOKESPECIAL, getFieldsAsObjects, false));
instructions.add(new CfLoad(objectType, 1));
- instructions.add(new CfCheckCast(getHolder(), true));
+ instructions.add(new CfCheckCast(getHolder()));
instructions.add(new CfInvoke(Opcodes.INVOKESPECIAL, getFieldsAsObjects, false));
instructions.add(
new CfInvoke(
diff --git a/src/main/java/com/android/tools/r8/shaking/DefaultEnqueuerUseRegistry.java b/src/main/java/com/android/tools/r8/shaking/DefaultEnqueuerUseRegistry.java
index 2c6a477..25f01cf 100644
--- a/src/main/java/com/android/tools/r8/shaking/DefaultEnqueuerUseRegistry.java
+++ b/src/main/java/com/android/tools/r8/shaking/DefaultEnqueuerUseRegistry.java
@@ -6,7 +6,6 @@
import com.android.tools.r8.androidapi.AndroidApiLevelCompute;
import com.android.tools.r8.code.CfOrDexInstruction;
-import com.android.tools.r8.errors.Unreachable;
import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexCallSite;
@@ -146,26 +145,13 @@
@Override
public void registerConstClass(
- DexType type,
- ListIterator<? extends CfOrDexInstruction> iterator,
- boolean ignoreCompatRules) {
- enqueuer.traceConstClass(type, context, iterator, ignoreCompatRules);
- }
-
- @Override
- public void registerConstClass(
DexType type, ListIterator<? extends CfOrDexInstruction> iterator) {
- throw new Unreachable();
- }
-
- @Override
- public void registerCheckCast(DexType type, boolean ignoreCompatRules) {
- enqueuer.traceCheckCast(type, context, ignoreCompatRules);
+ enqueuer.traceConstClass(type, context, iterator);
}
@Override
public void registerCheckCast(DexType type) {
- throw new Unreachable();
+ enqueuer.traceCheckCast(type, context);
}
@Override
diff --git a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
index ec6c061..b4fef63 100644
--- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -1034,23 +1034,22 @@
}
}
- void traceCheckCast(DexType type, ProgramMethod currentMethod, boolean ignoreCompatRules) {
+ void traceCheckCast(DexType type, ProgramMethod currentMethod) {
checkCastAnalyses.forEach(analysis -> analysis.traceCheckCast(type, currentMethod));
- internalTraceConstClassOrCheckCast(type, currentMethod, ignoreCompatRules);
+ traceConstClassOrCheckCast(type, currentMethod);
}
void traceSafeCheckCast(DexType type, ProgramMethod currentMethod) {
checkCastAnalyses.forEach(analysis -> analysis.traceSafeCheckCast(type, currentMethod));
- internalTraceConstClassOrCheckCast(type, currentMethod, true);
+ traceCompilerSynthesizedConstClassOrCheckCast(type, currentMethod);
}
void traceConstClass(
DexType type,
ProgramMethod currentMethod,
- ListIterator<? extends CfOrDexInstruction> iterator,
- boolean ignoreCompatRules) {
+ ListIterator<? extends CfOrDexInstruction> iterator) {
handleLockCandidate(type, currentMethod, iterator);
- internalTraceConstClassOrCheckCast(type, currentMethod, ignoreCompatRules);
+ traceConstClassOrCheckCast(type, currentMethod);
}
private void handleLockCandidate(
@@ -1104,10 +1103,22 @@
return result;
}
+ private void traceConstClassOrCheckCast(DexType type, ProgramMethod currentMethod) {
+ internalTraceConstClassOrCheckCast(type, currentMethod, false);
+ }
+
+ // TODO(b/190487539): Currently only used by traceSafeCheckCast(), but should also be used to
+ // ensure we don't trigger compat behavior for const-class instructions synthesized for
+ // synchronized methods.
+ private void traceCompilerSynthesizedConstClassOrCheckCast(
+ DexType type, ProgramMethod currentMethod) {
+ internalTraceConstClassOrCheckCast(type, currentMethod, true);
+ }
+
private void internalTraceConstClassOrCheckCast(
- DexType type, ProgramMethod currentMethod, boolean ignoreCompatRules) {
+ DexType type, ProgramMethod currentMethod, boolean isCompilerSynthesized) {
traceTypeReference(type, currentMethod);
- if (!forceProguardCompatibility || ignoreCompatRules) {
+ if (!forceProguardCompatibility || isCompilerSynthesized) {
return;
}
DexType baseType = type.toBaseType(appView.dexItemFactory());
diff --git a/src/main/java/com/android/tools/r8/shaking/EnqueuerWorklist.java b/src/main/java/com/android/tools/r8/shaking/EnqueuerWorklist.java
index 1f4bc35..ad3d4d1 100644
--- a/src/main/java/com/android/tools/r8/shaking/EnqueuerWorklist.java
+++ b/src/main/java/com/android/tools/r8/shaking/EnqueuerWorklist.java
@@ -227,17 +227,15 @@
private final DexType type;
// TODO(b/175854431): Avoid pushing context on worklist.
private final ProgramMethod context;
- private final boolean ignoreCompatRules;
- TraceConstClassAction(DexType type, ProgramMethod context, boolean ignoreCompatRules) {
+ TraceConstClassAction(DexType type, ProgramMethod context) {
this.type = type;
this.context = context;
- this.ignoreCompatRules = ignoreCompatRules;
}
@Override
public void run(Enqueuer enqueuer) {
- enqueuer.traceConstClass(type, context, null, ignoreCompatRules);
+ enqueuer.traceConstClass(type, context, null);
}
}
@@ -358,8 +356,7 @@
public abstract void enqueueTraceCodeAction(ProgramMethod method);
- public abstract void enqueueTraceConstClassAction(
- DexType type, ProgramMethod context, boolean ignoreCompatRules);
+ public abstract void enqueueTraceConstClassAction(DexType type, ProgramMethod context);
public abstract void enqueueTraceInvokeDirectAction(
DexMethod invokedMethod, ProgramMethod context);
@@ -467,9 +464,8 @@
}
@Override
- public void enqueueTraceConstClassAction(
- DexType type, ProgramMethod context, boolean ignoreCompatRules) {
- queue.add(new TraceConstClassAction(type, context, ignoreCompatRules));
+ public void enqueueTraceConstClassAction(DexType type, ProgramMethod context) {
+ queue.add(new TraceConstClassAction(type, context));
}
@Override
@@ -584,23 +580,26 @@
}
@Override
- public void enqueueTraceConstClassAction(
- DexType type, ProgramMethod context, boolean ignoreCompatRules) {
+ public void enqueueTraceConstClassAction(DexType type, ProgramMethod context) {
+
throw attemptToEnqueue();
}
@Override
public void enqueueTraceInvokeDirectAction(DexMethod invokedMethod, ProgramMethod context) {
+
throw attemptToEnqueue();
}
@Override
public void enqueueTraceNewInstanceAction(DexType type, ProgramMethod context) {
+
throw attemptToEnqueue();
}
@Override
public void enqueueTraceStaticFieldRead(DexField field, ProgramMethod context) {
+
throw attemptToEnqueue();
}
}
diff --git a/src/test/java/com/android/tools/r8/desugar/records/RecordShrinkFieldTest.java b/src/test/java/com/android/tools/r8/desugar/records/RecordShrinkFieldTest.java
index 7b653ed..d46e947 100644
--- a/src/test/java/com/android/tools/r8/desugar/records/RecordShrinkFieldTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/records/RecordShrinkFieldTest.java
@@ -67,22 +67,6 @@
}
@Test
- public void testR8Compat() throws Exception {
- testForR8Compat(parameters.getBackend())
- .addProgramClassFileData(PROGRAM_DATA)
- .setMinApi(parameters.getApiLevel())
- .addKeepMainRule(MAIN_TYPE)
- .addKeepRules(
- "-keepclassmembers,allowshrinking,allowoptimization class"
- + " records.RecordShrinkField$Person { <fields>; }")
- .addOptionsModification(TestingOptions::allowExperimentClassFileVersion)
- .compile()
- .inspect(this::assertSingleField)
- .run(parameters.getRuntime(), MAIN_TYPE)
- .assertSuccessWithOutput(EXPECTED_RESULT_R8);
- }
-
- @Test
public void testR8CfThenDex() throws Exception {
Path desugared =
testForR8(Backend.CF)