[FIR2IR] Clear out FIR bodies after conversion
Currently reduces heap by ~12%
diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt
index 57f6889..221276f 100644
--- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt
+++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt
@@ -19,6 +19,7 @@
import org.jetbrains.kotlin.fir.declarations.utils.*
import org.jetbrains.kotlin.fir.deserialization.toQualifiedPropertyAccessExpression
import org.jetbrains.kotlin.fir.expressions.*
+import org.jetbrains.kotlin.fir.expressions.builder.buildEmptyExpressionBlock
import org.jetbrains.kotlin.fir.expressions.impl.*
import org.jetbrains.kotlin.fir.extensions.extensionService
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
@@ -334,6 +335,9 @@
}
declarationStorage.leaveScope(irFunction.symbol)
+ // Save memory
+ codeFragment.replaceBlock(buildEmptyExpressionBlock())
+
return irFunction
}
@@ -353,6 +357,10 @@
memberGenerator.convertClassContent(irAnonymousObject, anonymousObject)
}
val anonymousClassType = irAnonymousObject.thisReceiver!!.type
+
+ // Save memory
+ anonymousObject.replaceControlFlowGraphReference(null)
+
return anonymousObject.convertWithOffsets { startOffset, endOffset ->
IrBlockImpl(
startOffset, endOffset, anonymousClassType, IrStatementOrigin.OBJECT_LITERAL,
@@ -393,6 +401,10 @@
irAnonymousInitializer.body = convertToIrBlockBody(anonymousInitializer.body!!)
}
declarationStorage.leaveScope(irAnonymousInitializer.symbol)
+
+ // Save memory
+ anonymousInitializer.replaceBody(null)
+
return irAnonymousInitializer
}
@@ -405,6 +417,7 @@
@OptIn(UnsafeDuringIrConstructionAPI::class)
declarationStorage.getCachedIrFunctionSymbol(simpleFunction)!!.owner
}
+
return conversionScope.withFunction(irFunction) {
memberGenerator.convertFunctionContent(
irFunction, simpleFunction, containingClass = conversionScope.containerFirClass()
diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/ClassMemberGenerator.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/ClassMemberGenerator.kt
index 1e7400e..2dc08a8 100644
--- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/ClassMemberGenerator.kt
+++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/ClassMemberGenerator.kt
@@ -50,7 +50,7 @@
internal class ClassMemberGenerator(
private val c: Fir2IrComponents,
private val visitor: Fir2IrVisitor,
- private val conversionScope: Fir2IrConversionScope
+ private val conversionScope: Fir2IrConversionScope,
) : Fir2IrComponents by c {
private fun <T : IrDeclaration> applyParentFromStackTo(declaration: T): T = conversionScope.applyParentFromStackTo(declaration)
@@ -100,6 +100,9 @@
}
}
declarationStorage.leaveScope(irClass.symbol)
+
+ // Save memory
+ klass.replaceControlFlowGraphReference(null)
}
fun <T : IrFunction> convertFunctionContent(irFunction: T, firFunction: FirFunction?, containingClass: FirClass?): T {
@@ -201,6 +204,15 @@
// Scope for primary constructor should be left after class declaration
declarationStorage.leaveScope(irFunction.symbol)
}
+
+ // Save memory
+ if (firFunction != null) {
+ firFunction.replaceBody(null)
+ firFunction.replaceControlFlowGraphReference(null)
+ firFunction.valueParameters.forEach {
+ it.replaceControlFlowGraphReference(null)
+ }
+ }
}
return irFunction
}
@@ -228,6 +240,11 @@
)
}
annotationGenerator.generate(irProperty, property)
+
+ // Save memory
+ property.replaceInitializer(null)
+ property.replaceControlFlowGraphReference(null)
+
return irProperty
}
@@ -240,12 +257,17 @@
}
declarationStorage.leaveScope(irField.symbol)
}
+
+ // Save memory
+ field.replaceInitializer(null)
+ field.replaceControlFlowGraphReference(null)
+
return irField
}
private fun IrProperty.initializeBackingField(
property: FirProperty,
- initializerExpression: FirExpression?
+ initializerExpression: FirExpression?,
) {
val irField = backingField ?: return
conversionScope.withParent(irField) {
@@ -272,13 +294,17 @@
declarationStorage.leaveScope(this@initializeBackingField.symbol)
}
property.backingField?.let { annotationGenerator.generate(irField, it) }
+
+
+ // Save memory
+ property.backingField?.replaceInitializer(null)
}
private fun IrSimpleFunction.setPropertyAccessorContent(
propertyAccessor: FirPropertyAccessor?,
correspondingProperty: IrProperty,
propertyType: IrType,
- isDefault: Boolean
+ isDefault: Boolean,
) {
conversionScope.withFunction(this) {
applyParentFromStackTo(this)
@@ -311,6 +337,11 @@
}
}
}
+
+
+ // Save memory
+ propertyAccessor?.replaceBody(null)
+ propertyAccessor?.replaceControlFlowGraphReference(null)
}
private fun IrFieldAccessExpression.setReceiver(declaration: IrDeclaration): IrFieldAccessExpression {
diff --git a/compiler/ir/backend.jvm/entrypoint/src/org/jetbrains/kotlin/backend/jvm/JvmIrCodegenFactory.kt b/compiler/ir/backend.jvm/entrypoint/src/org/jetbrains/kotlin/backend/jvm/JvmIrCodegenFactory.kt
index 1306fef..9ca2b83 100644
--- a/compiler/ir/backend.jvm/entrypoint/src/org/jetbrains/kotlin/backend/jvm/JvmIrCodegenFactory.kt
+++ b/compiler/ir/backend.jvm/entrypoint/src/org/jetbrains/kotlin/backend/jvm/JvmIrCodegenFactory.kt
@@ -357,6 +357,9 @@
jvmLoweringPhases.invokeToplevel(phaseConfig, context, irModuleFragment)
+ println("!!!!!!!!!!!!!")
+ Thread.sleep(111111111111)
+
return JvmIrCodegenInput(state, context, irModuleFragment, notifyCodegenStart)
}