From f40a0ca704d05dfd03f9b5dbbd2d82e6b1df8b5f Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Tue, 18 Jan 2022 02:39:09 +0100 Subject: [PATCH] JVM IR: avoid unnecessary toIrBasedKotlinType in ExpressionCodegen Result of calling `ExpressionCodegen.gen` was used only in two call sites in the inliner. In all other call sites, we were doing unnecessary work (and sometimes were even failing) by trying to construct a KotlinType instance out from an IrType. Note that even though the code from KT-50617 no longer fails to compile, the underlying problem is still not solved, since the IrType for foo's dispatch receiver is constructed incorrectly. The reason is that SymbolTable links everything by IdSignature, which is identical for classes with the same FQ name. #KT-50617 Fixed --- .../FirBlackBoxCodegenTestGenerated.java | 6 ++++++ .../backend/jvm/codegen/ExpressionCodegen.kt | 10 +++++++--- .../backend/jvm/codegen/IrInlineCodegen.kt | 2 +- .../differingNumberOfGenericTypeParameters.kt | 18 ++++++++++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 6 ++++++ .../IrBlackBoxCodegenTestGenerated.java | 6 ++++++ .../LightAnalysisModeTestGenerated.java | 5 +++++ .../js/test/JsCodegenBoxTestGenerated.java | 6 ++++++ .../test/ir/IrJsCodegenBoxTestGenerated.java | 6 ++++++ .../IrCodegenBoxWasmTestGenerated.java | 5 +++++ .../blackboxtest/ExternalTestGenerated.java | 6 ++++++ 11 files changed, 72 insertions(+), 4 deletions(-) create mode 100644 compiler/testData/codegen/box/sameFileInSourceAndDependencies/differingNumberOfGenericTypeParameters.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 4c844489901..b3f81fb07de 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 @@ -42057,6 +42057,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/sameFileInSourceAndDependencies/classDeclaration.kt"); } + @Test + @TestMetadata("differingNumberOfGenericTypeParameters.kt") + public void testDifferingNumberOfGenericTypeParameters() throws Exception { + runTest("compiler/testData/codegen/box/sameFileInSourceAndDependencies/differingNumberOfGenericTypeParameters.kt"); + } + @Test @TestMetadata("functionDeclaration.kt") public void testFunctionDeclaration() throws Exception { diff --git a/compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt b/compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt index 402a03e1b4a..7a7853f2103 100644 --- a/compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt +++ b/compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt @@ -207,9 +207,13 @@ class ExpressionCodegen( noLineNumberScope = previousState } - // TODO remove - fun gen(expression: IrExpression, type: Type, irType: IrType, data: BlockInfo): StackValue { + fun gen(expression: IrExpression, type: Type, irType: IrType, data: BlockInfo) { expression.accept(this, data).materializeAt(type, irType) + } + + // TODO remove + fun genToStackValue(expression: IrExpression, type: Type, irType: IrType, data: BlockInfo): StackValue { + gen(expression, type, irType, data) return StackValue.onStack(type, irType.toIrBasedKotlinType()) } @@ -665,7 +669,7 @@ class ExpressionCodegen( expression.symbol.owner.realType.toIrBasedKotlinType() ) else - gen(expression, type, parameterType, data) + genToStackValue(expression, type, parameterType, data) // We do not mangle functions if Result is the only parameter of the function. This means that if a function // taking `Result` as a parameter overrides a function taking `Any?`, there is no bridge unless needed for diff --git a/compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/codegen/IrInlineCodegen.kt b/compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/codegen/IrInlineCodegen.kt index a5a29ddaa95..ca71f1830f9 100644 --- a/compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/codegen/IrInlineCodegen.kt +++ b/compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/codegen/IrInlineCodegen.kt @@ -137,7 +137,7 @@ class IrInlineCodegen( val argValue = if (irValueParameter.index >= 0) codegen.genOrGetLocal(argumentExpression, parameterType, irValueParameter.type, blockInfo) else - codegen.gen(argumentExpression, parameterType, irValueParameter.type, blockInfo) + codegen.genToStackValue(argumentExpression, parameterType, irValueParameter.type, blockInfo) if (inlineArgumentsInPlace) { codegen.visitor.addInplaceArgumentEndMarker() } diff --git a/compiler/testData/codegen/box/sameFileInSourceAndDependencies/differingNumberOfGenericTypeParameters.kt b/compiler/testData/codegen/box/sameFileInSourceAndDependencies/differingNumberOfGenericTypeParameters.kt new file mode 100644 index 00000000000..4c8a4e954ba --- /dev/null +++ b/compiler/testData/codegen/box/sameFileInSourceAndDependencies/differingNumberOfGenericTypeParameters.kt @@ -0,0 +1,18 @@ +// IGNORE_BACKEND: NATIVE, JS_IR, WASM +// IGNORE_BACKEND_FIR: JVM_IR +// MODULE: lib +// FILE: 1.kt +interface B + +object T : B + +fun B<*>.foo() {} + +// MODULE: main(lib) +// FILE: 2.kt +interface B + +fun box(): String { + T.foo() + return "OK" +} 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 413a71ba91e..867cda87421 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 @@ -41595,6 +41595,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/sameFileInSourceAndDependencies/classDeclaration.kt"); } + @Test + @TestMetadata("differingNumberOfGenericTypeParameters.kt") + public void testDifferingNumberOfGenericTypeParameters() throws Exception { + runTest("compiler/testData/codegen/box/sameFileInSourceAndDependencies/differingNumberOfGenericTypeParameters.kt"); + } + @Test @TestMetadata("functionDeclaration.kt") public void testFunctionDeclaration() 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 8fe1c113b96..bb6977f8fda 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 @@ -42057,6 +42057,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/sameFileInSourceAndDependencies/classDeclaration.kt"); } + @Test + @TestMetadata("differingNumberOfGenericTypeParameters.kt") + public void testDifferingNumberOfGenericTypeParameters() throws Exception { + runTest("compiler/testData/codegen/box/sameFileInSourceAndDependencies/differingNumberOfGenericTypeParameters.kt"); + } + @Test @TestMetadata("functionDeclaration.kt") public void testFunctionDeclaration() 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 f144af74900..609e9355ac3 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -33532,6 +33532,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/sameFileInSourceAndDependencies/classDeclaration.kt"); } + @TestMetadata("differingNumberOfGenericTypeParameters.kt") + public void testDifferingNumberOfGenericTypeParameters() throws Exception { + runTest("compiler/testData/codegen/box/sameFileInSourceAndDependencies/differingNumberOfGenericTypeParameters.kt"); + } + @TestMetadata("functionDeclaration.kt") public void testFunctionDeclaration() throws Exception { runTest("compiler/testData/codegen/box/sameFileInSourceAndDependencies/functionDeclaration.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/JsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/JsCodegenBoxTestGenerated.java index e0fd380b5e4..73a3ef131bf 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/JsCodegenBoxTestGenerated.java @@ -29993,6 +29993,12 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/sameFileInSourceAndDependencies/classDeclaration.kt"); } + @Test + @TestMetadata("differingNumberOfGenericTypeParameters.kt") + public void testDifferingNumberOfGenericTypeParameters() throws Exception { + runTest("compiler/testData/codegen/box/sameFileInSourceAndDependencies/differingNumberOfGenericTypeParameters.kt"); + } + @Test @TestMetadata("functionDeclaration.kt") public void testFunctionDeclaration() throws Exception { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java index 3b256e8eec5..2ea5347d9f7 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java @@ -30095,6 +30095,12 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/sameFileInSourceAndDependencies/classDeclaration.kt"); } + @Test + @TestMetadata("differingNumberOfGenericTypeParameters.kt") + public void testDifferingNumberOfGenericTypeParameters() throws Exception { + runTest("compiler/testData/codegen/box/sameFileInSourceAndDependencies/differingNumberOfGenericTypeParameters.kt"); + } + @Test @TestMetadata("functionDeclaration.kt") public void testFunctionDeclaration() throws Exception { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/testOld/wasm/semantics/IrCodegenBoxWasmTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/testOld/wasm/semantics/IrCodegenBoxWasmTestGenerated.java index 8f679164e5a..0376cb23cf1 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/testOld/wasm/semantics/IrCodegenBoxWasmTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/testOld/wasm/semantics/IrCodegenBoxWasmTestGenerated.java @@ -25054,6 +25054,11 @@ public class IrCodegenBoxWasmTestGenerated extends AbstractIrCodegenBoxWasmTest runTest("compiler/testData/codegen/box/sameFileInSourceAndDependencies/classDeclaration.kt"); } + @TestMetadata("differingNumberOfGenericTypeParameters.kt") + public void testDifferingNumberOfGenericTypeParameters() throws Exception { + runTest("compiler/testData/codegen/box/sameFileInSourceAndDependencies/differingNumberOfGenericTypeParameters.kt"); + } + @TestMetadata("functionDeclaration.kt") public void testFunctionDeclaration() throws Exception { runTest("compiler/testData/codegen/box/sameFileInSourceAndDependencies/functionDeclaration.kt"); diff --git a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/ExternalTestGenerated.java b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/ExternalTestGenerated.java index 556d870fac5..d8b87bb8d68 100644 --- a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/ExternalTestGenerated.java +++ b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/ExternalTestGenerated.java @@ -32290,6 +32290,12 @@ public class ExternalTestGenerated extends AbstractExternalNativeBlackBoxTest { runTest("compiler/testData/codegen/box/sameFileInSourceAndDependencies/classDeclaration.kt"); } + @Test + @TestMetadata("differingNumberOfGenericTypeParameters.kt") + public void testDifferingNumberOfGenericTypeParameters() throws Exception { + runTest("compiler/testData/codegen/box/sameFileInSourceAndDependencies/differingNumberOfGenericTypeParameters.kt"); + } + @Test @TestMetadata("functionDeclaration.kt") public void testFunctionDeclaration() throws Exception {