[Wasm] Better naming for the DCE dump declaration storage
diff --git a/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/K2JsIrCompiler.kt b/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/K2JsIrCompiler.kt index 75b8632..3863951 100644 --- a/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/K2JsIrCompiler.kt +++ b/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/K2JsIrCompiler.kt
@@ -40,7 +40,7 @@ import org.jetbrains.kotlin.incremental.js.IncrementalNextRoundChecker import org.jetbrains.kotlin.incremental.js.IncrementalResultsConsumer import org.jetbrains.kotlin.ir.backend.js.* -import org.jetbrains.kotlin.ir.backend.js.dce.DceDumpNameCache +import org.jetbrains.kotlin.ir.backend.js.dce.DceDumpDeclarationStorage import org.jetbrains.kotlin.ir.backend.js.dce.dumpDeclarationIrSizesIfNeed import org.jetbrains.kotlin.ir.backend.js.dce.dumpExtendedDeclarationsIrSizes import org.jetbrains.kotlin.ir.backend.js.ic.* @@ -361,7 +361,7 @@ exportedDeclarations = setOf(FqName("main")), propertyLazyInitialization = arguments.irPropertyLazyInitialization, ) - val dceDumpNameCache = DceDumpNameCache() + val dceDumpNameCache = DceDumpDeclarationStorage() if (arguments.irDce) { eliminateDeadDeclarations(allModules, backendContext, dceDumpNameCache) }
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/dce/Dce.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/dce/Dce.kt index 845c9fc..42f18cc 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/dce/Dce.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/dce/Dce.kt
@@ -23,7 +23,7 @@ modules: Iterable<IrModuleFragment>, context: JsIrBackendContext, removeUnusedAssociatedObjects: Boolean = true, - dceDumpNameCache: DceDumpNameCache, + dceDumpNameCache: DceDumpDeclarationStorage, ) { val allRoots = buildRoots(modules, context)
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/dce/DceDumpNameCache.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/dce/DceDumpDeclarationStorage.kt similarity index 65% rename from compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/dce/DceDumpNameCache.kt rename to compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/dce/DceDumpDeclarationStorage.kt index 9a98db1..fa4aad2 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/dce/DceDumpNameCache.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/dce/DceDumpDeclarationStorage.kt
@@ -7,11 +7,10 @@ import org.jetbrains.kotlin.ir.declarations.IrDeclaration -class DceDumpNameCache { +class DceDumpDeclarationStorage { /** - * This cache provides better dumping names for reachability and ir sizes infos. - * The problem is that dumps contain several same named objects that should be consistently renamed. - * The name for the first declaration with some name isn't changed. For other names suffix (i) is added, where i >= 1 + * This storage is used to store declarations and information about duplicated names. + * This storage solves the problem of distinguishing between same-rendered declarations (e.g., extension functions for collections) */ private val nameCache: MutableMap<IrDeclaration, String> = hashMapOf() private val indexCache: MutableMap<String, Int> = hashMapOf() @@ -24,5 +23,6 @@ else "$fqName ($index)" } - public fun getDceDumpNames(): Set<IrDeclaration> = nameCache.keys + public val allCachedDeclarations: Set<IrDeclaration> + get() = nameCache.keys } \ No newline at end of file
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/dce/UsefulDeclarationProcessor.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/dce/UsefulDeclarationProcessor.kt index 48b6c58..1fcd262 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/dce/UsefulDeclarationProcessor.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/dce/UsefulDeclarationProcessor.kt
@@ -236,7 +236,7 @@ protected open fun handleAssociatedObjects(): Unit = Unit - fun collectDeclarations(rootDeclarations: Iterable<IrDeclaration>, dceDumpNameCache: DceDumpNameCache): Set<IrDeclaration> { + fun collectDeclarations(rootDeclarations: Iterable<IrDeclaration>, dceDumpNameCache: DceDumpDeclarationStorage): Set<IrDeclaration> { rootDeclarations.forEach { it.enqueue(it, "<ROOT>") @@ -306,7 +306,7 @@ private fun transformToStringBy( reachabilityInfos: List<ReachabilityInfo>, separator: String, - dceDumpNameCache: DceDumpNameCache, + dceDumpNameCache: DceDumpDeclarationStorage, transformer: (sourceFqn: String, targetFqn: String, description: String, isTargetContagious: Boolean) -> String, ): String { return reachabilityInfos @@ -322,7 +322,7 @@ .joinToString(separator) } -private fun transformToDotLikeString(reachabilityInfos: List<ReachabilityInfo>, dceDumpNameCache: DceDumpNameCache): String { +private fun transformToDotLikeString(reachabilityInfos: List<ReachabilityInfo>, dceDumpNameCache: DceDumpDeclarationStorage): String { return transformToStringBy(reachabilityInfos, "\n", dceDumpNameCache) { sourceFqn, targetFqn, description, isTargetContagious -> val comment = description + (if (isTargetContagious) "[CONTAGIOUS!]" else "") val info = "\"$sourceFqn\" -> \"$targetFqn\"" + (if (comment.isBlank()) "" else " // $comment") @@ -331,7 +331,7 @@ } } -private fun transformToJsonString(reachabilityInfos: List<ReachabilityInfo>, dceDumpNameCache: DceDumpNameCache): String { +private fun transformToJsonString(reachabilityInfos: List<ReachabilityInfo>, dceDumpNameCache: DceDumpDeclarationStorage): String { return "[\n" + transformToStringBy(reachabilityInfos, ",\n", dceDumpNameCache) { sourceFqn, targetFqn, description, isTargetContagious -> """ | { @@ -343,6 +343,6 @@ } + "\n]" } -private fun transformToJsConstDeclaration(reachabilityInfos: List<ReachabilityInfo>, dceDumpNameCache: DceDumpNameCache): String { +private fun transformToJsConstDeclaration(reachabilityInfos: List<ReachabilityInfo>, dceDumpNameCache: DceDumpDeclarationStorage): String { return "export const kotlinReachabilityInfos = " + transformToJsonString(reachabilityInfos, dceDumpNameCache) + ";" }
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/dce/utils.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/dce/utils.kt index e1a09d6..573a535 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/dce/utils.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/dce/utils.kt
@@ -64,7 +64,7 @@ internal data class IrDeclarationDumpInfo(val fqName: String, val displayName: String, val type: String, val size: Int) -fun dumpDeclarationIrSizesIfNeed(path: String?, allModules: List<IrModuleFragment>, dceDumpNameCache: DceDumpNameCache) { +fun dumpDeclarationIrSizesIfNeed(path: String?, allModules: List<IrModuleFragment>, dceDumpNameCache: DceDumpDeclarationStorage) { if (path == null) return val declarations = linkedSetOf<IrDeclarationDumpInfo>() @@ -101,11 +101,11 @@ dumpIrDeclarationSizes(declarations, File(path)) } -fun dumpExtendedDeclarationsIrSizes(path: String?, dceDumpNameCache: DceDumpNameCache) { +fun dumpExtendedDeclarationsIrSizes(path: String?, dceDumpNameCache: DceDumpDeclarationStorage) { if (path == null) { return } - val extendedDeclarations = dceDumpNameCache.getDceDumpNames().map { + val extendedDeclarations = dceDumpNameCache.allCachedDeclarations.map { val type = when (it) { is IrFunction -> "function" is IrProperty -> "property"
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/optimizations.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/optimizations.kt index e6b7af9..50e35f2 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/optimizations.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/optimizations.kt
@@ -7,8 +7,7 @@ import org.jetbrains.kotlin.backend.common.phaser.PhaseConfig import org.jetbrains.kotlin.backend.common.phaser.PhaserState -import org.jetbrains.kotlin.backend.common.phaser.invokeToplevel -import org.jetbrains.kotlin.ir.backend.js.dce.DceDumpNameCache +import org.jetbrains.kotlin.ir.backend.js.dce.DceDumpDeclarationStorage import org.jetbrains.kotlin.ir.backend.js.dce.eliminateDeadDeclarations import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.JsIrProgramFragment import org.jetbrains.kotlin.ir.declarations.IrModuleFragment @@ -23,7 +22,7 @@ context: JsIrBackendContext, removeUnusedAssociatedObjects: Boolean ) { - val dceDumpNameCache = DceDumpNameCache() // in JS mode only DCE Graph could be dumped + val dceDumpNameCache = DceDumpDeclarationStorage() // in JS mode only DCE Graph could be dumped eliminateDeadDeclarations(modules, context, removeUnusedAssociatedObjects, dceDumpNameCache) val phaseConfig = PhaseConfig(jsOptimizationPhases)
diff --git a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/dce/Dce.kt b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/dce/Dce.kt index 6f822d3..b20a009 100644 --- a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/dce/Dce.kt +++ b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/dce/Dce.kt
@@ -7,9 +7,8 @@ import org.jetbrains.kotlin.backend.wasm.WasmBackendContext import org.jetbrains.kotlin.backend.wasm.ir2wasm.isExported -import org.jetbrains.kotlin.backend.wasm.utils.getWasmExportNameIfWasmExport import org.jetbrains.kotlin.ir.IrElement -import org.jetbrains.kotlin.ir.backend.js.dce.DceDumpNameCache +import org.jetbrains.kotlin.ir.backend.js.dce.DceDumpDeclarationStorage import org.jetbrains.kotlin.ir.backend.js.utils.* import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.IrBody @@ -19,7 +18,7 @@ import org.jetbrains.kotlin.ir.visitors.acceptVoid import org.jetbrains.kotlin.js.config.JSConfigurationKeys -fun eliminateDeadDeclarations(modules: List<IrModuleFragment>, context: WasmBackendContext, dceDumpNameCache: DceDumpNameCache) { +fun eliminateDeadDeclarations(modules: List<IrModuleFragment>, context: WasmBackendContext, dceDumpNameCache: DceDumpDeclarationStorage) { val printReachabilityInfo = context.configuration.getBoolean(JSConfigurationKeys.PRINT_REACHABILITY_INFO) || java.lang.Boolean.getBoolean("kotlin.wasm.dce.print.reachability.info")
diff --git a/wasm/wasm.tests/test/org/jetbrains/kotlin/wasm/test/converters/WasmBackendFacade.kt b/wasm/wasm.tests/test/org/jetbrains/kotlin/wasm/test/converters/WasmBackendFacade.kt index 3cf7b00..3a03d2d 100644 --- a/wasm/wasm.tests/test/org/jetbrains/kotlin/wasm/test/converters/WasmBackendFacade.kt +++ b/wasm/wasm.tests/test/org/jetbrains/kotlin/wasm/test/converters/WasmBackendFacade.kt
@@ -14,7 +14,7 @@ import org.jetbrains.kotlin.backend.wasm.wasmPhases import org.jetbrains.kotlin.ir.backend.js.MainModule import org.jetbrains.kotlin.ir.backend.js.ModulesStructure -import org.jetbrains.kotlin.ir.backend.js.dce.DceDumpNameCache +import org.jetbrains.kotlin.ir.backend.js.dce.DceDumpDeclarationStorage import org.jetbrains.kotlin.ir.backend.js.dce.dumpDeclarationIrSizesIfNeed import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImpl import org.jetbrains.kotlin.ir.linkage.partial.PartialLinkageConfig @@ -113,7 +113,7 @@ generateSourceMaps = generateSourceMaps ) - val dceDumpNameCache = DceDumpNameCache() + val dceDumpNameCache = DceDumpDeclarationStorage() eliminateDeadDeclarations(allModules, backendContext, dceDumpNameCache) dumpDeclarationIrSizesIfNeed(System.getProperty("kotlin.wasm.dump.declaration.ir.size.to.file"), allModules, dceDumpNameCache)