[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)
     }