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);
+  }
+}