From 181965f6e8330d891be4e1921a4cb6cd0b023231 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Wed, 1 Jul 2020 02:55:04 +0200 Subject: [PATCH] IR: inline namedIrModulePhase and namedIrFilePhase phase builders Construct NamedCompilerPhase directly instead. Only use phase builders where the code becomes easier to read. --- .../backend/common/phaser/CompilerPhase.kt | 2 +- .../backend/common/phaser/PhaseBuilders.kt | 38 ++---------------- .../kotlin/ir/backend/js/JsLoweringPhases.kt | 18 +++------ .../jetbrains/kotlin/backend/jvm/JvmLower.kt | 23 +++++------ .../jvm/lower/GenerateMultifileFacades.kt | 40 +++++++------------ .../kotlin/backend/wasm/WasmLoweringPhases.kt | 29 +++++--------- 6 files changed, 43 insertions(+), 107 deletions(-) diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/phaser/CompilerPhase.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/phaser/CompilerPhase.kt index c0e6bfd977d..4fe63a52b75 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/phaser/CompilerPhase.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/phaser/CompilerPhase.kt @@ -67,7 +67,7 @@ infix operator fun Action.plus(other: Action( val name: String, val description: String, - val prerequisite: Set>, + val prerequisite: Set> = emptySet(), private val lower: CompilerPhase, val preconditions: Set> = emptySet(), val postconditions: Set> = emptySet(), diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/phaser/PhaseBuilders.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/phaser/PhaseBuilders.kt index 04655a4af5f..6924d2f019c 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/phaser/PhaseBuilders.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/phaser/PhaseBuilders.kt @@ -48,40 +48,10 @@ infix fun CompilerPhase) phases + unsafeOther else listOf(unsafeThis, unsafeOther)) } -fun namedIrModulePhase( - name: String, - description: String, - prerequisite: Set> = emptySet(), - lower: CompilerPhase, - preconditions: Set> = emptySet(), - postconditions: Set> = emptySet(), - stickyPostconditions: Set> = lower.stickyPostconditions, - actions: Set> = setOf(defaultDumper, validationAction), - nlevels: Int = 1 -): NamedCompilerPhase = - NamedCompilerPhase( - name, description, prerequisite, lower, preconditions, postconditions, stickyPostconditions, actions, nlevels - ) - -fun namedIrFilePhase( - name: String, - description: String, - prerequisite: Set> = emptySet(), - lower: CompilerPhase, - preconditions: Set> = emptySet(), - postconditions: Set> = emptySet(), - stickyPostconditions: Set> = lower.stickyPostconditions, - actions: Set> = setOf(defaultDumper, validationAction), - nlevels: Int = 1 -): NamedCompilerPhase = - NamedCompilerPhase( - name, description, prerequisite, lower, preconditions, postconditions, stickyPostconditions, actions, nlevels - ) - fun makeCustomPhase( op: (Context, Element) -> Unit, - description: String, name: String, + description: String, prerequisite: Set> = emptySet(), preconditions: Set> = emptySet(), postconditions: Set> = emptySet(), @@ -134,7 +104,7 @@ fun performByIrFile( description: String = "Perform phases by IrFile", lower: List> ): NamedCompilerPhase = - namedIrModulePhase( + NamedCompilerPhase( name, description, emptySet(), PerformByIrFilePhase(lower), emptySet(), emptySet(), emptySet(), setOf(defaultDumper), nlevels = 1, ) @@ -173,7 +143,7 @@ fun makeIrFilePhase( stickyPostconditions: Set> = emptySet(), actions: Set> = setOf(defaultDumper, validationAction) ): NamedCompilerPhase = - namedIrFilePhase( + NamedCompilerPhase( name, description, prerequisite, FileLoweringPhaseAdapter(lowering), preconditions, postconditions, stickyPostconditions, actions, nlevels = 0, ) @@ -197,7 +167,7 @@ fun makeIrModulePhase( stickyPostconditions: Set> = emptySet(), actions: Set> = setOf(defaultDumper, validationAction) ): NamedCompilerPhase = - namedIrModulePhase( + NamedCompilerPhase( name, description, prerequisite, ModuleLoweringPhaseAdapter(lowering), preconditions, postconditions, stickyPostconditions, actions, nlevels = 0, ) diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsLoweringPhases.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsLoweringPhases.kt index be00891644e..8b7bfe650b3 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsLoweringPhases.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsLoweringPhases.kt @@ -34,7 +34,7 @@ private fun makeJsModulePhase( name: String, description: String, prerequisite: Set> = emptySet() -) = makeCustomJsModulePhase( +): NamedCompilerPhase> = makeCustomJsModulePhase( op = { context, modules -> lowering(context).lower(modules) }, name = name, description = description, @@ -46,7 +46,7 @@ private fun makeCustomJsModulePhase( description: String, name: String, prerequisite: Set> = emptySet() -) = NamedCompilerPhase( +): NamedCompilerPhase> = NamedCompilerPhase( name = name, description = description, prerequisite = prerequisite, @@ -63,11 +63,7 @@ private fun makeCustomJsModulePhase( return input } }, - preconditions = emptySet(), - postconditions = emptySet(), - stickyPostconditions = emptySet(), actions = setOf(defaultDumper.toMultiModuleAction(), validationAction.toMultiModuleAction()), - nlevels = 0 ) private fun Action.toMultiModuleAction(): Action, C> { @@ -735,12 +731,10 @@ val pirLowerings = loweringList.filter { it is DeclarationLowering || it is Body val jsPhases = NamedCompilerPhase( name = "IrModuleLowering", description = "IR module lowering", - prerequisite = emptySet(), - lower = loweringList.map { it.modulePhase as CompilerPhase, Iterable> } - .reduce { acc, lowering -> acc.then(lowering) }, - preconditions = emptySet(), - postconditions = emptySet(), - stickyPostconditions = emptySet(), + lower = loweringList.map { + @Suppress("USELESS_CAST") + it.modulePhase as CompilerPhase, Iterable> + }.reduce { acc, lowering -> acc.then(lowering) }, actions = setOf(defaultDumper.toMultiModuleAction(), validationAction.toMultiModuleAction()), nlevels = 1 ) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt index d0cf0780e56..0c4939a4e5c 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt @@ -28,23 +28,18 @@ import org.jetbrains.kotlin.ir.visitors.acceptVoid import org.jetbrains.kotlin.load.java.JavaVisibilities import org.jetbrains.kotlin.name.NameUtils -private fun makePatchParentsPhase(number: Int) = namedIrFilePhase( - lower = object : SameTypeCompilerPhase { - override fun invoke( - phaseConfig: PhaseConfig, - phaserState: PhaserState, - context: CommonBackendContext, - input: IrFile - ): IrFile { - input.acceptVoid(PatchDeclarationParentsVisitor()) - return input - } - }, +private fun makePatchParentsPhase(number: Int): NamedCompilerPhase = makeIrFilePhase( + { PatchDeclarationParents() }, name = "PatchParents$number", description = "Patch parent references in IrFile, pass $number", - nlevels = 0 ) +private class PatchDeclarationParents : FileLoweringPass { + override fun lower(irFile: IrFile) { + irFile.acceptVoid(PatchDeclarationParentsVisitor()) + } +} + private val validateIrBeforeLowering = makeCustomPhase( { context, module -> validationCallback(context, module, checkProperties = true) }, name = "ValidateIrBeforeLowering", @@ -374,7 +369,7 @@ private val jvmFilePhases = listOf( makePatchParentsPhase(3) ) -val jvmPhases = namedIrModulePhase( +val jvmPhases = NamedCompilerPhase( name = "IrLowering", description = "IR lowering", lower = validateIrBeforeLowering then diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/GenerateMultifileFacades.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/GenerateMultifileFacades.kt index e2df3cf9328..ed012c8be21 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/GenerateMultifileFacades.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/GenerateMultifileFacades.kt @@ -12,10 +12,7 @@ import org.jetbrains.kotlin.backend.common.ir.createImplicitParameterDeclaration import org.jetbrains.kotlin.backend.common.ir.passTypeArgumentsFrom import org.jetbrains.kotlin.backend.common.lower import org.jetbrains.kotlin.backend.common.lower.createIrBuilder -import org.jetbrains.kotlin.backend.common.phaser.PhaseConfig -import org.jetbrains.kotlin.backend.common.phaser.PhaserState -import org.jetbrains.kotlin.backend.common.phaser.SameTypeCompilerPhase -import org.jetbrains.kotlin.backend.common.phaser.namedIrModulePhase +import org.jetbrains.kotlin.backend.common.phaser.makeCustomPhase import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin import org.jetbrains.kotlin.backend.jvm.codegen.fileParent @@ -45,35 +42,26 @@ import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.inline.INLINE_ONLY_ANNOTATION_FQ_NAME import org.jetbrains.kotlin.resolve.jvm.JvmClassName -internal val generateMultifileFacadesPhase = namedIrModulePhase( +internal val generateMultifileFacadesPhase = makeCustomPhase( name = "GenerateMultifileFacades", description = "Generate JvmMultifileClass facades, based on the information provided by FileClassLowering", prerequisite = setOf(fileClassPhase), - lower = object : SameTypeCompilerPhase { - override fun invoke( - phaseConfig: PhaseConfig, - phaserState: PhaserState, - context: JvmBackendContext, - input: IrModuleFragment - ): IrModuleFragment { - val functionDelegates = mutableMapOf() + op = { context, input -> + val functionDelegates = mutableMapOf() - // In -Xmultifile-parts-inherit mode, instead of generating "bridge" methods in the facade which call into parts, - // we construct an inheritance chain such that all part members are present as fake overrides in the facade. - val shouldGeneratePartHierarchy = context.state.languageVersionSettings.getFlag(JvmAnalysisFlags.inheritMultifileParts) - input.files.addAll( - generateMultifileFacades(input.descriptor, context, shouldGeneratePartHierarchy, functionDelegates) - ) + // In -Xmultifile-parts-inherit mode, instead of generating "bridge" methods in the facade which call into parts, + // we construct an inheritance chain such that all part members are present as fake overrides in the facade. + val shouldGeneratePartHierarchy = context.state.languageVersionSettings.getFlag(JvmAnalysisFlags.inheritMultifileParts) + input.files.addAll( + generateMultifileFacades(input.descriptor, context, shouldGeneratePartHierarchy, functionDelegates) + ) - UpdateFunctionCallSites(functionDelegates).lower(input) - UpdateConstantFacadePropertyReferences(context, shouldGeneratePartHierarchy).lower(input) + UpdateFunctionCallSites(functionDelegates).lower(input) + UpdateConstantFacadePropertyReferences(context, shouldGeneratePartHierarchy).lower(input) - context.multifileFacadesToAdd.clear() + context.multifileFacadesToAdd.clear() - functionDelegates.entries.associateTo(context.multifileFacadeMemberToPartMember) { (member, newMember) -> newMember to member } - - return input - } + functionDelegates.entries.associateTo(context.multifileFacadeMemberToPartMember) { (member, newMember) -> newMember to member } } ) diff --git a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/WasmLoweringPhases.kt b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/WasmLoweringPhases.kt index 07464d23a7a..f811273dade 100644 --- a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/WasmLoweringPhases.kt +++ b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/WasmLoweringPhases.kt @@ -27,31 +27,20 @@ private fun makeWasmModulePhase( name: String, description: String, prerequisite: Set> = emptySet() -) = makeIrModulePhase(lowering, name, description, prerequisite, actions = setOf(validationAction, defaultDumper)) +): NamedCompilerPhase = + makeIrModulePhase( + lowering, name, description, prerequisite, actions = setOf(validationAction, defaultDumper) + ) private fun makeCustomWasmModulePhase( op: (WasmBackendContext, IrModuleFragment) -> Unit, description: String, name: String, prerequisite: Set> = emptySet() -) = namedIrModulePhase( - name, - description, - prerequisite, - actions = setOf(defaultDumper, validationAction), - nlevels = 0, - lower = object : SameTypeCompilerPhase { - override fun invoke( - phaseConfig: PhaseConfig, - phaserState: PhaserState, - context: WasmBackendContext, - input: IrModuleFragment - ): IrModuleFragment { - op(context, input) - return input - } - } -) +): NamedCompilerPhase = + makeCustomPhase( + op, name, description, prerequisite, actions = setOf(defaultDumper, validationAction), nlevels = 0, + ) private val validateIrBeforeLowering = makeCustomWasmModulePhase( { context, module -> validationCallback(context, module) }, @@ -351,7 +340,7 @@ private val objectUsageLoweringPhase = makeWasmModulePhase( description = "Transform IrGetObjectValue into instance generator call" ) -val wasmPhases = namedIrModulePhase( +val wasmPhases = NamedCompilerPhase( name = "IrModuleLowering", description = "IR module lowering", lower = validateIrBeforeLowering then