IR: do not copy call in CrossFileCallAdjuster

This is just a refactoring/optimization that makes use of the fact that
IrCall.symbol is now mutable.
This commit is contained in:
Alexander Udalov
2023-06-16 23:58:21 +02:00
committed by Space Team
parent 42057b7fe0
commit b75aa9af4e
@@ -8,21 +8,18 @@ package org.jetbrains.kotlin.backend.common.phaser
import org.jetbrains.kotlin.backend.common.CodegenUtil import org.jetbrains.kotlin.backend.common.CodegenUtil
import org.jetbrains.kotlin.backend.common.CommonBackendContext import org.jetbrains.kotlin.backend.common.CommonBackendContext
import org.jetbrains.kotlin.config.CommonConfigurationKeys import org.jetbrains.kotlin.config.CommonConfigurationKeys
import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.declarations.IrFile import org.jetbrains.kotlin.ir.declarations.IrFile
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
import org.jetbrains.kotlin.ir.expressions.IrCall import org.jetbrains.kotlin.ir.expressions.IrCall
import org.jetbrains.kotlin.ir.expressions.IrExpression
import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
import org.jetbrains.kotlin.ir.symbols.IrFileSymbol import org.jetbrains.kotlin.ir.symbols.IrFileSymbol
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
import org.jetbrains.kotlin.ir.util.DeepCopySymbolRemapperPreservingSignatures import org.jetbrains.kotlin.ir.util.DeepCopySymbolRemapperPreservingSignatures
import org.jetbrains.kotlin.ir.util.copyTypeAndValueArgumentsFrom
import org.jetbrains.kotlin.ir.util.deepCopySavingMetadata import org.jetbrains.kotlin.ir.util.deepCopySavingMetadata
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
import java.util.concurrent.Executors import java.util.concurrent.Executors
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit
import java.util.concurrent.atomic.AtomicReference import java.util.concurrent.atomic.AtomicReference
@@ -135,7 +132,7 @@ private class PerformByIrFilePhase<Context : CommonBackendContext>(
// and some entries in adjustDefaultArgumentStubs depend on those inserted by handleDeepCopy, so we need to repeat the call. // and some entries in adjustDefaultArgumentStubs depend on those inserted by handleDeepCopy, so we need to repeat the call.
adjustDefaultArgumentStubs(context, remappedFunctions) adjustDefaultArgumentStubs(context, remappedFunctions)
input.transformChildrenVoid(CrossFileCallAdjuster(remappedFunctions)) input.acceptChildrenVoid(CrossFileCallAdjuster(remappedFunctions))
} }
// TODO: no guarantee that module identity is preserved by `lower` // TODO: no guarantee that module identity is preserved by `lower`
@@ -199,26 +196,20 @@ private fun adjustDefaultArgumentStubs(
private class CrossFileCallAdjuster( private class CrossFileCallAdjuster(
val remappedFunctions: Map<IrSimpleFunctionSymbol, IrSimpleFunctionSymbol> val remappedFunctions: Map<IrSimpleFunctionSymbol, IrSimpleFunctionSymbol>
) : IrElementTransformerVoid() { ) : IrElementVisitorVoid {
override fun visitElement(element: IrElement) {
override fun visitSimpleFunction(declaration: IrSimpleFunction): IrStatement { element.acceptChildren(this, null)
declaration.overriddenSymbols = declaration.overriddenSymbols.map { remappedFunctions[it] ?: it }
return super.visitSimpleFunction(declaration)
} }
override fun visitCall(expression: IrCall): IrExpression { override fun visitSimpleFunction(declaration: IrSimpleFunction) {
expression.transformChildrenVoid(this) declaration.overriddenSymbols = declaration.overriddenSymbols.map { remappedFunctions[it] ?: it }
return remappedFunctions[expression.symbol]?.let { newSymbol -> declaration.acceptChildren(this, null)
with(expression) { }
IrCallImpl(
startOffset, endOffset, type, override fun visitCall(expression: IrCall) {
newSymbol, expression.acceptChildren(this, null)
typeArgumentsCount, valueArgumentsCount, origin, remappedFunctions[expression.symbol]?.let {
superQualifierSymbol // TODO expression.symbol = it
).apply { }
copyTypeAndValueArgumentsFrom(expression)
}
}
} ?: expression
} }
} }