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)