From 3b5c16076ed47b4beece8187c37d5be2d83fe23e Mon Sep 17 00:00:00 2001 From: Konstantin Anisimov Date: Mon, 20 Feb 2017 16:52:07 +0700 Subject: [PATCH 1/4] TESTS: New tests added --- backend.native/tests/build.gradle | 15 +++++++++++++++ backend.native/tests/codegen/inline/inline15.kt | 17 +++++++++++++++++ backend.native/tests/codegen/inline/inline16.kt | 17 +++++++++++++++++ backend.native/tests/codegen/inline/inline17.kt | 12 ++++++++++++ 4 files changed, 61 insertions(+) create mode 100644 backend.native/tests/codegen/inline/inline15.kt create mode 100644 backend.native/tests/codegen/inline/inline16.kt create mode 100644 backend.native/tests/codegen/inline/inline17.kt diff --git a/backend.native/tests/build.gradle b/backend.native/tests/build.gradle index 5bdbd5bf7d0..54b43daffbc 100644 --- a/backend.native/tests/build.gradle +++ b/backend.native/tests/build.gradle @@ -1232,6 +1232,21 @@ task inline14(type: RunKonanTest) { source = "codegen/inline/inline14.kt" } +task inline15(type: RunKonanTest) { + goldValue = "4\n" + source = "codegen/inline/inline15.kt" +} + +//task inline16(type: RunKonanTest) { +// goldValue = "false\n" +// source = "codegen/inline/inline16.kt" +//} + +task inline17(type: RunKonanTest) { + goldValue = "[1, 2]\n" + source = "codegen/inline/inline17.kt" +} + kotlinNativeInterop { sysstat { pkg 'sysstat' diff --git a/backend.native/tests/codegen/inline/inline15.kt b/backend.native/tests/codegen/inline/inline15.kt new file mode 100644 index 00000000000..3891f0d3102 --- /dev/null +++ b/backend.native/tests/codegen/inline/inline15.kt @@ -0,0 +1,17 @@ +@Suppress("NOTHING_TO_INLINE") +inline fun foo2(i1: Int): Int { + return i1 + 1 +} + +@Suppress("NOTHING_TO_INLINE") +inline fun foo1(i1: Int, body: (Int) -> Int): Int { + return body(i1) +} + +fun bar(i0: Int): Int { + return foo1(i0) { foo2(it) + 1 } +} + +fun main(args: Array) { + println(bar(2).toString()) +} diff --git a/backend.native/tests/codegen/inline/inline16.kt b/backend.native/tests/codegen/inline/inline16.kt new file mode 100644 index 00000000000..9c5255ea714 --- /dev/null +++ b/backend.native/tests/codegen/inline/inline16.kt @@ -0,0 +1,17 @@ +@Suppress("NOTHING_TO_INLINE") +inline fun > foo(destination: C, predicate: (T) -> Boolean): C { + for (element in destination) { + val value = element as T + if (!predicate(value)) destination.add(value) + } + return destination +} + +fun bar(): Boolean { + val result = foo > (mutableListOf(1, 2, 3)) { true } + return result.isEmpty() +} + +fun main(args: Array) { + println(bar().toString()) +} diff --git a/backend.native/tests/codegen/inline/inline17.kt b/backend.native/tests/codegen/inline/inline17.kt new file mode 100644 index 00000000000..1de814adfc4 --- /dev/null +++ b/backend.native/tests/codegen/inline/inline17.kt @@ -0,0 +1,12 @@ +@Suppress("NOTHING_TO_INLINE") +inline fun foo(i1: T, i2: T): List { + return listOf(i1, i2) +} + +fun bar(): List { + return foo (1, 2) +} + +fun main(args: Array) { + println(bar().toString()) +} From a71cd69f728ecac2776fc87d111106d629dc11f4 Mon Sep 17 00:00:00 2001 From: Konstantin Anisimov Date: Mon, 20 Feb 2017 16:52:47 +0700 Subject: [PATCH 2/4] Kotlin methods are excluded from inlining --- .../backend/konan/lower/FunctionInlining.kt | 26 +++++++++++++------ 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/FunctionInlining.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/FunctionInlining.kt index 5a9ddfee787..ac0d5c8eca1 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/FunctionInlining.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/FunctionInlining.kt @@ -6,7 +6,7 @@ import org.jetbrains.kotlin.backend.konan.ir.IrInlineFunctionBody import org.jetbrains.kotlin.backend.konan.ir.getArguments import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.ParameterDescriptor -import org.jetbrains.kotlin.descriptors.impl.TypeParameterDescriptorImpl +import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.builders.Scope @@ -21,7 +21,6 @@ import org.jetbrains.kotlin.ir.util.DeepCopyIrTree import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.types.KotlinType - //-----------------------------------------------------------------------------// internal class FunctionInlining(val context: Context): IrElementTransformerVoid() { @@ -30,6 +29,15 @@ internal class FunctionInlining(val context: Context): IrElementTransformerVoid( //-------------------------------------------------------------------------// + var fqName: String? = null + override fun visitFile(declaration: IrFile): IrFile { + fqName = declaration.packageFragmentDescriptor.fqName.asString() + println("akm_inline $fqName") + return super.visitFile(declaration) + } + + //-------------------------------------------------------------------------// + fun isLambdaExpression(expression: IrExpression) : Boolean { if (expression !is IrContainerExpressionBase) return false if (expression.origin != IrStatementOrigin.LAMBDA) return false @@ -68,7 +76,6 @@ internal class FunctionInlining(val context: Context): IrElementTransformerVoid( .functions[functionDescriptor.original] // Get FunctionDeclaration by FunctionDescriptor. if (functionDeclaration == null) return super.visitCall(irCall) // Function is declared in another module. - val copyFuncDeclaration = functionDeclaration.accept(DeepCopyIrTree(), // Create copy of the function. null) as IrFunction @@ -84,16 +91,18 @@ internal class FunctionInlining(val context: Context): IrElementTransformerVoid( inlineBody.accept(lambdaInliner, null) val transformer = ParametersTransformer(parameters, irCall) inlineBody.accept(transformer, null) // Replace parameters with expression. - return inlineBody + return super.visitBlock(inlineBody) } //-------------------------------------------------------------------------// override fun visitCall(expression: IrCall): IrExpression { - val functionDescriptor = expression.descriptor as FunctionDescriptor - if (!functionDescriptor.name.asString().contains("foo")) return super.visitCall(expression) + if(fqName!!.contains("kotlin")) return super.visitCall(expression) + + val functionDescriptor = expression.descriptor as FunctionDescriptor if (functionDescriptor.isInline) return inlineFunction(expression) // Return newly created IrInlineBody instead of IrCall. + return super.visitCall(expression) } @@ -194,8 +203,9 @@ internal class ParametersTransformer(val parameterToArgument: List Date: Mon, 20 Feb 2017 16:55:57 +0700 Subject: [PATCH 3/4] Test output removed --- .../org/jetbrains/kotlin/backend/konan/lower/FunctionInlining.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/FunctionInlining.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/FunctionInlining.kt index ac0d5c8eca1..eb28182e540 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/FunctionInlining.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/FunctionInlining.kt @@ -32,7 +32,6 @@ internal class FunctionInlining(val context: Context): IrElementTransformerVoid( var fqName: String? = null override fun visitFile(declaration: IrFile): IrFile { fqName = declaration.packageFragmentDescriptor.fqName.asString() - println("akm_inline $fqName") return super.visitFile(declaration) } From bf0fc7ec03e96a6fdec784a75fe929790431df69 Mon Sep 17 00:00:00 2001 From: Konstantin Anisimov Date: Tue, 21 Feb 2017 16:14:30 +0700 Subject: [PATCH 4/4] Test excluded using "disable" directive --- backend.native/tests/build.gradle | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/backend.native/tests/build.gradle b/backend.native/tests/build.gradle index 54b43daffbc..a732998989b 100644 --- a/backend.native/tests/build.gradle +++ b/backend.native/tests/build.gradle @@ -1237,10 +1237,11 @@ task inline15(type: RunKonanTest) { source = "codegen/inline/inline15.kt" } -//task inline16(type: RunKonanTest) { -// goldValue = "false\n" -// source = "codegen/inline/inline16.kt" -//} +task inline16(type: RunKonanTest) { + disabled = true + goldValue = "false\n" + source = "codegen/inline/inline16.kt" +} task inline17(type: RunKonanTest) { goldValue = "[1, 2]\n"