From 2bfd1c8f23f94794cd34650d35ff291f179c5f8d Mon Sep 17 00:00:00 2001 From: Ivan Kylchik Date: Mon, 19 Feb 2024 19:05:15 +0100 Subject: [PATCH] [IR] Don't pass `originalCallee` to the inliner `originalCallee` is supposed to be the owner of the original call. It can be a fake override, and in the inliner we are using actual function with body. Apparently we can just stick with the resolved function. #KT-64807 --- .../kotlin/ir/backend/js/dce/UsefulDeclarationProcessor.kt | 5 ++++- .../src/org/jetbrains/kotlin/ir/inline/FunctionInlining.kt | 5 ++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/dce/UsefulDeclarationProcessor.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/dce/UsefulDeclarationProcessor.kt index 48b6c584353..ec61c7aab19 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/dce/UsefulDeclarationProcessor.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/dce/UsefulDeclarationProcessor.kt @@ -57,7 +57,10 @@ abstract class UsefulDeclarationProcessor( super.visitBlock(expression, data) if (expression is IrReturnableBlock) { - expression.inlineFunction?.addToUsefulPolyfilledDeclarations() + // We need to extract `originalFunction` here because saved `inlineFunction` + // is actually a copy made in `SaveInlineFunctionsBeforeInlining`. + // Without this, we are not going to find proper intersection in the `saveOnlyIntersectionOfNextDeclarationsFor` method. + expression.inlineFunction?.originalFunction?.addToUsefulPolyfilledDeclarations() } } diff --git a/compiler/ir/ir.inline/src/org/jetbrains/kotlin/ir/inline/FunctionInlining.kt b/compiler/ir/ir.inline/src/org/jetbrains/kotlin/ir/inline/FunctionInlining.kt index 8882d90b004..65ecd6abecb 100644 --- a/compiler/ir/ir.inline/src/org/jetbrains/kotlin/ir/inline/FunctionInlining.kt +++ b/compiler/ir/ir.inline/src/org/jetbrains/kotlin/ir/inline/FunctionInlining.kt @@ -123,7 +123,7 @@ class FunctionInlining( ?: containerScope?.irElement as? IrDeclarationParent ?: (containerScope?.irElement as? IrDeclaration)?.parent - val inliner = Inliner(expression, actualCallee, target, currentScope ?: containerScope!!, parent, context) + val inliner = Inliner(expression, actualCallee, currentScope ?: containerScope!!, parent, context) return inliner.inline().markAsRegenerated() } @@ -149,7 +149,6 @@ class FunctionInlining( private inner class Inliner( val callSite: IrFunctionAccessExpression, val callee: IrFunction, - val originalCallee: IrFunction, val currentScope: ScopeWithIr, val parent: IrDeclarationParent?, val context: CommonBackendContext @@ -169,7 +168,7 @@ class FunctionInlining( val substituteMap = mutableMapOf() - fun inline() = inlineFunction(callSite, callee, originalCallee, true) + fun inline() = inlineFunction(callSite, callee, callee, true) private fun E.copy(): E { @Suppress("UNCHECKED_CAST")