Move `ReflectiveAccessLowering` in the very end of the lowerings list
diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/JvmLoweringPhases.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/JvmLoweringPhases.kt
index 281b56d..acfd5c0 100644
--- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/JvmLoweringPhases.kt
+++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/JvmLoweringPhases.kt
@@ -78,7 +78,6 @@
     ::JvmDefaultParameterCleaner,
 
     ::FragmentLocalFunctionPatchLowering,
-    ::ReflectiveAccessLowering,
 
     ::InterfaceLowering,
     ::InheritedDefaultMethodsOnClassesLowering,
@@ -122,6 +121,8 @@
     ::RenameFieldsLowering,
     ::FakeLocalVariablesForBytecodeInlinerLowering,
     ::FakeLocalVariablesForIrInlinerLowering,
+
+    ::ReflectiveAccessLowering,
 )
 
 val jvmLoweringPhases = SameTypeNamedCompilerPhase(
diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/SyntheticAccessorLowering.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/SyntheticAccessorLowering.kt
index 9399c23..c8774a3 100644
--- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/SyntheticAccessorLowering.kt
+++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/SyntheticAccessorLowering.kt
@@ -14,6 +14,7 @@
 import org.jetbrains.kotlin.backend.jvm.ir.findInlineCallSites
 import org.jetbrains.kotlin.backend.jvm.ir.isAssertionsDisabledField
 import org.jetbrains.kotlin.backend.jvm.ir.receiverAndArgs
+import org.jetbrains.kotlin.backend.jvm.lower.SyntheticAccessorLowering.Companion.isAccessible
 import org.jetbrains.kotlin.codegen.AsmUtil
 import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
 import org.jetbrains.kotlin.ir.IrStatement
@@ -163,6 +164,8 @@
         }
 
         val accessor = when {
+            shouldGenerateReflectiveAccess(expression, withSuper) ->
+                return super.visitFunctionAccess(expression)
             callee is IrConstructor && accessorGenerator.isOrShouldBeHiddenAsSealedClassConstructor(callee) ->
                 accessorGenerator.getSyntheticConstructorOfSealedClass(callee).symbol
             callee is IrConstructor && accessorGenerator.isOrShouldBeHiddenSinceHasMangledParams(callee) ->
@@ -176,6 +179,21 @@
         return super.visitExpression(modifyFunctionAccessExpression(expression, accessor))
     }
 
+    private fun shouldGenerateReflectiveAccess(expression: IrFunctionAccessExpression, withSuper: Boolean) =
+        when {
+            context.evaluatorData == null -> false
+            expression is IrCall -> !expression.symbol.isAccessibleWithoutReflection(withSuper)
+            expression is IrConstructorCall -> !expression.symbol.isAccessibleWithoutReflection(false)
+            else -> false
+        }
+
+    private fun shouldGenerateReflectiveAccess(symbol: IrSymbol): Boolean {
+        return context.evaluatorData != null && !symbol.isAccessibleWithoutReflection(withSuper = false)
+    }
+
+    private fun IrSymbol.isAccessibleWithoutReflection(withSuper: Boolean) =
+        isAccessible(context, currentScope, inlineScopeResolver, withSuper, null, fromOtherClassLoader = true)
+
     private fun handleLambdaMetafactoryIntrinsic(call: IrCall, thisSymbol: IrClassSymbol?): IrExpression {
         val implFunRef = call.getValueArgument(1) as? IrFunctionReference
             ?: throw AssertionError("'implMethodReference' is expected to be 'IrFunctionReference': ${call.dump()}")
@@ -239,6 +257,10 @@
             return super.visitExpression(expression)
         }
 
+        if (shouldGenerateReflectiveAccess(expression.symbol)) {
+            return super.visitExpression(expression)
+        }
+
         return super.visitExpression(
             modifyGetterExpression(
                 expression, accessorGenerator.getSyntheticGetter(expression, allScopes).save()
@@ -255,6 +277,10 @@
             return super.visitExpression(expression)
         }
 
+        if (shouldGenerateReflectiveAccess(expression.symbol)) {
+            return super.visitExpression(expression)
+        }
+
         val dispatchReceiverType = expression.receiver?.type
         val dispatchReceiverClassSymbol = dispatchReceiverType?.classifierOrNull as? IrClassSymbol
         if (expression.symbol.isAccessible(false, dispatchReceiverClassSymbol)) {