Commit
diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/IrBuiltInsOverFir.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/IrBuiltInsOverFir.kt
index e6d45f6d9..1b33f2f 100644
--- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/IrBuiltInsOverFir.kt
+++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/IrBuiltInsOverFir.kt
@@ -18,9 +18,11 @@
 import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider
 import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider
 import org.jetbrains.kotlin.fir.scopes.getFunctions
+import org.jetbrains.kotlin.fir.scopes.getProperties
 import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
 import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
 import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
+import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
 import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase
 import org.jetbrains.kotlin.fir.types.*
 import org.jetbrains.kotlin.ir.BuiltInOperatorNames
@@ -270,9 +272,8 @@
     override val floatIterator by lazy { primitiveIterator(PrimitiveType.FLOAT) }
     override val doubleIterator by lazy { primitiveIterator(PrimitiveType.DOUBLE) }
 
-    private fun loadPrimitiveArray(primitiveType: PrimitiveType): IrClassSymbol {
-        return loadClass(ClassId(StandardClassIds.BASE_KOTLIN_PACKAGE, Name.identifier("${primitiveType.typeName}Array")))
-    }
+    private fun loadPrimitiveArray(primitiveType: PrimitiveType): IrClassSymbol = loadClass(primitiveType.arrayClassId)
+
 
     override val booleanArray: IrClassSymbol by lazy { loadPrimitiveArray(PrimitiveType.BOOLEAN) }
     override val charArray: IrClassSymbol by lazy { loadPrimitiveArray(PrimitiveType.CHAR) }
diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/Ir.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/Ir.kt
index 9fe86bf..0478fbc 100644
--- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/Ir.kt
+++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/Ir.kt
@@ -10,6 +10,7 @@
 import org.jetbrains.kotlin.builtins.PrimitiveType
 import org.jetbrains.kotlin.builtins.StandardNames
 import org.jetbrains.kotlin.builtins.StandardNames.KOTLIN_REFLECT_FQ_NAME
+import org.jetbrains.kotlin.builtins.UnsignedArrayType
 import org.jetbrains.kotlin.ir.IrBuiltIns
 import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
 import org.jetbrains.kotlin.ir.symbols.IrClassifierSymbol
@@ -17,7 +18,9 @@
 import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
 import org.jetbrains.kotlin.ir.types.*
 import org.jetbrains.kotlin.ir.util.*
+import org.jetbrains.kotlin.name.ClassId
 import org.jetbrains.kotlin.name.Name
+import org.jetbrains.kotlin.name.StandardClassIds
 
 // This is what Context collects about IR.
 abstract class Ir<out T : CommonBackendContext>(val context: T) {
@@ -238,6 +241,35 @@
 
     open val arraysContentEquals: Map<IrType, IrSimpleFunctionSymbol>? = null
 
+    val arrayGetFunction: Map<ClassId, IrSimpleFunctionSymbol> =
+        buildMap {
+            fun putGetFunctionFor(classId: ClassId, name: String) {
+                val arrayClass = irBuiltIns.findClass(classId.shortClassName, classId.packageFqName) ?: return
+                val getFunction = arrayClass.getSimpleFunction(name) ?: return
+                put(classId, getFunction)
+            }
+
+            val defaultGetName = getWithoutBoundCheckName?.asString() ?: "get"
+            putGetFunctionFor(StandardClassIds.Array, defaultGetName)
+            PrimitiveType.entries.forEach { putGetFunctionFor(it.arrayClassId, defaultGetName) }
+            UnsignedArrayType.entries.forEach { putGetFunctionFor(it.classId, defaultGetName) }
+            putGetFunctionFor(StandardClassIds.List, "get")
+        }
+
+    val arraySizeGetters: Map<ClassId, IrSimpleFunctionSymbol> =
+        buildMap {
+            fun putSizeGetterFor(classId: ClassId) {
+                val arrayClass = irBuiltIns.findClass(classId.shortClassName, classId.packageFqName) ?: return
+                val sizeGetter = arrayClass.getPropertyGetter("size") ?: return
+                put(classId, sizeGetter)
+            }
+
+            putSizeGetterFor(StandardClassIds.Array)
+            PrimitiveType.entries.forEach { putSizeGetterFor(it.arrayClassId) }
+            UnsignedArrayType.entries.forEach { putSizeGetterFor(it.classId) }
+            putSizeGetterFor(StandardClassIds.List)
+        }
+
     companion object {
         fun isLateinitIsInitializedPropertyGetter(symbol: IrFunctionSymbol): Boolean =
             symbol is IrSimpleFunctionSymbol && symbol.owner.let { function ->
diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/loops/handlers/IndexedGetIterationHandlers.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/loops/handlers/IndexedGetIterationHandlers.kt
index 313c41e..f7de48f 100644
--- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/loops/handlers/IndexedGetIterationHandlers.kt
+++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/loops/handlers/IndexedGetIterationHandlers.kt
@@ -21,7 +21,6 @@
 import org.jetbrains.kotlin.ir.types.*
 import org.jetbrains.kotlin.ir.util.*
 import org.jetbrains.kotlin.name.FqName
-import org.jetbrains.kotlin.name.Name
 import org.jetbrains.kotlin.util.OperatorNameConventions
 
 /** Builds a [HeaderInfo] for iteration over iterables using the `get / []` operator and an index. */
@@ -50,7 +49,9 @@
                 expression, nameHint = "indexedObject"
             )
 
-            val last = irCall(expression.type.sizePropertyGetter).apply {
+            val sizePropertyGetter = expression.type.sizePropertyGetter ?: return null
+
+            val last = irCall(sizePropertyGetter).apply {
                 dispatchReceiver = irGet(objectVariable)
             }
 
@@ -65,7 +66,7 @@
             )
         }
 
-    abstract val IrType.sizePropertyGetter: IrSimpleFunction
+    abstract val IrType.sizePropertyGetter: IrSimpleFunction?
 
     abstract val IrType.getFunction: IrSimpleFunction
 }
