Simplify tail-call optimisation check
Check, that all suspension points are immediately followed by ARETURN and do not check that all these ARETURNs are immediately preceded by suspension points. #KT-27190 Fixed
This commit is contained in:
+1
-7
@@ -944,13 +944,7 @@ private fun allSuspensionPointsAreTailCalls(
|
||||
}
|
||||
if (insideTryBlock) return@all false
|
||||
|
||||
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
|
||||
safelyReachableReturns[endIndex + 1] != null
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
// 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
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
@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
@@ -493,6 +493,11 @@ public class BytecodeListingTestGenerated extends AbstractBytecodeListingTest {
|
||||
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")
|
||||
public void testTailCallIntrinsics_1_2() throws Exception {
|
||||
runTestWithPackageReplacement("compiler/testData/codegen/bytecodeListing/tailcall/tailCallIntrinsics.kt", "kotlin.coroutines.experimental");
|
||||
|
||||
Reference in New Issue
Block a user