[BIR] Remove all additional caching implemented in lowering phases
diff --git a/compiler/ir/bir/backend/src/org/jetbrains/kotlin/bir/backend/lower/BirJvmNameLowering.kt b/compiler/ir/bir/backend/src/org/jetbrains/kotlin/bir/backend/lower/BirJvmNameLowering.kt
index 7115e73..f22af37 100644
--- a/compiler/ir/bir/backend/src/org/jetbrains/kotlin/bir/backend/lower/BirJvmNameLowering.kt
+++ b/compiler/ir/bir/backend/src/org/jetbrains/kotlin/bir/backend/lower/BirJvmNameLowering.kt
@@ -16,6 +16,7 @@
 import org.jetbrains.kotlin.bir.expressions.BirConstructorCall
 import org.jetbrains.kotlin.bir.set
 import org.jetbrains.kotlin.bir.util.constructedClass
+import org.jetbrains.kotlin.bir.util.isAnnotation
 import org.jetbrains.kotlin.codegen.inline.coroutines.FOR_INLINE_SUFFIX
 import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
 import org.jetbrains.kotlin.ir.types.impl.IrErrorClassImpl.origin
@@ -24,10 +25,8 @@
 
 context(JvmBirBackendContext)
 class BirJvmNameLowering : BirLoweringPhase() {
-    private val JvmNameAnnotation by lz { birBuiltIns.findClass(DescriptorUtils.JVM_NAME) }
-
     private val jvmNameAnnotations = registerIndexKey(BirConstructorCall, false) {
-        it.constructedClass == JvmNameAnnotation
+        it.isAnnotation(DescriptorUtils.JVM_NAME)
     }
 
     override fun lower(module: BirModuleFragment) {
diff --git a/compiler/ir/bir/backend/src/org/jetbrains/kotlin/bir/backend/lower/BirJvmOverloadsAnnotationLowering.kt b/compiler/ir/bir/backend/src/org/jetbrains/kotlin/bir/backend/lower/BirJvmOverloadsAnnotationLowering.kt
index 4338b1b..f5eb92f 100644
--- a/compiler/ir/bir/backend/src/org/jetbrains/kotlin/bir/backend/lower/BirJvmOverloadsAnnotationLowering.kt
+++ b/compiler/ir/bir/backend/src/org/jetbrains/kotlin/bir/backend/lower/BirJvmOverloadsAnnotationLowering.kt
@@ -19,10 +19,8 @@
 
 context(JvmBirBackendContext)
 class BirJvmOverloadsAnnotationLowering : BirLoweringPhase() {
-    private val JvmOverloadsAnnotation by lz { birBuiltIns.findClass(JvmStandardClassIds.JVM_OVERLOADS_FQ_NAME) }
-
     private val overloadsAnnotations = registerIndexKey(BirConstructorCall, false) {
-        it.constructedClass == JvmOverloadsAnnotation
+        it.isAnnotation(JvmStandardClassIds.JVM_OVERLOADS_FQ_NAME)
     }
 
     override fun lower(module: BirModuleFragment) {
diff --git a/compiler/ir/bir/backend/src/org/jetbrains/kotlin/bir/backend/lower/BirJvmStaticInObjectLowering.kt b/compiler/ir/bir/backend/src/org/jetbrains/kotlin/bir/backend/lower/BirJvmStaticInObjectLowering.kt
index f46d071..06d3b99 100644
--- a/compiler/ir/bir/backend/src/org/jetbrains/kotlin/bir/backend/lower/BirJvmStaticInObjectLowering.kt
+++ b/compiler/ir/bir/backend/src/org/jetbrains/kotlin/bir/backend/lower/BirJvmStaticInObjectLowering.kt
@@ -28,13 +28,10 @@
 
 context(JvmBirBackendContext)
 class BirJvmStaticInObjectLowering : BirLoweringPhase() {
-    private val JvmStaticAnnotation by lz { birBuiltIns.findClass(JVM_STATIC_ANNOTATION_FQ_NAME) }
-
     private val staticDeclarations = registerIndexKey<BirDeclaration>(BirSimpleFunction or BirProperty, true) { declaration ->
-        val annotation = JvmStaticAnnotation ?: return@registerIndexKey false
-        declaration.hasAnnotation(annotation) ||
-                (declaration as? BirSimpleFunction)?.correspondingPropertySymbol?.owner?.hasAnnotation(annotation) == true ||
-                (declaration as? BirProperty)?.getter?.hasAnnotation(annotation) == true
+        declaration.hasAnnotation(JVM_STATIC_ANNOTATION_FQ_NAME) ||
+                (declaration as? BirSimpleFunction)?.correspondingPropertySymbol?.owner?.hasAnnotation(JVM_STATIC_ANNOTATION_FQ_NAME) == true ||
+                (declaration as? BirProperty)?.getter?.hasAnnotation(JVM_STATIC_ANNOTATION_FQ_NAME) == true
     }
     private val memberAccesses =
         registerBackReferencesKeyWithUntypedSymbolProperty(BirMemberAccessExpression, BirMemberAccessExpression<*>::symbol)
diff --git a/compiler/ir/bir/backend/src/org/jetbrains/kotlin/bir/backend/lower/BirPolymorphicSignatureLowering.kt b/compiler/ir/bir/backend/src/org/jetbrains/kotlin/bir/backend/lower/BirPolymorphicSignatureLowering.kt
index 18878d4..8e35424 100644
--- a/compiler/ir/bir/backend/src/org/jetbrains/kotlin/bir/backend/lower/BirPolymorphicSignatureLowering.kt
+++ b/compiler/ir/bir/backend/src/org/jetbrains/kotlin/bir/backend/lower/BirPolymorphicSignatureLowering.kt
@@ -29,10 +29,8 @@
 
 context(JvmBirBackendContext)
 class BirPolymorphicSignatureLowering : BirLoweringPhase() {
-    private val PolymorphicSignatureAnnotation by lz { birBuiltIns.findClass(PolymorphicSignatureCallChecker.polymorphicSignatureFqName) }
-
     private val polymorphicFunctions = registerIndexKey(BirSimpleFunction, true) { function ->
-        PolymorphicSignatureAnnotation?.let { function.hasAnnotation(it) } == true
+        function.hasAnnotation(PolymorphicSignatureCallChecker.polymorphicSignatureFqName)
     }
     private val functionCalls = registerBackReferencesKey(BirCall, BirCall::symbol)
 
diff --git a/compiler/ir/bir/backend/src/org/jetbrains/kotlin/bir/backend/lower/BirRepeatedAnnotationLowering.kt b/compiler/ir/bir/backend/src/org/jetbrains/kotlin/bir/backend/lower/BirRepeatedAnnotationLowering.kt
index a5cc393..97ff24e 100644
--- a/compiler/ir/bir/backend/src/org/jetbrains/kotlin/bir/backend/lower/BirRepeatedAnnotationLowering.kt
+++ b/compiler/ir/bir/backend/src/org/jetbrains/kotlin/bir/backend/lower/BirRepeatedAnnotationLowering.kt
@@ -30,9 +30,6 @@
 
 context(JvmBirBackendContext)
 class BirRepeatedAnnotationLowering : BirLoweringPhase() {
-    private val KotlinRepeatableAnnotation by lz { birBuiltIns.findClass(StandardNames.FqNames.repeatable) }
-    private val JavaRepeatableAnnotation by lz { birBuiltIns.findClass(JvmAnnotationNames.REPEATABLE_ANNOTATION)!! }
-
     private val declaredAnnotations = registerIndexKey(BirClass, false) {
         it.kind == ClassKind.ANNOTATION_CLASS
     }
@@ -45,8 +42,8 @@
     override fun lower(module: BirModuleFragment) {
         getAllElementsWithIndex(declaredAnnotations).forEach { annotationClass ->
             if (
-                KotlinRepeatableAnnotation?.let { annotationClass.hasAnnotation(it) } == true
-                && !annotationClass.hasAnnotation(JavaRepeatableAnnotation)
+                annotationClass.hasAnnotation(StandardNames.FqNames.repeatable)
+                && !annotationClass.hasAnnotation(JvmAnnotationNames.REPEATABLE_ANNOTATION)
             ) {
                 val repeatedAnnotationSyntheticContainer = createRepeatedAnnotationSyntheticContainer(annotationClass)
                 annotationClass.declarations += repeatedAnnotationSyntheticContainer
@@ -84,7 +81,7 @@
     }
 
     private fun getOrCreateContainerClass(annotationClass: BirClass): BirClass {
-        val jvmRepeatable = annotationClass.getAnnotation(JavaRepeatableAnnotation)
+        val jvmRepeatable = annotationClass.getAnnotation(JvmAnnotationNames.REPEATABLE_ANNOTATION)
         return if (jvmRepeatable != null) {
             val containerClassReference = jvmRepeatable.valueArguments[0]
             require(containerClassReference is BirClassReference) {
diff --git a/compiler/ir/bir/backend/src/org/jetbrains/kotlin/bir/backend/lower/BirVarargLowering.kt b/compiler/ir/bir/backend/src/org/jetbrains/kotlin/bir/backend/lower/BirVarargLowering.kt
index 298b633..a481444 100644
--- a/compiler/ir/bir/backend/src/org/jetbrains/kotlin/bir/backend/lower/BirVarargLowering.kt
+++ b/compiler/ir/bir/backend/src/org/jetbrains/kotlin/bir/backend/lower/BirVarargLowering.kt
@@ -12,7 +12,10 @@
 import org.jetbrains.kotlin.bir.backend.jvm.JvmBirBackendContext
 import org.jetbrains.kotlin.bir.backend.jvm.birArray
 import org.jetbrains.kotlin.bir.backend.jvm.birArrayOf
+import org.jetbrains.kotlin.bir.declarations.BirClass
+import org.jetbrains.kotlin.bir.declarations.BirFunction
 import org.jetbrains.kotlin.bir.declarations.BirModuleFragment
+import org.jetbrains.kotlin.bir.declarations.BirPackageFragment
 import org.jetbrains.kotlin.bir.expressions.*
 import org.jetbrains.kotlin.bir.types.utils.makeNotNull
 import org.jetbrains.kotlin.bir.types.utils.substitute
@@ -20,8 +23,15 @@
 import org.jetbrains.kotlin.builtins.PrimitiveType
 import org.jetbrains.kotlin.builtins.StandardNames
 import org.jetbrains.kotlin.builtins.UnsignedType
+import org.jetbrains.kotlin.ir.declarations.IrClass
+import org.jetbrains.kotlin.ir.declarations.IrFunction
+import org.jetbrains.kotlin.ir.declarations.IrPackageFragment
+import org.jetbrains.kotlin.ir.util.getPackageFragment
+import org.jetbrains.kotlin.ir.util.isVararg
 import org.jetbrains.kotlin.name.Name
 import org.jetbrains.kotlin.util.capitalizeDecapitalize.toLowerCaseAsciiOnly
+import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstance
+import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull
 
 context(JvmBirBackendContext)
 class BirVarargLowering : BirLoweringPhase() {
@@ -67,7 +77,7 @@
                 is BirExpression -> +element
                 is BirSpreadElement -> {
                     val spread = element.expression!!
-                    if (spread is BirFunctionAccessExpression && spread.symbol.owner in primitiveArrayOfFunctions) {
+                    if (spread is BirFunctionAccessExpression && spread.symbol.owner.isArrayOf()) {
                         // Skip empty arrays and don't copy immediately created arrays
                         val argument = spread.valueArguments[0] ?: continue
                         if (argument is BirVararg) {
@@ -84,17 +94,24 @@
 
     private fun BirElement.isInsideAnnotation(): Boolean =
         ancestors().takeWhile { it is BirExpression }.any { it is BirConstructorCall && it.isAnnotation }
-
-    private val primitiveArrayOfFunctions by lz {
-        (PrimitiveType.entries.map { type -> type.name } + UnsignedType.entries.map { type -> type.typeName.asString() })
-            .map { name -> name.toLowerCaseAsciiOnly() + "ArrayOf" }
-            .plus("arrayOf")
-            .flatMap { name -> birBuiltIns.findFunctions(Name.identifier(name), StandardNames.BUILT_INS_PACKAGE_FQ_NAME.asString()) }
-            .filter {
-                it.extensionReceiverParameter == null &&
-                        it.dispatchReceiverParameter == null &&
-                        it.valueParameters.size == 1 &&
-                        it.valueParameters[0].isVararg
-            }.toSet()
-    }
 }
+
+internal val PRIMITIVE_ARRAY_OF_NAMES: Set<String> =
+    (PrimitiveType.values().map { type -> type.name } + UnsignedType.values().map { type -> type.typeName.asString() })
+        .map { name -> name.toLowerCaseAsciiOnly() + "ArrayOf" }.toSet()
+
+internal const val ARRAY_OF_NAME = "arrayOf"
+
+internal fun BirFunction.isArrayOf(): Boolean {
+    val parent = ancestors().firstIsInstanceOrNull<BirPackageFragment>() ?: return false
+    return parent.packageFqName == StandardNames.BUILT_INS_PACKAGE_FQ_NAME &&
+            name.asString().let { it in PRIMITIVE_ARRAY_OF_NAMES || it == ARRAY_OF_NAME } &&
+            extensionReceiverParameter == null &&
+            dispatchReceiverParameter == null &&
+            valueParameters.size == 1 &&
+            valueParameters[0].isVararg
+}
+
+internal fun BirFunction.isEmptyArray(): Boolean =
+    name.asString() == "emptyArray" &&
+            (parent as? BirPackageFragment)?.packageFqName == StandardNames.BUILT_INS_PACKAGE_FQ_NAME