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 c173542f2a9..cf1f41309c0 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 @@ -329,7 +329,7 @@ class ExpressionCodegen( override fun visitFunctionAccess(expression: IrFunctionAccessExpression, data: BlockInfo): PromisedValue { classCodegen.context.irIntrinsics.getIntrinsic(expression.symbol) - ?.invoke(expression, this, data)?.let { return it.coerce(expression.type) } + ?.invoke(expression, this, data)?.let { return it } val callable = methodSignatureMapper.mapToCallableMethod(expression) val callee = expression.symbol.owner @@ -409,7 +409,8 @@ class ExpressionCodegen( } expression is IrConstructorCall -> MaterialValue(this, asmType, expression.type) - expression is IrDelegatingConstructorCall -> + expression.type.isUnit() && callable.asmMethod.returnType == Type.VOID_TYPE -> + //don't generate redundant UNIT/pop instructions immaterialUnitValue expression.type.isUnit() -> // NewInference allows casting `() -> T` to `() -> Unit`. A CHECKCAST here will fail. diff --git a/compiler/testData/codegen/bytecodeText/disabledOptimizations/noUnitInstanceInDefaultParameterInitialization.kt b/compiler/testData/codegen/bytecodeText/disabledOptimizations/noUnitInstanceInDefaultParameterInitialization.kt new file mode 100644 index 00000000000..77924885608 --- /dev/null +++ b/compiler/testData/codegen/bytecodeText/disabledOptimizations/noUnitInstanceInDefaultParameterInitialization.kt @@ -0,0 +1,7 @@ +// KOTLIN_CONFIGURATION_FLAGS: +JVM.DISABLE_OPTIMIZATION + +fun foo(s: String = "123") {} + +// 1 IF +// 0 Unit\.INSTANCE +// 0 POP \ No newline at end of file diff --git a/compiler/testData/codegen/bytecodeText/disabledOptimizations/noUnitInstanceOnVoidFunctionCall.kt b/compiler/testData/codegen/bytecodeText/disabledOptimizations/noUnitInstanceOnVoidFunctionCall.kt new file mode 100644 index 00000000000..bddb959fd0c --- /dev/null +++ b/compiler/testData/codegen/bytecodeText/disabledOptimizations/noUnitInstanceOnVoidFunctionCall.kt @@ -0,0 +1,10 @@ +// KOTLIN_CONFIGURATION_FLAGS: +JVM.DISABLE_OPTIMIZATION + +fun bar() {} + +fun foo() { + bar() +} + +// 0 Unit\.INSTANCE +// 0 POP \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeTextTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeTextTestGenerated.java index 20c3ce91e5d..70c0ffb9860 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeTextTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeTextTestGenerated.java @@ -1635,6 +1635,16 @@ public class BytecodeTextTestGenerated extends AbstractBytecodeTextTest { public void testNoJumpInSingleBranch() throws Exception { runTest("compiler/testData/codegen/bytecodeText/disabledOptimizations/noJumpInSingleBranch.kt"); } + + @TestMetadata("noUnitInstanceInDefaultParameterInitialization.kt") + public void testNoUnitInstanceInDefaultParameterInitialization() throws Exception { + runTest("compiler/testData/codegen/bytecodeText/disabledOptimizations/noUnitInstanceInDefaultParameterInitialization.kt"); + } + + @TestMetadata("noUnitInstanceOnVoidFunctionCall.kt") + public void testNoUnitInstanceOnVoidFunctionCall() throws Exception { + runTest("compiler/testData/codegen/bytecodeText/disabledOptimizations/noUnitInstanceOnVoidFunctionCall.kt"); + } } @TestMetadata("compiler/testData/codegen/bytecodeText/enum") diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBytecodeTextTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBytecodeTextTestGenerated.java index 260e2eb7be4..028f19ebde2 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBytecodeTextTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBytecodeTextTestGenerated.java @@ -1590,6 +1590,16 @@ public class IrBytecodeTextTestGenerated extends AbstractIrBytecodeTextTest { public void testNoJumpInSingleBranch() throws Exception { runTest("compiler/testData/codegen/bytecodeText/disabledOptimizations/noJumpInSingleBranch.kt"); } + + @TestMetadata("noUnitInstanceInDefaultParameterInitialization.kt") + public void testNoUnitInstanceInDefaultParameterInitialization() throws Exception { + runTest("compiler/testData/codegen/bytecodeText/disabledOptimizations/noUnitInstanceInDefaultParameterInitialization.kt"); + } + + @TestMetadata("noUnitInstanceOnVoidFunctionCall.kt") + public void testNoUnitInstanceOnVoidFunctionCall() throws Exception { + runTest("compiler/testData/codegen/bytecodeText/disabledOptimizations/noUnitInstanceOnVoidFunctionCall.kt"); + } } @TestMetadata("compiler/testData/codegen/bytecodeText/enum")