Don't create redundant copies in DefaultArgumentStubGenerator

This commit is contained in:
pyos
2019-09-27 12:30:38 +02:00
committed by max-kammerer
parent 8bf5afbba2
commit 35a0fc40a6
2 changed files with 12 additions and 19 deletions
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.backend.common.ir.*
import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
import org.jetbrains.kotlin.ir.builders.* import org.jetbrains.kotlin.ir.builders.*
import org.jetbrains.kotlin.ir.builders.declarations.addValueParameter
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.impl.IrConstructorImpl import org.jetbrains.kotlin.ir.declarations.impl.IrConstructorImpl
import org.jetbrains.kotlin.ir.declarations.impl.IrFunctionImpl import org.jetbrains.kotlin.ir.declarations.impl.IrFunctionImpl
@@ -72,7 +73,7 @@ open class DefaultArgumentStubGenerator(
val builder = context.createIrBuilder(newIrFunction.symbol) val builder = context.createIrBuilder(newIrFunction.symbol)
newIrFunction.body = builder.irBlockBody(newIrFunction) { newIrFunction.body = builder.irBlockBody(newIrFunction) {
val params = mutableListOf<IrVariable>() val params = mutableListOf<IrValueDeclaration>()
val variables = mutableMapOf<IrValueDeclaration, IrValueDeclaration>() val variables = mutableMapOf<IrValueDeclaration, IrValueDeclaration>()
irFunction.dispatchReceiverParameter?.let { irFunction.dispatchReceiverParameter?.let {
@@ -85,8 +86,7 @@ open class DefaultArgumentStubGenerator(
for (valueParameter in irFunction.valueParameters) { for (valueParameter in irFunction.valueParameters) {
val parameter = newIrFunction.valueParameters[valueParameter.index] val parameter = newIrFunction.valueParameters[valueParameter.index]
val remapped = if (valueParameter.defaultValue != null) {
val argument = if (valueParameter.defaultValue != null) {
val kIntAnd = symbols.intAnd.owner val kIntAnd = symbols.intAnd.owner
val condition = irNotEquals(irCall(kIntAnd).apply { val condition = irNotEquals(irCall(kIntAnd).apply {
dispatchReceiver = irGet(maskParameter(newIrFunction, valueParameter.index / 32)) dispatchReceiver = irGet(maskParameter(newIrFunction, valueParameter.index / 32))
@@ -104,21 +104,18 @@ open class DefaultArgumentStubGenerator(
} }
}) })
irIfThenElse( val argument = irIfThenElse(
type = parameter.type, type = parameter.type,
condition = condition, condition = condition,
thenPart = expressionBody.expression, thenPart = expressionBody.expression,
elsePart = irGet(parameter) elsePart = irGet(parameter)
) )
createTmpVariable(argument, nameHint = parameter.name.asString())
} else { } else {
irGet(parameter) parameter
} }
params.add(remapped)
val temporaryVariable = createTmpVariable(argument, nameHint = parameter.name.asString()) variables[valueParameter] = remapped
temporaryVariable.parent = newIrFunction
params.add(temporaryVariable)
variables[valueParameter] = temporaryVariable
} }
when (irFunction) { when (irFunction) {
@@ -151,7 +148,7 @@ open class DefaultArgumentStubGenerator(
private fun IrBlockBodyBuilder.dispatchToImplementation( private fun IrBlockBodyBuilder.dispatchToImplementation(
irFunction: IrSimpleFunction, irFunction: IrSimpleFunction,
newIrFunction: IrFunction, newIrFunction: IrFunction,
params: MutableList<IrVariable> params: MutableList<IrValueDeclaration>
): IrExpression { ): IrExpression {
val dispatchCall = irCall(irFunction.symbol).apply { val dispatchCall = irCall(irFunction.symbol).apply {
passTypeArgumentsFrom(newIrFunction) passTypeArgumentsFrom(newIrFunction)
@@ -177,7 +174,7 @@ open class DefaultArgumentStubGenerator(
handlerDeclaration: IrValueParameter, handlerDeclaration: IrValueParameter,
oldIrFunction: IrFunction, oldIrFunction: IrFunction,
newIrFunction: IrFunction, newIrFunction: IrFunction,
params: MutableList<IrVariable> params: MutableList<IrValueDeclaration>
): IrExpression { ): IrExpression {
assert(needSpecialDispatch(oldIrFunction as IrSimpleFunction)) assert(needSpecialDispatch(oldIrFunction as IrSimpleFunction))
error("This method should be overridden") error("This method should be overridden")
@@ -14,17 +14,13 @@ import org.jetbrains.kotlin.ir.builders.IrBlockBodyBuilder
import org.jetbrains.kotlin.ir.builders.irCall import org.jetbrains.kotlin.ir.builders.irCall
import org.jetbrains.kotlin.ir.builders.irGet import org.jetbrains.kotlin.ir.builders.irGet
import org.jetbrains.kotlin.ir.builders.irImplicitCast import org.jetbrains.kotlin.ir.builders.irImplicitCast
import org.jetbrains.kotlin.ir.declarations.IrFunction import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
import org.jetbrains.kotlin.ir.declarations.IrValueParameter
import org.jetbrains.kotlin.ir.declarations.IrVariable
import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrFunctionReferenceImpl import org.jetbrains.kotlin.ir.expressions.impl.IrFunctionReferenceImpl
import org.jetbrains.kotlin.ir.util.deepCopyWithSymbols import org.jetbrains.kotlin.ir.util.deepCopyWithSymbols
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
class JsDefaultArgumentStubGenerator(override val context: JsIrBackendContext) : DefaultArgumentStubGenerator(context, true, true) { class JsDefaultArgumentStubGenerator(override val context: JsIrBackendContext) : DefaultArgumentStubGenerator(context, true, true) {
@@ -35,7 +31,7 @@ class JsDefaultArgumentStubGenerator(override val context: JsIrBackendContext) :
handlerDeclaration: IrValueParameter, handlerDeclaration: IrValueParameter,
oldIrFunction: IrFunction, oldIrFunction: IrFunction,
newIrFunction: IrFunction, newIrFunction: IrFunction,
params: MutableList<IrVariable> params: MutableList<IrValueDeclaration>
): IrExpression { ): IrExpression {
val paramCount = oldIrFunction.valueParameters.size val paramCount = oldIrFunction.valueParameters.size
val invokeFunctionN = resolveInvoke(paramCount) val invokeFunctionN = resolveInvoke(paramCount)