[K/N][IR] Supported loop over unsigned array, indices, withIndex
This commit is contained in:
+2
@@ -216,6 +216,8 @@ internal class Context(config: KonanConfig) : KonanBackendContext(config) {
|
||||
|
||||
override val internalPackageFqn: FqName = RuntimeNames.kotlinNativeInternalPackageName
|
||||
|
||||
override val optimizeLoopsOverUnsignedArrays = true
|
||||
|
||||
val phaseConfig = config.phaseConfig
|
||||
|
||||
private val packageScope by lazy { builtIns.builtInsModule.getPackage(KonanFqNames.internalPackageName).memberScope }
|
||||
|
||||
+21
-20
@@ -7,8 +7,8 @@ package org.jetbrains.kotlin.backend.konan.ir
|
||||
|
||||
import org.jetbrains.kotlin.backend.common.ir.copyTo
|
||||
import org.jetbrains.kotlin.backend.common.ir.createDispatchReceiverParameter
|
||||
import org.jetbrains.kotlin.backend.konan.*
|
||||
import org.jetbrains.kotlin.backend.konan.KonanBackendContext
|
||||
import org.jetbrains.kotlin.backend.konan.KonanFqNames
|
||||
import org.jetbrains.kotlin.backend.konan.descriptors.getAnnotationStringValue
|
||||
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
@@ -18,9 +18,8 @@ import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
|
||||
import org.jetbrains.kotlin.ir.declarations.addMember
|
||||
import org.jetbrains.kotlin.ir.expressions.impl.IrConstImpl
|
||||
import org.jetbrains.kotlin.ir.symbols.impl.IrSimpleFunctionSymbolImpl
|
||||
import org.jetbrains.kotlin.ir.util.deepCopyWithSymbols
|
||||
import org.jetbrains.kotlin.ir.util.functions
|
||||
import org.jetbrains.kotlin.ir.util.isAnnotationWithEqualFqName
|
||||
import org.jetbrains.kotlin.ir.types.defaultType
|
||||
import org.jetbrains.kotlin.ir.util.*
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.util.OperatorNameConventions
|
||||
|
||||
@@ -28,7 +27,7 @@ import org.jetbrains.kotlin.util.OperatorNameConventions
|
||||
internal class FunctionsWithoutBoundCheckGenerator(val context: KonanBackendContext) {
|
||||
private val symbols = context.ir.symbols
|
||||
|
||||
private fun generateFunction(baseFunction: IrSimpleFunction, functionName: Name) =
|
||||
private fun generateFunction(baseFunction: IrSimpleFunction, delegatingToFunction: IrSimpleFunction?, functionName: Name) =
|
||||
context.irFactory.createFunction(
|
||||
baseFunction.startOffset, baseFunction.endOffset,
|
||||
IrDeclarationOrigin.GENERATED_SETTER_GETTER,
|
||||
@@ -37,20 +36,20 @@ internal class FunctionsWithoutBoundCheckGenerator(val context: KonanBackendCont
|
||||
DescriptorVisibilities.PUBLIC,
|
||||
Modality.FINAL,
|
||||
baseFunction.returnType,
|
||||
isInline = baseFunction.isInline,
|
||||
isExternal = baseFunction.isExternal,
|
||||
isTailrec = baseFunction.isTailrec,
|
||||
isSuspend = baseFunction.isSuspend,
|
||||
isExpect = baseFunction.isExpect,
|
||||
isFakeOverride = baseFunction.isFakeOverride,
|
||||
isOperator = baseFunction.isOperator,
|
||||
isInfix = baseFunction.isInfix
|
||||
isInline = false,
|
||||
isExternal = true,
|
||||
isTailrec = false,
|
||||
isSuspend = false,
|
||||
isExpect = false,
|
||||
isFakeOverride = false,
|
||||
isOperator = false,
|
||||
isInfix = false
|
||||
).also { function ->
|
||||
function.parent = baseFunction.parent
|
||||
function.createDispatchReceiverParameter()
|
||||
function.valueParameters = baseFunction.valueParameters.map { it.copyTo(function) }
|
||||
// Copy annotations.
|
||||
val setWithoutBEAnnotations = baseFunction.annotations.map { annotation ->
|
||||
val setWithoutBEAnnotations = (delegatingToFunction ?: baseFunction).annotations.map { annotation ->
|
||||
annotation.deepCopyWithSymbols().also { copy ->
|
||||
if (copy.isAnnotationWithEqualFqName(KonanFqNames.gcUnsafeCall)) {
|
||||
val value = "${annotation.getAnnotationStringValue("callee")}_without_BoundCheck"
|
||||
@@ -62,15 +61,17 @@ internal class FunctionsWithoutBoundCheckGenerator(val context: KonanBackendCont
|
||||
function.annotations = setWithoutBEAnnotations
|
||||
}
|
||||
|
||||
|
||||
fun generate() {
|
||||
val arraysClasses = symbols.primitiveTypesToPrimitiveArrays.values + symbols.array
|
||||
arraysClasses.forEach { classSymbol ->
|
||||
symbols.arrays.forEach { classSymbol ->
|
||||
val underlyingClass = (classSymbol.defaultType.computeBinaryType() as BinaryType.Reference)
|
||||
.types.single().takeIf { classSymbol.owner.isInline }
|
||||
val setFunction = classSymbol.owner.functions.single { it.name == OperatorNameConventions.SET }
|
||||
classSymbol.owner.addMember(generateFunction(setFunction, KonanNameConventions.setWithoutBoundCheck))
|
||||
val setDelegatingToFunction = underlyingClass?.functions?.single { it.name == OperatorNameConventions.SET }
|
||||
classSymbol.owner.addMember(generateFunction(setFunction, setDelegatingToFunction, KonanNameConventions.setWithoutBoundCheck))
|
||||
|
||||
val getFunction = classSymbol.owner.functions.single { it.descriptor.name == OperatorNameConventions.GET }
|
||||
classSymbol.owner.addMember(generateFunction(getFunction, KonanNameConventions.getWithoutBoundCheck))
|
||||
val getFunction = classSymbol.owner.functions.single { it.name == OperatorNameConventions.GET }
|
||||
val getDelegatingToFunction = underlyingClass?.functions?.single { it.name == OperatorNameConventions.GET }
|
||||
classSymbol.owner.addMember(generateFunction(getFunction, getDelegatingToFunction, KonanNameConventions.getWithoutBoundCheck))
|
||||
}
|
||||
}
|
||||
}
|
||||
+2
-5
@@ -16,10 +16,7 @@ import org.jetbrains.kotlin.ir.symbols.IrValueSymbol
|
||||
import org.jetbrains.kotlin.ir.types.IrType
|
||||
import org.jetbrains.kotlin.ir.types.getClass
|
||||
import org.jetbrains.kotlin.ir.types.isArray
|
||||
import org.jetbrains.kotlin.ir.util.IdSignature
|
||||
import org.jetbrains.kotlin.ir.util.functions
|
||||
import org.jetbrains.kotlin.ir.util.getPropertyGetter
|
||||
import org.jetbrains.kotlin.ir.util.isPrimitiveArray
|
||||
import org.jetbrains.kotlin.ir.util.*
|
||||
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
|
||||
import org.jetbrains.kotlin.util.OperatorNameConventions
|
||||
|
||||
@@ -73,7 +70,7 @@ class KonanBCEForLoopBodyTransformer : ForLoopBodyTransformer() {
|
||||
}
|
||||
}
|
||||
|
||||
private fun IrType.isBasicArray() = isPrimitiveArray() || isArray()
|
||||
private fun IrType.isBasicArray() = isPrimitiveArray() || isArray() || isUnsignedArray()
|
||||
|
||||
private fun IrCall.isGetSizeCall() = dispatchReceiver?.type?.isBasicArray() == true &&
|
||||
symbol.owner == dispatchReceiver!!.type.getClass()!!.getPropertyGetter("size")!!.owner
|
||||
|
||||
Reference in New Issue
Block a user