From 6c519488a68369d954cbe31698caae0d6d508e13 Mon Sep 17 00:00:00 2001 From: Igor Chevdar Date: Thu, 21 Sep 2023 20:52:36 +0300 Subject: [PATCH] [IR] Reworked K/N variables inliner hint --- .../common/lower/inline/FunctionInlining.kt | 13 -------- .../kotlin/backend/konan/llvm/IrToBitcode.kt | 33 ++++++++++--------- 2 files changed, 17 insertions(+), 29 deletions(-) diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/inline/FunctionInlining.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/inline/FunctionInlining.kt index 19609b631e5..d9d6c176519 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/inline/FunctionInlining.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/inline/FunctionInlining.kt @@ -27,7 +27,6 @@ import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.impl.* import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol -import org.jetbrains.kotlin.ir.symbols.IrSymbol import org.jetbrains.kotlin.ir.symbols.IrValueSymbol import org.jetbrains.kotlin.ir.symbols.impl.IrReturnableBlockSymbolImpl import org.jetbrains.kotlin.ir.types.* @@ -863,7 +862,6 @@ class FunctionInlining( if (isDefaultArg) variableInitializer.startOffset else UNDEFINED_OFFSET, if (isDefaultArg) variableInitializer.endOffset else UNDEFINED_OFFSET, if (inlineArgumentsWithTheirOriginalTypeAndOffset) parameter.getOriginalType() else variableInitializer.type, - InlinerExpressionLocationHint((currentScope.irElement as IrSymbolOwner).symbol) ).apply { statements.add(variableInitializer) }, @@ -908,14 +906,3 @@ class FunctionInlining( object INLINED_FUNCTION_REFERENCE : IrStatementOriginImpl("INLINED_FUNCTION_REFERENCE") object INLINED_FUNCTION_ARGUMENTS : IrStatementOriginImpl("INLINED_FUNCTION_ARGUMENTS") object INLINED_FUNCTION_DEFAULT_ARGUMENTS : IrStatementOriginImpl("INLINED_FUNCTION_DEFAULT_ARGUMENTS") - -class InlinerExpressionLocationHint(val inlineAtSymbol: IrSymbol) : IrStatementOrigin { - override fun toString(): String = - "(${this.javaClass.simpleName} : $functionNameOrDefaultToString @${functionFileOrNull?.fileEntry?.name})" - - private val functionFileOrNull: IrFile? - get() = (inlineAtSymbol as? IrFunction)?.file - - private val functionNameOrDefaultToString: String - get() = (inlineAtSymbol as? IrFunction)?.name?.asString() ?: inlineAtSymbol.toString() -} diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt index 72bd72c482c..4ae4b539e6d 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt @@ -10,7 +10,8 @@ import llvm.* import org.jetbrains.kotlin.ir.util.inlineFunction import org.jetbrains.kotlin.backend.common.ir.isUnconditional import org.jetbrains.kotlin.backend.common.lower.coroutines.getOrCreateFunctionWithContinuationStub -import org.jetbrains.kotlin.backend.common.lower.inline.InlinerExpressionLocationHint +import org.jetbrains.kotlin.backend.common.lower.inline.INLINED_FUNCTION_ARGUMENTS +import org.jetbrains.kotlin.backend.common.lower.inline.INLINED_FUNCTION_DEFAULT_ARGUMENTS import org.jetbrains.kotlin.backend.konan.* import org.jetbrains.kotlin.backend.konan.cexport.CAdapterCodegen import org.jetbrains.kotlin.backend.konan.cexport.CAdapterExportedElements @@ -1018,10 +1019,10 @@ internal class CodeGeneratorVisitor( } } - private fun generateStatement(statement: IrStatement) { + private fun generateStatement(statement: IrStatement, isInlinedArgument: Boolean = false) { when (statement) { is IrExpression -> evaluateExpression(statement) - is IrVariable -> generateVariable(statement) + is IrVariable -> generateVariable(statement, isInlinedArgument) else -> TODO(ir2string(statement)) } } @@ -1474,18 +1475,15 @@ internal class CodeGeneratorVisitor( else -> true } - private fun generateVariable(variable: IrVariable) { - context.log{"generateVariable : ${ir2string(variable)}"} - val value = variable.initializer?.let { - val callSiteOrigin = (it as? IrBlock)?.origin as? InlinerExpressionLocationHint - val inlineAtFunctionSymbol = callSiteOrigin?.inlineAtSymbol as? IrFunctionSymbol - inlineAtFunctionSymbol?.run { - switchSymbolizationContextTo(inlineAtFunctionSymbol) { - evaluateExpression(it) - } - } ?: evaluateExpression(it) + private fun generateVariable(variable: IrVariable, isInlinedArgument: Boolean) { + context.log { "generateVariable : ${ir2string(variable)}" } + val value = variable.initializer?.let { initializer -> + (currentCodeContext.functionScope()?.takeIf { isInlinedArgument } as? FunctionScope) + ?.declaration?.symbol?.let { + switchSymbolizationContextTo(it) { evaluateExpression(initializer) } + } ?: evaluateExpression(initializer) } - this.currentCodeContext.genDeclareVariable(variable, value) + currentCodeContext.genDeclareVariable(variable, value) } private fun CodeContext.genDeclareVariable( @@ -2211,15 +2209,18 @@ internal class CodeGeneratorVisitor( VariableScope() } + val isInlinedArgument = value is IrComposite && + (value.origin == INLINED_FUNCTION_ARGUMENTS || value.origin == INLINED_FUNCTION_DEFAULT_ARGUMENTS) + using(scope) { value.statements.dropLast(1).forEach { - generateStatement(it) + generateStatement(it, isInlinedArgument) } value.statements.lastOrNull()?.let { if (it is IrExpression) { return evaluateExpression(it, resultSlot) } else { - generateStatement(it) + generateStatement(it, isInlinedArgument) } }