diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/CommonBackendContext.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/CommonBackendContext.kt index f7d3a26b368..8593f9b04ac 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/CommonBackendContext.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/CommonBackendContext.kt @@ -61,4 +61,7 @@ interface CommonBackendContext : BackendContext, LoggingContext { val inductionVariableOrigin: IrDeclarationOrigin get() = IrDeclarationOrigin.IR_TEMPORARY_VARIABLE + + val optimizeLoopsOverUnsignedArrays: Boolean + get() = false } 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 978ba13979c..5c1aaaf61fc 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 @@ -72,7 +72,10 @@ abstract class IndexedGetIterationHandler( /** Builds a [HeaderInfo] for arrays. */ internal class ArrayIterationHandler(context: CommonBackendContext) : IndexedGetIterationHandler(context, canCacheLast = true) { - override fun matchIterable(expression: IrExpression) = expression.type.run { isArray() || isPrimitiveArray() || isUnsignedArray() } + private val supportsUnsignedArrays = context.optimizeLoopsOverUnsignedArrays + + override fun matchIterable(expression: IrExpression) = + expression.type.run { isArray() || isPrimitiveArray() || (supportsUnsignedArrays && isUnsignedArray()) } override val IrType.sizePropertyGetter get() = getClass()!!.getPropertyGetter("size")!!.owner diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/loops/handlers/IndicesHandlers.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/loops/handlers/IndicesHandlers.kt index 484d2f49fc3..aa1b0d6f970 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/loops/handlers/IndicesHandlers.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/loops/handlers/IndicesHandlers.kt @@ -76,9 +76,14 @@ internal class CollectionIndicesHandler(context: CommonBackendContext) : Indices } internal class ArrayIndicesHandler(context: CommonBackendContext) : IndicesHandler(context) { + private val supportsUnsignedArrays = context.optimizeLoopsOverUnsignedArrays override val matcher = SimpleCalleeMatcher { - extensionReceiver { it != null && it.type.run { isArray() || isPrimitiveArray() || isUnsignedArray() } } + extensionReceiver { + it != null && it.type.run { + isArray() || isPrimitiveArray() || (supportsUnsignedArrays && isUnsignedArray()) + } + } fqName { it == FqName("kotlin.collections.") } parameterCount { it == 0 } } diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/loops/handlers/WithIndexHandler.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/loops/handlers/WithIndexHandler.kt index b684f832e39..196c0dfd56b 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/loops/handlers/WithIndexHandler.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/loops/handlers/WithIndexHandler.kt @@ -26,12 +26,19 @@ import org.jetbrains.kotlin.name.FqName internal class WithIndexHandler(context: CommonBackendContext, private val visitor: NestedHeaderInfoBuilderForWithIndex) : HeaderInfoFromCallHandler { + private val supportsUnsignedArrays = context.optimizeLoopsOverUnsignedArrays + // Use Quantifier.ANY so we can handle all `withIndex()` calls in the same manner. override val matcher = createIrCallMatcher(Quantifier.ANY) { callee { fqName { it == FqName("kotlin.collections.withIndex") } - extensionReceiver { it != null && it.type.run { isArray() || isPrimitiveArray() || isUnsignedArray() || isIterable() } } + extensionReceiver { + it != null && it.type.run { + isArray() || isPrimitiveArray() || isIterable() || + (supportsUnsignedArrays && isUnsignedArray()) + } + } parameterCount { it == 0 } } callee { diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendContext.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendContext.kt index 08fcf2f22e4..a5b53930a3a 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendContext.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendContext.kt @@ -215,6 +215,9 @@ class JvmBackendContext( override val preferJavaLikeCounterLoop: Boolean get() = true + override val optimizeLoopsOverUnsignedArrays: Boolean + get() = true + override val doWhileCounterLoopOrigin: IrStatementOrigin get() = JvmLoweredStatementOrigin.DO_WHILE_COUNTER_LOOP