[IR] Reworked K/N variables inliner hint

This commit is contained in:
Igor Chevdar
2023-09-21 20:52:36 +03:00
committed by Space Team
parent 1b30f76a78
commit 6c519488a6
2 changed files with 17 additions and 29 deletions
@@ -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()
}
@@ -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)
}
}