From c7feaee8ae21944922c8fb6d06195e6b45ded011 Mon Sep 17 00:00:00 2001 From: Georgy Bronnikov Date: Wed, 27 Jan 2021 11:03:54 +0300 Subject: [PATCH] IR: make copying optional in performByIrFile For codegen phases, input files are readonly data. There is no need to copy them. --- .../backend/common/phaser/performByIrFile.kt | 26 ++++++++++++------- .../jetbrains/kotlin/backend/jvm/JvmLower.kt | 1 + 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/phaser/performByIrFile.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/phaser/performByIrFile.kt index 9c270533b62..7e27aec1325 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/phaser/performByIrFile.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/phaser/performByIrFile.kt @@ -30,15 +30,17 @@ import java.util.concurrent.atomic.AtomicReference fun performByIrFile( name: String = "PerformByIrFile", description: String = "Perform phases by IrFile", - lower: List> + copyBeforeLowering: Boolean = true, + lower: List>, ): NamedCompilerPhase = NamedCompilerPhase( - name, description, emptySet(), PerformByIrFilePhase(lower), emptySet(), emptySet(), emptySet(), + name, description, emptySet(), PerformByIrFilePhase(lower, copyBeforeLowering), emptySet(), emptySet(), emptySet(), setOf(defaultDumper), nlevels = 1, ) private class PerformByIrFilePhase( - private val lower: List> + private val lower: List>, + private val copyBeforeLowering: Boolean, ) : SameTypeCompilerPhase { override fun invoke( phaseConfig: PhaseConfig, @@ -85,7 +87,10 @@ private class PerformByIrFilePhase( // Each thread needs its own copy of phaserState.alreadyDone val filesAndStates = input.files.map { - it.copySavingMappings(remappedFiles, remappedFunctions, remappedClasses) to phaserState.copyOf() + if (copyBeforeLowering) + it.copySavingMappings(remappedFiles, remappedFunctions, remappedClasses) to phaserState.copyOf() + else + it to phaserState.copyOf() } val executor = Executors.newFixedThreadPool(nThreads) @@ -111,12 +116,15 @@ private class PerformByIrFilePhase( // Presumably each thread has run through the same list of phases. phaserState.alreadyDone.addAll(filesAndStates[0].second.alreadyDone) - input.files.clear() - input.files.addAll(filesAndStates.map { (irFile, _) -> irFile }.toMutableList()) + // Repair after working on copied files. + if (copyBeforeLowering) { + input.files.clear() + input.files.addAll(filesAndStates.map { (irFile, _) -> irFile }.toMutableList()) - adjustDefaultArgumentStubs(context, remappedFunctions) - context.handleDeepCopy(remappedFiles, remappedClasses, remappedFunctions) - input.transformChildrenVoid(CrossFileCallAdjuster(remappedFunctions)) + adjustDefaultArgumentStubs(context, remappedFunctions) + context.handleDeepCopy(remappedFiles, remappedClasses, remappedFunctions) + input.transformChildrenVoid(CrossFileCallAdjuster(remappedFunctions)) + } // TODO: no guarantee that module identity is preserved by `lower` return input 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 a9efad3802d..82b54f47841 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 @@ -287,6 +287,7 @@ private fun codegenPhase(generateMultifileFacade: Boolean): NamedCompilerPhase