[JS IR] IC invalidation performance improvements

- Cache signature readers and deserializers
 - Cache inline function hashes
 - IC refactoring
 - [gradle] Use hash of module path for cache dir; Fix KT-51238

^KT-51238 Fixed
This commit is contained in:
Alexander Korepanov
2022-02-10 12:23:24 +03:00
committed by Space
parent 290a06676d
commit 43a0876c26
22 changed files with 315 additions and 257 deletions
@@ -254,29 +254,25 @@ abstract class AbstractInvalidationTest : KotlinTestWithEnvironment() {
mainArguments: List<String>?,
executor: CacheExecutor
): CacheUpdateStatus {
val (libraries, dependencyGraph, configMD5) = CacheConfiguration(dependencies, compilerConfiguration)
val modulePath = moduleName.toCanonicalPath()
val icCacheMap: Map<ModulePath, CacheInfo> = loadCacheInfo(icCachePaths).also {
it[modulePath] = CacheInfo.loadOrCreate(
cachePath,
moduleName,
configHash = configMD5
)
it[modulePath] = CacheInfo.loadOrCreate(cachePath, modulePath)
}
return actualizeCacheForModule(
moduleName = modulePath,
cachePath = cachePath,
compilerConfiguration = compilerConfiguration,
configMD5 = configMD5,
libraries = libraries,
dependencyGraph = dependencyGraph,
icCacheMap = icCacheMap,
irFactory = irFactory,
mainArguments = mainArguments,
executor = executor
)
val statuses = mutableMapOf<String, CacheUpdateStatus>()
actualizeCaches(
modulePath,
compilerConfiguration,
dependencies,
icCacheMap.map { it.value.path },
{ irFactory },
mainArguments,
executor
) { updateStatus, updatedModule ->
statuses[updatedModule] = updateStatus
}
return statuses[modulePath] ?: error("Status is missed for $modulePath")
}
private fun KotlinCoreEnvironment.createPsiFile(file: File): KtFile {
@@ -347,4 +343,4 @@ abstract class AbstractInvalidationTest : KotlinTestWithEnvironment() {
const val TEST_DATA_DIR_PATH = "js/js.translator/testData/"
}
}
}
@@ -112,6 +112,9 @@ class TestModuleCache(val files: MutableMap<String, FileCache>) {
files.remove(path)
}
override fun invalidate() {
}
override fun commitLibraryInfo(libraryPath: String, moduleName: String, flatHash: ULong, transHash: ULong, configHash: ULong) {
storedModuleName = moduleName
}
@@ -100,6 +100,11 @@ public class InvalidationTestGenerated extends AbstractInvalidationTest {
runTest("js/js.translator/testData/incremental/invalidation/jsExport/");
}
@TestMetadata("mainModuleInvalidation")
public void testMainModuleInvalidation() throws Exception {
runTest("js/js.translator/testData/incremental/invalidation/mainModuleInvalidation/");
}
@TestMetadata("moveFilesBetweenModules")
public void testMoveFilesBetweenModules() throws Exception {
runTest("js/js.translator/testData/incremental/invalidation/moveFilesBetweenModules/");
@@ -0,0 +1 @@
fun qux() = 42
@@ -0,0 +1,6 @@
STEP 0:
dependencies: stdlib
dirty: l1.kt
STEP 1:
dependencies: stdlib
flags: FP
@@ -0,0 +1,2 @@
fun box() = qux()
@@ -0,0 +1,2 @@
fun box() = qux() + 88
@@ -0,0 +1,2 @@
fun box0() = qux()
@@ -0,0 +1,2 @@
fun box1() = qux()
@@ -0,0 +1,9 @@
STEP 0:
dependencies: stdlib, lib1
dirty: m.kt, m0.kt, m1.kt
STEP 1:
dependencies: stdlib, lib1
modifications:
U : m.kt.1.txt -> m.kt
dirty: m.kt
@@ -0,0 +1,7 @@
MODULES: lib1, main
STEP 0:
libs: lib1, main
STEP 1:
libs: lib1, main
@@ -5,3 +5,6 @@ STEP 1:
dependencies: stdlib
modifications:
D : l1_1.kt
STEP 2:
dependencies: stdlib
flags: FP
@@ -1,7 +1,8 @@
STEP 0:
dependencies: stdlib, lib1
dirty: m.kt
STEP 1:
dependencies: stdlib, lib1
flags: FP
STEP 2:
dependencies: stdlib, lib1
flags: FP
@@ -4,4 +4,7 @@ STEP 0:
libs: lib1, main
STEP 1:
libs: lib1, main
libs: lib1, main
STEP 2:
libs: lib1, main