[compose][hr] Add compose compiler flag to disable lambda memoization
diff --git a/plugins/compose/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/ComposeIrGenerationExtension.kt b/plugins/compose/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/ComposeIrGenerationExtension.kt
index 8a08035..88e5543 100644
--- a/plugins/compose/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/ComposeIrGenerationExtension.kt
+++ b/plugins/compose/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/ComposeIrGenerationExtension.kt
@@ -49,6 +49,7 @@
     private val descriptorSerializerContext: ComposeDescriptorSerializerContext? = null,
     private val featureFlags: FeatureFlags,
     private val skipIfRuntimeNotFound: Boolean = false,
+    private val lambdaMemoization: Boolean = true,
     private val messageCollector: MessageCollector,
 ) : IrGenerationExtension {
     var metrics: ModuleMetrics = EmptyModuleMetrics
@@ -155,12 +156,14 @@
         ).lower(moduleFragment)
 
         // Memoize normal lambdas and wrap composable lambdas
-        ComposerLambdaMemoization(
-            pluginContext,
-            metrics,
-            stabilityInferencer,
-            featureFlags,
-        ).lower(moduleFragment)
+        if (lambdaMemoization) {
+            ComposerLambdaMemoization(
+                pluginContext,
+                metrics,
+                stabilityInferencer,
+                featureFlags,
+            ).lower(moduleFragment)
+        }
 
         // transform all composable functions to have an extra synthetic composer
         // parameter. this will also transform all types and calls to include the extra
diff --git a/plugins/compose/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/ComposePlugin.kt b/plugins/compose/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/ComposePlugin.kt
index f4fc5d4..8fcf01d 100644
--- a/plugins/compose/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/ComposePlugin.kt
+++ b/plugins/compose/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/ComposePlugin.kt
@@ -80,6 +80,9 @@
         )
     val SKIP_IR_LOWERING_IF_RUNTIME_NOT_FOUND_KEY =
         CompilerConfigurationKey<Boolean>("Skip IR lowering transformation when finding Compose runtime fails")
+
+    val LAMBDA_MEMOIZATION_ENABLED_KEY =
+        CompilerConfigurationKey<Boolean>("Enable lambda memoization")
 }
 
 @OptIn(ExperimentalCompilerApi::class)
@@ -207,6 +210,13 @@
             required = false,
             allowMultipleOccurrences = false
         )
+
+        val LAMBDA_MEMOIZATION = CliOption(
+            "lambdaMemoization",
+            "<true|false>",
+            "Memoize lambda instances for composition",
+            required = false,
+        )
     }
 
     override val pluginId = PLUGIN_ID
@@ -227,6 +237,7 @@
         TRACE_MARKERS_OPTION,
         FEATURE_FLAG_OPTION,
         SKIP_IR_LOWERING_IF_RUNTIME_NOT_FOUND_OPTION,
+        LAMBDA_MEMOIZATION,
     )
 
     override fun processOption(
@@ -329,6 +340,12 @@
             ComposeConfiguration.SKIP_IR_LOWERING_IF_RUNTIME_NOT_FOUND_KEY,
             value == "true"
         )
+
+        LAMBDA_MEMOIZATION -> configuration.put(
+            ComposeConfiguration.LAMBDA_MEMOIZATION_ENABLED_KEY,
+            value == "true"
+        )
+
         else -> throw CliOptionProcessingException("Unknown option: ${option.optionName}")
     }
 }
@@ -667,6 +684,11 @@
                 ComposeConfiguration.SKIP_IR_LOWERING_IF_RUNTIME_NOT_FOUND_KEY,
             )
 
+            val lambdaMemoization = configuration.get(
+                ComposeConfiguration.LAMBDA_MEMOIZATION_ENABLED_KEY,
+                true
+            )
+
             val featureFlags = FeatureFlags(
                 configuration.get(
                     ComposeConfiguration.FEATURE_FLAGS, emptyList()
@@ -723,6 +745,7 @@
                 descriptorSerializerContext = descriptorSerializerContext,
                 featureFlags = featureFlags,
                 skipIfRuntimeNotFound = skipIrLoweringIfRuntimeNotFound,
+                lambdaMemoization = lambdaMemoization,
                 messageCollector = configuration.messageCollector,
             )
         }