Revert "Simplify tail-call optimisation check"
This reverts commit a5bcd3495e.
#KT-27190: Open
#KT-29327: Fixed
This commit is contained in:
committed by
Stanislav Erokhin
parent
8fb2633bf4
commit
dc6bb4cd08
+9
-2
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
* Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||||
* that can be found in the license/LICENSE.txt file.
|
* that can be found in the license/LICENSE.txt file.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -16,6 +16,7 @@ import org.jetbrains.kotlin.codegen.optimization.DeadCodeEliminationMethodTransf
|
|||||||
import org.jetbrains.kotlin.codegen.optimization.boxing.isPrimitiveUnboxing
|
import org.jetbrains.kotlin.codegen.optimization.boxing.isPrimitiveUnboxing
|
||||||
import org.jetbrains.kotlin.codegen.optimization.common.*
|
import org.jetbrains.kotlin.codegen.optimization.common.*
|
||||||
import org.jetbrains.kotlin.codegen.optimization.fixStack.FixStackMethodTransformer
|
import org.jetbrains.kotlin.codegen.optimization.fixStack.FixStackMethodTransformer
|
||||||
|
import org.jetbrains.kotlin.codegen.optimization.fixStack.top
|
||||||
import org.jetbrains.kotlin.codegen.optimization.transformer.MethodTransformer
|
import org.jetbrains.kotlin.codegen.optimization.transformer.MethodTransformer
|
||||||
import org.jetbrains.kotlin.config.LanguageVersionSettings
|
import org.jetbrains.kotlin.config.LanguageVersionSettings
|
||||||
import org.jetbrains.kotlin.config.isReleaseCoroutines
|
import org.jetbrains.kotlin.config.isReleaseCoroutines
|
||||||
@@ -951,7 +952,13 @@ private fun allSuspensionPointsAreTailCalls(
|
|||||||
}
|
}
|
||||||
if (insideTryBlock) return@all false
|
if (insideTryBlock) return@all false
|
||||||
|
|
||||||
safelyReachableReturns[endIndex + 1] != null
|
safelyReachableReturns[endIndex + 1]?.all { returnIndex ->
|
||||||
|
sourceFrames[returnIndex].top().sure {
|
||||||
|
"There must be some value on stack to return"
|
||||||
|
}.insns.all { sourceInsn ->
|
||||||
|
sourceInsn?.let(instructions::indexOf) in beginIndex..endIndex
|
||||||
|
}
|
||||||
|
} ?: false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,16 +0,0 @@
|
|||||||
// WITH_RUNTIME
|
|
||||||
|
|
||||||
import kotlin.coroutines.intrinsics.*
|
|
||||||
|
|
||||||
fun check() = true
|
|
||||||
|
|
||||||
suspend fun f(i: Int): Unit {
|
|
||||||
return f_2()
|
|
||||||
}
|
|
||||||
|
|
||||||
private inline suspend fun f_2(): Unit {
|
|
||||||
if (check()) return
|
|
||||||
return suspendCoroutineUninterceptedOrReturn {
|
|
||||||
COROUTINE_SUSPENDED
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
@kotlin.Metadata
|
|
||||||
public final class TailCallIfReturnUnitKt {
|
|
||||||
public final static method check(): boolean
|
|
||||||
public final static @org.jetbrains.annotations.Nullable method f(p0: int, @org.jetbrains.annotations.NotNull p1: kotlin.coroutines.Continuation): java.lang.Object
|
|
||||||
private synthetic final static method f_2(p0: kotlin.coroutines.Continuation): java.lang.Object
|
|
||||||
}
|
|
||||||
-5
@@ -498,11 +498,6 @@ public class BytecodeListingTestGenerated extends AbstractBytecodeListingTest {
|
|||||||
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/bytecodeListing/tailcall"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true);
|
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/bytecodeListing/tailcall"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@TestMetadata("tailCallIfReturnUnit.kt")
|
|
||||||
public void testTailCallIfReturnUnit() throws Exception {
|
|
||||||
runTest("compiler/testData/codegen/bytecodeListing/tailcall/tailCallIfReturnUnit.kt");
|
|
||||||
}
|
|
||||||
|
|
||||||
@TestMetadata("tailCallIntrinsics.kt")
|
@TestMetadata("tailCallIntrinsics.kt")
|
||||||
public void testTailCallIntrinsics_1_2() throws Exception {
|
public void testTailCallIntrinsics_1_2() throws Exception {
|
||||||
runTestWithPackageReplacement("compiler/testData/codegen/bytecodeListing/tailcall/tailCallIntrinsics.kt", "kotlin.coroutines.experimental");
|
runTestWithPackageReplacement("compiler/testData/codegen/bytecodeListing/tailcall/tailCallIntrinsics.kt", "kotlin.coroutines.experimental");
|
||||||
|
|||||||
Reference in New Issue
Block a user