From 721ee18a641208174e5b8cd3458d89ecbc8ec086 Mon Sep 17 00:00:00 2001 From: LepilkinaElena Date: Thu, 26 Dec 2019 16:15:21 +0300 Subject: [PATCH] Limit stack allocation only for array read operations with connection between return value and array (#3728) --- .../konan/optimizations/LocalEscapeAnalysis.kt | 6 ++++-- backend.native/tests/build.gradle | 5 +++++ .../tests/runtime/collections/stack_array.kt | 17 +++++++++++++++++ 3 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 backend.native/tests/runtime/collections/stack_array.kt diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/LocalEscapeAnalysis.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/LocalEscapeAnalysis.kt index edc3b4adcfd..1ce38ef15aa 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/LocalEscapeAnalysis.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/LocalEscapeAnalysis.kt @@ -134,8 +134,10 @@ internal object LocalEscapeAnalysis { } } is DataFlowIR.Node.ArrayRead -> { - // If element of array escapes then array also should escape. - connectObjects(node, node.array.node) + // If element of array(return value) points to array(this value) and escapes then array also should escape. + if (((node.callee.pointsTo?.elementAtOrNull(node.callee.parameters.size) ?: 0) and (1 shl 0)) != 0) { + connectObjects(node, node.array.node) + } } } } diff --git a/backend.native/tests/build.gradle b/backend.native/tests/build.gradle index e707c63942a..b7f080ecaae 100644 --- a/backend.native/tests/build.gradle +++ b/backend.native/tests/build.gradle @@ -1789,6 +1789,11 @@ task BitSet(type: KonanLocalTest) { source = "runtime/collections/BitSet.kt" } +task stack_array(type: KonanLocalTest) { + goldValue = "true\n3\n" + source = "runtime/collections/stack_array.kt" +} + task array0(type: KonanLocalTest) { goldValue = "5\n6\n7\n8\n9\n10\n11\n12\n13\n" source = "runtime/collections/array0.kt" diff --git a/backend.native/tests/runtime/collections/stack_array.kt b/backend.native/tests/runtime/collections/stack_array.kt new file mode 100644 index 00000000000..d68d3ad529a --- /dev/null +++ b/backend.native/tests/runtime/collections/stack_array.kt @@ -0,0 +1,17 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the LICENSE file. + */ + +package runtime.collections.stack_array + +import kotlin.test.* + +@Test fun runTest() { + val array = IntArray(2) + array[0] = 1 + array[1] = 2 + val check = array is IntArray + println(check) + println(array[0] + array[1]) +} \ No newline at end of file