@@ -83,27 +84,14 @@
                 callee.kotlinFqName == FqName("kotlin.collections.reversed")
     }
 
-    override val IrType.sizePropertyGetter
-        get() = getClass()!!.getPropertyGetter("size")!!.owner
+    override val IrType.sizePropertyGetter: IrSimpleFunction?
+        get() = context.ir.symbols.arraySizeGetters[getClass()!!.classId!!]?.owner
 
     private fun IrType.isArrayType() =
         isArray() || isPrimitiveArray() || (supportsUnsignedArrays && isUnsignedArray())
 
-    private val IrType.getFunctionName: Name
-        get() = context.ir.symbols.getWithoutBoundCheckName.let {
-            if (isArrayType() && it != null) {
-                it
-            } else {
-                OperatorNameConventions.GET
-            }
-        }
 
-    override val IrType.getFunction
-        get() = getClass()!!.functions.single {
-            it.name == getFunctionName &&
-                    it.valueParameters.size == 1 &&
-                    it.valueParameters[0].type.isInt()
-        }
+    override val IrType.getFunction get() = context.ir.symbols.arrayGetFunction[getClass()!!.classId!!]?.owner!!
 }
 
 /**
diff --git a/core/compiler.common/src/org/jetbrains/kotlin/builtins/PrimitiveType.kt b/core/compiler.common/src/org/jetbrains/kotlin/builtins/PrimitiveType.kt
index 025c51d..a2cbaa5 100644
--- a/core/compiler.common/src/org/jetbrains/kotlin/builtins/PrimitiveType.kt
+++ b/core/compiler.common/src/org/jetbrains/kotlin/builtins/PrimitiveType.kt
@@ -5,8 +5,10 @@
 
 package org.jetbrains.kotlin.builtins
 
+import org.jetbrains.kotlin.name.ClassId
 import org.jetbrains.kotlin.name.FqName
 import org.jetbrains.kotlin.name.Name
+import org.jetbrains.kotlin.name.StandardClassIds
 
 enum class PrimitiveType(typeName: String) {
     BOOLEAN("Boolean"),
@@ -27,6 +29,13 @@
 
     val arrayTypeFqName: FqName by lazy(LazyThreadSafetyMode.PUBLICATION) { StandardNames.BUILT_INS_PACKAGE_FQ_NAME.child(arrayTypeName) }
 
+    val arrayClassId by lazy(LazyThreadSafetyMode.PUBLICATION) {
+        ClassId(
+            StandardClassIds.BASE_KOTLIN_PACKAGE,
+            Name.identifier("${typeName}Array")
+        )
+    }
+
     companion object {
         @JvmField
         val NUMBER_TYPES = setOf(CHAR, BYTE, SHORT, INT, FLOAT, LONG, DOUBLE)