From f519150c080ae23bef361653c920960aa2cddeee Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Tue, 20 Apr 2021 19:02:49 +0300 Subject: [PATCH] JVM_IR KT-46189 lower tailrec functions after local declarations --- .../FirBlackBoxCodegenTestGenerated.java | 12 +++++ .../jetbrains/kotlin/backend/jvm/JvmLower.kt | 13 ++--- .../box/defaultArguments/kt36853_fibonacci.kt | 47 +++++++++++++++++++ .../codegen/box/defaultArguments/kt46189.kt | 16 +++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 12 +++++ .../IrBlackBoxCodegenTestGenerated.java | 12 +++++ .../LightAnalysisModeTestGenerated.java | 10 ++++ .../IrJsCodegenBoxES6TestGenerated.java | 10 ++++ .../IrJsCodegenBoxTestGenerated.java | 10 ++++ .../semantics/JsCodegenBoxTestGenerated.java | 10 ++++ .../IrCodegenBoxWasmTestGenerated.java | 10 ++++ 11 files changed, 156 insertions(+), 6 deletions(-) create mode 100644 compiler/testData/codegen/box/defaultArguments/kt36853_fibonacci.kt create mode 100644 compiler/testData/codegen/box/defaultArguments/kt46189.kt diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java index c1051f3024d..56749e8d276 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java @@ -12292,6 +12292,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/defaultArguments/kt36853.kt"); } + @Test + @TestMetadata("kt36853_fibonacci.kt") + public void testKt36853_fibonacci() throws Exception { + runTest("compiler/testData/codegen/box/defaultArguments/kt36853_fibonacci.kt"); + } + @Test @TestMetadata("kt36853_nestedObject.kt") public void testKt36853_nestedObject() throws Exception { @@ -12316,6 +12322,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/defaultArguments/kt36972_object.kt"); } + @Test + @TestMetadata("kt46189.kt") + public void testKt46189() throws Exception { + runTest("compiler/testData/codegen/box/defaultArguments/kt46189.kt"); + } + @Test @TestMetadata("kt6382.kt") public void testKt6382() throws Exception { diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt index aac40d055c7..966b5a2b564 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt @@ -266,7 +266,8 @@ private val syntheticAccessorPhase = makeIrFilePhase( private val tailrecPhase = makeIrFilePhase( ::JvmTailrecLowering, name = "Tailrec", - description = "Handle tailrec calls" + description = "Handle tailrec calls", + prerequisite = setOf(localDeclarationsPhase) ) private val kotlinNothingValueExceptionPhase = makeIrFilePhase( @@ -342,17 +343,13 @@ private val jvmFilePhases = listOf( propertiesPhase, remapObjectFieldAccesses, anonymousObjectSuperConstructorPhase, - tailrecPhase, - makePatchParentsPhase(1), - jvmStandardLibraryBuiltInsPhase, rangeContainsLoweringPhase, forLoopsPhase, collectionStubMethodLowering, jvmInlineClassPhase, - - makePatchParentsPhase(2), + makePatchParentsPhase(1), enumWhenPhase, singletonReferencesPhase, @@ -362,6 +359,10 @@ private val jvmFilePhases = listOf( returnableBlocksPhase, sharedVariablesPhase, localDeclarationsPhase, + + tailrecPhase, + makePatchParentsPhase(2), + jvmLocalClassExtractionPhase, staticCallableReferencePhase, diff --git a/compiler/testData/codegen/box/defaultArguments/kt36853_fibonacci.kt b/compiler/testData/codegen/box/defaultArguments/kt36853_fibonacci.kt new file mode 100644 index 00000000000..d612ba6108b --- /dev/null +++ b/compiler/testData/codegen/box/defaultArguments/kt36853_fibonacci.kt @@ -0,0 +1,47 @@ +// WITH_RUNTIME + +// IGNORE_BACKEND_FIR: JVM_IR +// java.lang.StackOverflowError +// at Nat$Companion$invoke$1.next(kt36853_fibonacci.kt:40) ... + +fun box(): String { + Nat( + nil = 0, + next = { this + 1 } + ).run { + val fib = fibonacci(10) + if (fib != 89) + return "Failed: $fib" + } + + return "OK" +} + +fun Nat.fibonacci( + n: T, + seed: Pair = nil to one, + fib: (Pair) -> Pair = { (a, b) -> b to a + b }, + i: T = nil, +): T = + if (i == n) fib(seed).first + else fibonacci(n = n, seed = fib(seed), i = i.next()) + + +tailrec fun Nat.plus(l: T, r: T, acc: T = l, i: T = nil): T = + if (i == r) acc else plus(l, r, acc.next(), i.next()) + +interface Nat { + val nil: T + val one: T get() = nil.next() + + fun T.next(): T + operator fun T.plus(t: T) = plus(this, t) + + companion object { + operator fun invoke(nil: T, next: T.() -> T): Nat = + object: Nat { + override val nil: T = nil + override fun T.next(): T = next() + } + } +} diff --git a/compiler/testData/codegen/box/defaultArguments/kt46189.kt b/compiler/testData/codegen/box/defaultArguments/kt46189.kt new file mode 100644 index 00000000000..001d0d20018 --- /dev/null +++ b/compiler/testData/codegen/box/defaultArguments/kt46189.kt @@ -0,0 +1,16 @@ +// IGNORE_BACKEND: WASM +// IGNORE_BACKEND: JS_IR + +class C + +fun box(): String = + C().foo("O") + +tailrec fun C.foo( + x: String, + f: (String) -> String = { bar(it) } +): String = + if (x.length < 2) foo(f(x)) else x + +fun C.bar(s: String): String = + s + "K" diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java index d663b424274..3323c8d3015 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java @@ -12292,6 +12292,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/defaultArguments/kt36853.kt"); } + @Test + @TestMetadata("kt36853_fibonacci.kt") + public void testKt36853_fibonacci() throws Exception { + runTest("compiler/testData/codegen/box/defaultArguments/kt36853_fibonacci.kt"); + } + @Test @TestMetadata("kt36853_nestedObject.kt") public void testKt36853_nestedObject() throws Exception { @@ -12316,6 +12322,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/defaultArguments/kt36972_object.kt"); } + @Test + @TestMetadata("kt46189.kt") + public void testKt46189() throws Exception { + runTest("compiler/testData/codegen/box/defaultArguments/kt46189.kt"); + } + @Test @TestMetadata("kt6382.kt") public void testKt6382() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java index 01c3ad614f2..8926f4000d4 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java @@ -12292,6 +12292,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/defaultArguments/kt36853.kt"); } + @Test + @TestMetadata("kt36853_fibonacci.kt") + public void testKt36853_fibonacci() throws Exception { + runTest("compiler/testData/codegen/box/defaultArguments/kt36853_fibonacci.kt"); + } + @Test @TestMetadata("kt36853_nestedObject.kt") public void testKt36853_nestedObject() throws Exception { @@ -12316,6 +12322,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/defaultArguments/kt36972_object.kt"); } + @Test + @TestMetadata("kt46189.kt") + public void testKt46189() throws Exception { + runTest("compiler/testData/codegen/box/defaultArguments/kt46189.kt"); + } + @Test @TestMetadata("kt6382.kt") public void testKt6382() throws Exception { diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 929206eac11..a222283b0f9 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -9944,6 +9944,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/defaultArguments/kt36853.kt"); } + @TestMetadata("kt36853_fibonacci.kt") + public void testKt36853_fibonacci() throws Exception { + runTest("compiler/testData/codegen/box/defaultArguments/kt36853_fibonacci.kt"); + } + @TestMetadata("kt36853_nestedObject.kt") public void testKt36853_nestedObject() throws Exception { runTest("compiler/testData/codegen/box/defaultArguments/kt36853_nestedObject.kt"); @@ -9964,6 +9969,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/defaultArguments/kt36972_object.kt"); } + @TestMetadata("kt46189.kt") + public void testKt46189() throws Exception { + runTest("compiler/testData/codegen/box/defaultArguments/kt46189.kt"); + } + @TestMetadata("kt6382.kt") public void testKt6382() throws Exception { runTest("compiler/testData/codegen/box/defaultArguments/kt6382.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java index 5f00014e315..878f67bf66e 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java @@ -8883,6 +8883,11 @@ public class IrJsCodegenBoxES6TestGenerated extends AbstractIrJsCodegenBoxES6Tes runTest("compiler/testData/codegen/box/defaultArguments/kt36853.kt"); } + @TestMetadata("kt36853_fibonacci.kt") + public void testKt36853_fibonacci() throws Exception { + runTest("compiler/testData/codegen/box/defaultArguments/kt36853_fibonacci.kt"); + } + @TestMetadata("kt36853_nestedObject.kt") public void testKt36853_nestedObject() throws Exception { runTest("compiler/testData/codegen/box/defaultArguments/kt36853_nestedObject.kt"); @@ -8893,6 +8898,11 @@ public class IrJsCodegenBoxES6TestGenerated extends AbstractIrJsCodegenBoxES6Tes runTest("compiler/testData/codegen/box/defaultArguments/kt36853a.kt"); } + @TestMetadata("kt46189.kt") + public void testKt46189() throws Exception { + runTest("compiler/testData/codegen/box/defaultArguments/kt46189.kt"); + } + @TestMetadata("kt6382.kt") public void testKt6382() throws Exception { runTest("compiler/testData/codegen/box/defaultArguments/kt6382.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java index 11315fb4f69..f959d86aec8 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java @@ -8294,6 +8294,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/defaultArguments/kt36853.kt"); } + @TestMetadata("kt36853_fibonacci.kt") + public void testKt36853_fibonacci() throws Exception { + runTest("compiler/testData/codegen/box/defaultArguments/kt36853_fibonacci.kt"); + } + @TestMetadata("kt36853_nestedObject.kt") public void testKt36853_nestedObject() throws Exception { runTest("compiler/testData/codegen/box/defaultArguments/kt36853_nestedObject.kt"); @@ -8304,6 +8309,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/defaultArguments/kt36853a.kt"); } + @TestMetadata("kt46189.kt") + public void testKt46189() throws Exception { + runTest("compiler/testData/codegen/box/defaultArguments/kt46189.kt"); + } + @TestMetadata("kt6382.kt") public void testKt6382() throws Exception { runTest("compiler/testData/codegen/box/defaultArguments/kt6382.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index e7cb3c24ce8..b745863f31b 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -8294,6 +8294,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/defaultArguments/kt36853.kt"); } + @TestMetadata("kt36853_fibonacci.kt") + public void testKt36853_fibonacci() throws Exception { + runTest("compiler/testData/codegen/box/defaultArguments/kt36853_fibonacci.kt"); + } + @TestMetadata("kt36853_nestedObject.kt") public void testKt36853_nestedObject() throws Exception { runTest("compiler/testData/codegen/box/defaultArguments/kt36853_nestedObject.kt"); @@ -8304,6 +8309,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/defaultArguments/kt36853a.kt"); } + @TestMetadata("kt46189.kt") + public void testKt46189() throws Exception { + runTest("compiler/testData/codegen/box/defaultArguments/kt46189.kt"); + } + @TestMetadata("kt6382.kt") public void testKt6382() throws Exception { runTest("compiler/testData/codegen/box/defaultArguments/kt6382.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/wasm/semantics/IrCodegenBoxWasmTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/wasm/semantics/IrCodegenBoxWasmTestGenerated.java index f85cce07f75..81d2a95050f 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/wasm/semantics/IrCodegenBoxWasmTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/wasm/semantics/IrCodegenBoxWasmTestGenerated.java @@ -3904,6 +3904,11 @@ public class IrCodegenBoxWasmTestGenerated extends AbstractIrCodegenBoxWasmTest runTest("compiler/testData/codegen/box/defaultArguments/kt36853.kt"); } + @TestMetadata("kt36853_fibonacci.kt") + public void testKt36853_fibonacci() throws Exception { + runTest("compiler/testData/codegen/box/defaultArguments/kt36853_fibonacci.kt"); + } + @TestMetadata("kt36853_nestedObject.kt") public void testKt36853_nestedObject() throws Exception { runTest("compiler/testData/codegen/box/defaultArguments/kt36853_nestedObject.kt"); @@ -3914,6 +3919,11 @@ public class IrCodegenBoxWasmTestGenerated extends AbstractIrCodegenBoxWasmTest runTest("compiler/testData/codegen/box/defaultArguments/kt36853a.kt"); } + @TestMetadata("kt46189.kt") + public void testKt46189() throws Exception { + runTest("compiler/testData/codegen/box/defaultArguments/kt46189.kt"); + } + @TestMetadata("kt6382.kt") public void testKt6382() throws Exception { runTest("compiler/testData/codegen/box/defaultArguments/kt6382.kt");