Remove calls to InlineMarker in Kotlin inline functions
Bug: b/370968906
Change-Id: Ib81e30338b99c54e2b026668c776616d5e0f37c2
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/passes/CodeRewriterPassCollection.java b/src/main/java/com/android/tools/r8/ir/conversion/passes/CodeRewriterPassCollection.java
index 1b572c8..bae921e2 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/passes/CodeRewriterPassCollection.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/passes/CodeRewriterPassCollection.java
@@ -36,6 +36,9 @@
public static CodeRewriterPassCollection create(AppView<?> appView) {
List<CodeRewriterPass<?>> passes = new ArrayList<>();
+ if (!appView.hasClassHierarchy()) {
+ passes.add(new KotlinInlineMarkerRewriter(appView.withoutClassHierarchy()));
+ }
passes.add(new TrivialCheckCastAndInstanceOfRemover(appView));
passes.add(new EnumValueOptimizer(appView));
passes.add(new KnownArrayLengthRewriter(appView));
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/passes/KotlinInlineMarkerRewriter.java b/src/main/java/com/android/tools/r8/ir/conversion/passes/KotlinInlineMarkerRewriter.java
new file mode 100644
index 0000000..73b9219
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/ir/conversion/passes/KotlinInlineMarkerRewriter.java
@@ -0,0 +1,56 @@
+// Copyright (c) 2024, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.ir.conversion.passes;
+
+import com.android.tools.r8.graph.AppInfo;
+import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.DexType;
+import com.android.tools.r8.ir.code.BasicBlock;
+import com.android.tools.r8.ir.code.IRCode;
+import com.android.tools.r8.ir.code.InstructionListIterator;
+import com.android.tools.r8.ir.code.InvokeStatic;
+import com.android.tools.r8.ir.conversion.MethodProcessor;
+import com.android.tools.r8.ir.conversion.passes.result.CodeRewriterResult;
+
+public class KotlinInlineMarkerRewriter extends CodeRewriterPass<AppInfo> {
+
+ private final DexType kotlinInlineMarkerType;
+ private final DexType kotlinMetadataType;
+
+ public KotlinInlineMarkerRewriter(AppView<AppInfo> appView) {
+ super(appView);
+ this.kotlinInlineMarkerType =
+ appView.dexItemFactory().createType("Lkotlin/jvm/internal/InlineMarker;");
+ this.kotlinMetadataType = appView.dexItemFactory().kotlinMetadataType;
+ }
+
+ @Override
+ protected String getRewriterId() {
+ return "KotlinInlineMarkerRewriter";
+ }
+
+ @Override
+ protected boolean shouldRewriteCode(IRCode code, MethodProcessor methodProcessor) {
+ return options.isGeneratingDex()
+ && code.context().getHolder().annotations().hasAnnotation(kotlinMetadataType);
+ }
+
+ @Override
+ protected CodeRewriterResult rewriteCode(IRCode code) {
+ boolean changed = false;
+ for (BasicBlock block : code.getBlocks()) {
+ InstructionListIterator instructionIterator = block.listIterator(code);
+ while (instructionIterator.hasNext()) {
+ InvokeStatic invoke = instructionIterator.next().asInvokeStatic();
+ if (invoke != null
+ && invoke.getInvokedMethod().getHolderType().isIdenticalTo(kotlinInlineMarkerType)) {
+ instructionIterator.removeOrReplaceByDebugLocalRead();
+ changed = true;
+ }
+ }
+ }
+ return CodeRewriterResult.hasChanged(changed);
+ }
+}