From a3284326af2b95a0777b825f5f6a809d31102c46 Mon Sep 17 00:00:00 2001 From: Ilmir Usmanov Date: Fri, 13 Sep 2019 16:39:52 +0300 Subject: [PATCH] JVM_IR: Do not box/unbox result in continuations Otherwise, it leads to CCE from kotlin/Result. --- .../backend/jvm/codegen/CoroutineCodegen.kt | 23 ++++++++----------- .../backend/jvm/codegen/ExpressionCodegen.kt | 6 +++-- .../backend/jvm/codegen/FunctionCodegen.kt | 4 ++-- .../backend/jvm/codegen/PromisedValue.kt | 6 ++++- .../jvm/lower/SyntheticAccessorLowering.kt | 2 +- .../box/coroutines/coroutineToString.kt | 4 +--- .../codegen/box/coroutines/dispatchResume.kt | 1 - .../breakWithNonEmptyStack.kt | 1 - .../suspendOperatorPlus.kt | 1 - .../suspendOperatorPlusAssign.kt | 1 - .../codegen/box/coroutines/kt15930.kt | 1 - .../box/coroutines/mergeNullAndString.kt | 1 - .../inlineMultiModuleWithInnerInlining.kt | 1 - .../suspendFunctionAsCoroutine/member.kt | 1 - .../suspendFunctionAsCoroutine/operators.kt | 1 - .../privateFunctions.kt | 1 - .../suspendFunctionAsCoroutine/simple.kt | 1 - .../withVariables.kt | 1 - .../inlineWithStateMachine.kt | 1 - .../tailCallOptimizations/tryCatch.kt | 1 - .../tailOperations/suspendWithIf.kt | 1 - .../tailOperations/suspendWithTryCatch.kt | 1 - .../tailOperations/suspendWithWhen.kt | 1 - .../varCaptuedInCoroutineIntrinsic.kt | 1 - .../coroutines/varSpilling/nullSpilling.kt | 1 - 25 files changed, 23 insertions(+), 41 deletions(-) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/CoroutineCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/CoroutineCodegen.kt index 395137146ed..72eb7eab238 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/CoroutineCodegen.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/CoroutineCodegen.kt @@ -15,10 +15,10 @@ import org.jetbrains.kotlin.codegen.ClassBuilder import org.jetbrains.kotlin.codegen.coroutines.CoroutineTransformerMethodVisitor import org.jetbrains.kotlin.codegen.coroutines.INVOKE_SUSPEND_METHOD_NAME import org.jetbrains.kotlin.codegen.coroutines.SUSPEND_FUNCTION_COMPLETION_PARAMETER_NAME -import org.jetbrains.kotlin.config.coroutinesPackageFqName import org.jetbrains.kotlin.config.isReleaseCoroutines import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.builders.declarations.addValueParameter +import org.jetbrains.kotlin.ir.declarations.IrDeclarationOriginImpl import org.jetbrains.kotlin.ir.declarations.IrFunction import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction import org.jetbrains.kotlin.ir.declarations.impl.IrFunctionImpl @@ -37,7 +37,6 @@ import org.jetbrains.kotlin.ir.util.isSuspend import org.jetbrains.kotlin.ir.util.parentAsClass import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid -import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodGenericSignature import org.jetbrains.kotlin.serialization.deserialization.descriptors.DescriptorWithContainerSource @@ -106,12 +105,12 @@ internal fun IrFunction.isInvokeSuspendOfContinuation(context: JvmBackendContext // Transform `suspend fun foo(params): RetType` into `fun foo(params, $completion: Continuation): Any?` // the result is called 'view', just to be consistent with old backend. internal fun IrFunction.getOrCreateSuspendFunctionViewIfNeeded(context: JvmBackendContext): IrFunction { - if (!isSuspend) return this - // TODO: Optimize - if (context.suspendFunctionViews.values.contains(this)) return this + if (!isSuspend || origin == SUSPEND_FUNCTION_VIEW) return this return if (isSuspend) context.suspendFunctionViews.getOrPut(this) { suspendFunctionView(context) } else this } +private object SUSPEND_FUNCTION_VIEW : IrDeclarationOriginImpl("SUSPEND_FUNCTION_VIEW") + private fun IrFunction.suspendFunctionView(context: JvmBackendContext): IrFunction { require(this.isSuspend && this is IrSimpleFunction) val originalDescriptor = this.descriptor @@ -121,7 +120,7 @@ private fun IrFunction.suspendFunctionView(context: JvmBackendContext): IrFuncti else WrappedSimpleFunctionDescriptor(sourceElement = originalDescriptor.source) return IrFunctionImpl( - startOffset, endOffset, origin, IrSimpleFunctionSymbolImpl(descriptor), + startOffset, endOffset, SUSPEND_FUNCTION_VIEW, IrSimpleFunctionSymbolImpl(descriptor), name, visibility, modality, context.irBuiltIns.anyNType, isInline, isExternal, isTailrec, isSuspend ).also { @@ -134,11 +133,8 @@ private fun IrFunction.suspendFunctionView(context: JvmBackendContext): IrFuncti valueParameters.mapTo(it.valueParameters) { p -> p.copyTo(it) } it.addValueParameter( - SUSPEND_FUNCTION_COMPLETION_PARAMETER_NAME, context.getTopLevelClass( - context.state.languageVersionSettings.coroutinesPackageFqName().child( - Name.identifier("Continuation") - ) - ).createType(false, listOf(makeTypeProjection(returnType, Variance.INVARIANT))) + SUSPEND_FUNCTION_COMPLETION_PARAMETER_NAME, context.ir.symbols.continuationClass + .createType(false, listOf(makeTypeProjection(returnType, Variance.INVARIANT))) ) val valueParametersMapping = explicitParameters.zip(it.explicitParameters).toMap() it.body = body?.deepCopyWithSymbols(this) @@ -150,19 +146,20 @@ private fun IrFunction.suspendFunctionView(context: JvmBackendContext): IrFuncti override fun visitCall(expression: IrCall): IrExpression { if (!expression.isSuspend) return super.visitCall(expression) - return super.visitCall(expression.createView(context, it)) + return super.visitCall(expression.createSuspendFunctionCallViewIfNeeded(context, it)) } }) } } -internal fun IrCall.createView(context: JvmBackendContext, caller: IrFunction): IrCall { +internal fun IrCall.createSuspendFunctionCallViewIfNeeded(context: JvmBackendContext, caller: IrFunction): IrCall { if (!isSuspend) return this val view = (symbol.owner as IrSimpleFunction).getOrCreateSuspendFunctionViewIfNeeded(context) if (view == symbol.owner) return this return IrCallImpl(startOffset, endOffset, view.returnType, view.symbol).also { it.copyTypeArgumentsFrom(this) it.dispatchReceiver = dispatchReceiver + it.extensionReceiver = extensionReceiver for (i in 0 until valueArgumentsCount) { it.putValueArgument(i, getValueArgument(i)) } diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt index ad6e6ee9378..0464f29e3a5 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt @@ -16,7 +16,6 @@ import org.jetbrains.kotlin.codegen.AsmUtil.* import org.jetbrains.kotlin.codegen.BaseExpressionCodegen import org.jetbrains.kotlin.codegen.CallGenerator import org.jetbrains.kotlin.codegen.StackValue -import org.jetbrains.kotlin.codegen.coroutines.INVOKE_SUSPEND_METHOD_NAME import org.jetbrains.kotlin.codegen.extractReificationArgument import org.jetbrains.kotlin.codegen.inline.* import org.jetbrains.kotlin.codegen.inline.ReifiedTypeInliner.Companion.putNeedClassReificationMarker @@ -297,8 +296,11 @@ class ExpressionCodegen( override fun visitContainerExpression(expression: IrContainerExpression, data: BlockInfo) = visitStatementContainer(expression, data).coerce(expression.type) + override fun visitCall(expression: IrCall, data: BlockInfo): PromisedValue { + return visitFunctionAccess(expression.createSuspendFunctionCallViewIfNeeded(context, irFunction), data) + } + override fun visitFunctionAccess(expression: IrFunctionAccessExpression, data: BlockInfo): PromisedValue { - val expression = if (expression is IrCall) expression.createView(context, irFunction) else expression classCodegen.context.irIntrinsics.getIntrinsic(expression.symbol) ?.invoke(expression, this, data)?.let { return it.coerce(expression.type) } diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt index 28a0bd6874d..d3a47c597aa 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt @@ -84,7 +84,7 @@ open class FunctionCodegen( methodVisitor = when { irFunction.isSuspend && // We do not generate continuation and state-machine for synthetic accessors, in a sense, they are tail-call - !irFunction.isDefault() && + !irFunction.isKnownToBeTailCall() && // TODO: We should generate two versions of inline suspend function: one with state-machine and one without !irFunction.isInline -> generateStateMachineForNamedFunction( @@ -104,7 +104,7 @@ open class FunctionCodegen( return signature } - private fun IrFunction.isDefault(): Boolean = + private fun IrFunction.isKnownToBeTailCall(): Boolean = origin == IrDeclarationOrigin.FUNCTION_FOR_DEFAULT_PARAMETER || origin == JvmLoweredDeclarationOrigin.SYNTHETIC_ACCESSOR private fun calculateMethodFlags(isStatic: Boolean): Int { diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/PromisedValue.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/PromisedValue.kt index 58a2455e934..04e84e95a58 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/PromisedValue.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/PromisedValue.kt @@ -88,8 +88,12 @@ fun PromisedValue.coerce(target: Type, irTarget: IrType): PromisedValue { val isFromTypeInlineClass = erasedSourceType.classOrNull!!.owner.isInline val isToTypeInlineClass = erasedTargetType.classOrNull!!.owner.isInline + // Boxing and unboxing kotlin.Result leads to CCE in generated code + val doNotCoerceKotlinResultInContinuation = + codegen.irFunction.isInvokeSuspendOfContinuation(codegen.context) && (irType.isKotlinResult() || irTarget.isKotlinResult()) + // Coerce inline classes - if (isFromTypeInlineClass || isToTypeInlineClass) { + if ((isFromTypeInlineClass || isToTypeInlineClass) && !doNotCoerceKotlinResultInContinuation) { val isFromTypeUnboxed = isFromTypeInlineClass && typeMapper.mapType(erasedSourceType.unboxed) == type val isToTypeUnboxed = isToTypeInlineClass && typeMapper.mapType(erasedTargetType.unboxed) == target diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/SyntheticAccessorLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/SyntheticAccessorLowering.kt index feb6867b78a..9493390cf2d 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/SyntheticAccessorLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/SyntheticAccessorLowering.kt @@ -155,7 +155,7 @@ private class SyntheticAccessorLowering(val context: JvmBackendContext) : IrElem origin = JvmLoweredDeclarationOrigin.SYNTHETIC_ACCESSOR name = source.accessorName() visibility = Visibilities.PUBLIC - isSuspend = this@makeSimpleFunctionAccessor.isSuspend // synthetic accessors of suspend functions are handled in codegen + isSuspend = source.isSuspend // synthetic accessors of suspend functions are handled in codegen }.also { accessor -> // Find the right container to insert the accessor. Simply put, when we call a function on a class A, // we also need to put its accessor into A. However, due to the way that calls are implemented in the diff --git a/compiler/testData/codegen/box/coroutines/coroutineToString.kt b/compiler/testData/codegen/box/coroutines/coroutineToString.kt index e9358905ea4..3dc34f08358 100644 --- a/compiler/testData/codegen/box/coroutines/coroutineToString.kt +++ b/compiler/testData/codegen/box/coroutines/coroutineToString.kt @@ -1,5 +1,3 @@ -// IGNORE_BACKEND: JS_IR -// IGNORE_BACKEND: JVM_IR // TARGET_BACKEND: JVM // WITH_REFLECT // WITH_COROUTINES @@ -31,5 +29,5 @@ fun box(): String { result = A().bar() } - return if (result == "Continuation at test.A.bar(coroutineToString.kt:16)") "OK" else "Fail: $result" + return if (result == "Continuation at test.A.bar(coroutineToString.kt:14)") "OK" else "Fail: $result" } diff --git a/compiler/testData/codegen/box/coroutines/dispatchResume.kt b/compiler/testData/codegen/box/coroutines/dispatchResume.kt index 674a075d5f2..5f84e849ae1 100644 --- a/compiler/testData/codegen/box/coroutines/dispatchResume.kt +++ b/compiler/testData/codegen/box/coroutines/dispatchResume.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JVM_IR // WITH_RUNTIME // WITH_COROUTINES // COMMON_COROUTINES_TEST diff --git a/compiler/testData/codegen/box/coroutines/featureIntersection/breakWithNonEmptyStack.kt b/compiler/testData/codegen/box/coroutines/featureIntersection/breakWithNonEmptyStack.kt index b902dd23fb8..c3b5ccd0398 100644 --- a/compiler/testData/codegen/box/coroutines/featureIntersection/breakWithNonEmptyStack.kt +++ b/compiler/testData/codegen/box/coroutines/featureIntersection/breakWithNonEmptyStack.kt @@ -1,5 +1,4 @@ // KJS_WITH_FULL_RUNTIME -// IGNORE_BACKEND: JVM_IR // WITH_RUNTIME // WITH_COROUTINES // COMMON_COROUTINES_TEST diff --git a/compiler/testData/codegen/box/coroutines/featureIntersection/suspendOperatorPlus.kt b/compiler/testData/codegen/box/coroutines/featureIntersection/suspendOperatorPlus.kt index 5a79168b5f9..2328571d9b2 100644 --- a/compiler/testData/codegen/box/coroutines/featureIntersection/suspendOperatorPlus.kt +++ b/compiler/testData/codegen/box/coroutines/featureIntersection/suspendOperatorPlus.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JVM_IR // WITH_RUNTIME // WITH_COROUTINES // COMMON_COROUTINES_TEST diff --git a/compiler/testData/codegen/box/coroutines/featureIntersection/suspendOperatorPlusAssign.kt b/compiler/testData/codegen/box/coroutines/featureIntersection/suspendOperatorPlusAssign.kt index 86002f4c2c1..6f369b93679 100644 --- a/compiler/testData/codegen/box/coroutines/featureIntersection/suspendOperatorPlusAssign.kt +++ b/compiler/testData/codegen/box/coroutines/featureIntersection/suspendOperatorPlusAssign.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JVM_IR // WITH_RUNTIME // WITH_COROUTINES // COMMON_COROUTINES_TEST diff --git a/compiler/testData/codegen/box/coroutines/kt15930.kt b/compiler/testData/codegen/box/coroutines/kt15930.kt index e836bf7aacc..51fb9abde85 100644 --- a/compiler/testData/codegen/box/coroutines/kt15930.kt +++ b/compiler/testData/codegen/box/coroutines/kt15930.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JVM_IR // WITH_RUNTIME // WITH_COROUTINES // COMMON_COROUTINES_TEST diff --git a/compiler/testData/codegen/box/coroutines/mergeNullAndString.kt b/compiler/testData/codegen/box/coroutines/mergeNullAndString.kt index a411b05d2ad..7e0c607cd4e 100644 --- a/compiler/testData/codegen/box/coroutines/mergeNullAndString.kt +++ b/compiler/testData/codegen/box/coroutines/mergeNullAndString.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JVM_IR // WITH_RUNTIME // WITH_COROUTINES // COMMON_COROUTINES_TEST diff --git a/compiler/testData/codegen/box/coroutines/multiModule/inlineMultiModuleWithInnerInlining.kt b/compiler/testData/codegen/box/coroutines/multiModule/inlineMultiModuleWithInnerInlining.kt index d68080eac82..3aca04ab5a1 100644 --- a/compiler/testData/codegen/box/coroutines/multiModule/inlineMultiModuleWithInnerInlining.kt +++ b/compiler/testData/codegen/box/coroutines/multiModule/inlineMultiModuleWithInnerInlining.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JVM_IR // IGNORE_BACKEND: NATIVE // WITH_COROUTINES // WITH_RUNTIME diff --git a/compiler/testData/codegen/box/coroutines/suspendFunctionAsCoroutine/member.kt b/compiler/testData/codegen/box/coroutines/suspendFunctionAsCoroutine/member.kt index 8a7a893114b..7ca863cfc43 100644 --- a/compiler/testData/codegen/box/coroutines/suspendFunctionAsCoroutine/member.kt +++ b/compiler/testData/codegen/box/coroutines/suspendFunctionAsCoroutine/member.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JVM_IR // WITH_RUNTIME // WITH_COROUTINES // COMMON_COROUTINES_TEST diff --git a/compiler/testData/codegen/box/coroutines/suspendFunctionAsCoroutine/operators.kt b/compiler/testData/codegen/box/coroutines/suspendFunctionAsCoroutine/operators.kt index 529c139ef5c..149f3b3cd09 100644 --- a/compiler/testData/codegen/box/coroutines/suspendFunctionAsCoroutine/operators.kt +++ b/compiler/testData/codegen/box/coroutines/suspendFunctionAsCoroutine/operators.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JVM_IR // WITH_RUNTIME // WITH_COROUTINES // COMMON_COROUTINES_TEST diff --git a/compiler/testData/codegen/box/coroutines/suspendFunctionAsCoroutine/privateFunctions.kt b/compiler/testData/codegen/box/coroutines/suspendFunctionAsCoroutine/privateFunctions.kt index 2506947a3aa..0e4dd227270 100644 --- a/compiler/testData/codegen/box/coroutines/suspendFunctionAsCoroutine/privateFunctions.kt +++ b/compiler/testData/codegen/box/coroutines/suspendFunctionAsCoroutine/privateFunctions.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JVM_IR // WITH_RUNTIME // WITH_COROUTINES // COMMON_COROUTINES_TEST diff --git a/compiler/testData/codegen/box/coroutines/suspendFunctionAsCoroutine/simple.kt b/compiler/testData/codegen/box/coroutines/suspendFunctionAsCoroutine/simple.kt index 685f0e8d851..5771cc14152 100644 --- a/compiler/testData/codegen/box/coroutines/suspendFunctionAsCoroutine/simple.kt +++ b/compiler/testData/codegen/box/coroutines/suspendFunctionAsCoroutine/simple.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JVM_IR // WITH_RUNTIME // WITH_COROUTINES // COMMON_COROUTINES_TEST diff --git a/compiler/testData/codegen/box/coroutines/suspendFunctionAsCoroutine/withVariables.kt b/compiler/testData/codegen/box/coroutines/suspendFunctionAsCoroutine/withVariables.kt index 04239e645ee..1dbe4637a50 100644 --- a/compiler/testData/codegen/box/coroutines/suspendFunctionAsCoroutine/withVariables.kt +++ b/compiler/testData/codegen/box/coroutines/suspendFunctionAsCoroutine/withVariables.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JVM_IR // WITH_RUNTIME // WITH_COROUTINES // COMMON_COROUTINES_TEST diff --git a/compiler/testData/codegen/box/coroutines/tailCallOptimizations/inlineWithStateMachine.kt b/compiler/testData/codegen/box/coroutines/tailCallOptimizations/inlineWithStateMachine.kt index 969947d3409..7f1a53e82ed 100644 --- a/compiler/testData/codegen/box/coroutines/tailCallOptimizations/inlineWithStateMachine.kt +++ b/compiler/testData/codegen/box/coroutines/tailCallOptimizations/inlineWithStateMachine.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JVM_IR // TARGET_BACKEND: JVM // FULL_JDK // WITH_RUNTIME diff --git a/compiler/testData/codegen/box/coroutines/tailCallOptimizations/tryCatch.kt b/compiler/testData/codegen/box/coroutines/tailCallOptimizations/tryCatch.kt index b78790400a7..6b9518e2e61 100644 --- a/compiler/testData/codegen/box/coroutines/tailCallOptimizations/tryCatch.kt +++ b/compiler/testData/codegen/box/coroutines/tailCallOptimizations/tryCatch.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JVM_IR // KJS_WITH_FULL_RUNTIME // WITH_RUNTIME // WITH_COROUTINES diff --git a/compiler/testData/codegen/box/coroutines/tailOperations/suspendWithIf.kt b/compiler/testData/codegen/box/coroutines/tailOperations/suspendWithIf.kt index ab15dd097c3..c8502ed7398 100644 --- a/compiler/testData/codegen/box/coroutines/tailOperations/suspendWithIf.kt +++ b/compiler/testData/codegen/box/coroutines/tailOperations/suspendWithIf.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JVM_IR // WITH_RUNTIME // WITH_COROUTINES // COMMON_COROUTINES_TEST diff --git a/compiler/testData/codegen/box/coroutines/tailOperations/suspendWithTryCatch.kt b/compiler/testData/codegen/box/coroutines/tailOperations/suspendWithTryCatch.kt index 48fdb01be88..310c1ddc2f6 100644 --- a/compiler/testData/codegen/box/coroutines/tailOperations/suspendWithTryCatch.kt +++ b/compiler/testData/codegen/box/coroutines/tailOperations/suspendWithTryCatch.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JVM_IR // WITH_RUNTIME // WITH_COROUTINES // COMMON_COROUTINES_TEST diff --git a/compiler/testData/codegen/box/coroutines/tailOperations/suspendWithWhen.kt b/compiler/testData/codegen/box/coroutines/tailOperations/suspendWithWhen.kt index 64de4449fef..c60c498aa4d 100644 --- a/compiler/testData/codegen/box/coroutines/tailOperations/suspendWithWhen.kt +++ b/compiler/testData/codegen/box/coroutines/tailOperations/suspendWithWhen.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JVM_IR // WITH_RUNTIME // WITH_COROUTINES // COMMON_COROUTINES_TEST diff --git a/compiler/testData/codegen/box/coroutines/varCaptuedInCoroutineIntrinsic.kt b/compiler/testData/codegen/box/coroutines/varCaptuedInCoroutineIntrinsic.kt index cff0202e63a..2c75e3c721c 100644 --- a/compiler/testData/codegen/box/coroutines/varCaptuedInCoroutineIntrinsic.kt +++ b/compiler/testData/codegen/box/coroutines/varCaptuedInCoroutineIntrinsic.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JVM_IR // WITH_RUNTIME // WITH_COROUTINES // COMMON_COROUTINES_TEST diff --git a/compiler/testData/codegen/box/coroutines/varSpilling/nullSpilling.kt b/compiler/testData/codegen/box/coroutines/varSpilling/nullSpilling.kt index 6200eac0ef0..fdad0a16caf 100644 --- a/compiler/testData/codegen/box/coroutines/varSpilling/nullSpilling.kt +++ b/compiler/testData/codegen/box/coroutines/varSpilling/nullSpilling.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JVM_IR // WITH_RUNTIME // WITH_COROUTINES // COMMON_COROUTINES_TEST