[Compose] Fix code generation for group optimization Fixes a code generation issue added with fc48dbdba that caused the generation of && and || that contained composable functions to fail IR validation. Fixes: [346821372](https://issuetracker.google.com/346821372)
diff --git "a/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testAND\133useFir = false\135.txt" "b/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testAND\133useFir = false\135.txt" index 9040a49..dfa0afc 100644 --- "a/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testAND\133useFir = false\135.txt" +++ "b/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testAND\133useFir = false\135.txt"
@@ -21,19 +21,24 @@ @NonRestartableComposable @Composable fun Example(%composer: Composer?, %changed: Int) { - sourceInformationMarkerStart(%composer, <>, "C(Example):Test.kt") + sourceInformationMarkerStart(%composer, <>, "C(Example)<B()>:Test.kt") if (isTraceInProgress()) { traceEventStart(<>, %changed, -1, <>) } - %composer.startReplaceGroup(<>) - sourceInformation(%composer, "<B()>") - val tmp1_group = B(%composer, 0) - %composer.endReplaceGroup() - tmp1_group && %composer.startReplaceGroup(<>) - sourceInformation(%composer, "<B()>") - val tmp0_group = B(%composer, 0) - %composer.endReplaceGroup() - tmp0_group + when { + B(%composer, 0) -> { + %composer.startReplaceGroup(<>) + sourceInformation(%composer, "<B()>") + val tmp0_group = B(%composer, 0) + %composer.endReplaceGroup() + tmp0_group + } + else -> { + %composer.startReplaceGroup(<>) + %composer.endReplaceGroup() + false + } + } if (isTraceInProgress()) { traceEventEnd() }
diff --git "a/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testAND\133useFir = true\135.txt" "b/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testAND\133useFir = true\135.txt" index 9040a49..dfa0afc 100644 --- "a/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testAND\133useFir = true\135.txt" +++ "b/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testAND\133useFir = true\135.txt"
@@ -21,19 +21,24 @@ @NonRestartableComposable @Composable fun Example(%composer: Composer?, %changed: Int) { - sourceInformationMarkerStart(%composer, <>, "C(Example):Test.kt") + sourceInformationMarkerStart(%composer, <>, "C(Example)<B()>:Test.kt") if (isTraceInProgress()) { traceEventStart(<>, %changed, -1, <>) } - %composer.startReplaceGroup(<>) - sourceInformation(%composer, "<B()>") - val tmp1_group = B(%composer, 0) - %composer.endReplaceGroup() - tmp1_group && %composer.startReplaceGroup(<>) - sourceInformation(%composer, "<B()>") - val tmp0_group = B(%composer, 0) - %composer.endReplaceGroup() - tmp0_group + when { + B(%composer, 0) -> { + %composer.startReplaceGroup(<>) + sourceInformation(%composer, "<B()>") + val tmp0_group = B(%composer, 0) + %composer.endReplaceGroup() + tmp0_group + } + else -> { + %composer.startReplaceGroup(<>) + %composer.endReplaceGroup() + false + } + } if (isTraceInProgress()) { traceEventEnd() }
diff --git "a/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testDynamicWrappingGroupWithReturnValue\133useFir = false\135.txt" "b/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testDynamicWrappingGroupWithReturnValue\133useFir = false\135.txt" index 7d41355..7ee900d 100644 --- "a/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testDynamicWrappingGroupWithReturnValue\133useFir = false\135.txt" +++ "b/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testDynamicWrappingGroupWithReturnValue\133useFir = false\135.txt"
@@ -30,22 +30,13 @@ } val tmp0 = if (x > 0) { %composer.startReplaceGroup(<>) - sourceInformation(%composer, "") - val tmp3_group = <block>{ - if (%composer.startReplaceGroup(<>) - sourceInformation(%composer, "<B()>") - val tmp1_group = B(%composer, 0) - %composer.endReplaceGroup() - tmp1_group) 1 else if (%composer.startReplaceGroup(<>) - sourceInformation(%composer, "<B()>") - val tmp2_group = B(%composer, 0) - %composer.endReplaceGroup() - tmp2_group) 2 else if (%composer.startReplaceGroup(<>) - %composer.endReplaceGroup() - true) 3 + sourceInformation(%composer, "<B()>,<B()>") + val tmp2_group = <block>{ + val tmp1_group = if (B(%composer, 0)) 1 else if (B(%composer, 0)) 2 else 3 + tmp1_group } %composer.endReplaceGroup() - tmp3_group + tmp2_group } else { %composer.startReplaceGroup(<>) %composer.endReplaceGroup()
diff --git "a/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testDynamicWrappingGroupWithReturnValue\133useFir = true\135.txt" "b/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testDynamicWrappingGroupWithReturnValue\133useFir = true\135.txt" index 7d41355..7ee900d 100644 --- "a/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testDynamicWrappingGroupWithReturnValue\133useFir = true\135.txt" +++ "b/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testDynamicWrappingGroupWithReturnValue\133useFir = true\135.txt"
@@ -30,22 +30,13 @@ } val tmp0 = if (x > 0) { %composer.startReplaceGroup(<>) - sourceInformation(%composer, "") - val tmp3_group = <block>{ - if (%composer.startReplaceGroup(<>) - sourceInformation(%composer, "<B()>") - val tmp1_group = B(%composer, 0) - %composer.endReplaceGroup() - tmp1_group) 1 else if (%composer.startReplaceGroup(<>) - sourceInformation(%composer, "<B()>") - val tmp2_group = B(%composer, 0) - %composer.endReplaceGroup() - tmp2_group) 2 else if (%composer.startReplaceGroup(<>) - %composer.endReplaceGroup() - true) 3 + sourceInformation(%composer, "<B()>,<B()>") + val tmp2_group = <block>{ + val tmp1_group = if (B(%composer, 0)) 1 else if (B(%composer, 0)) 2 else 3 + tmp1_group } %composer.endReplaceGroup() - tmp3_group + tmp2_group } else { %composer.startReplaceGroup(<>) %composer.endReplaceGroup()
diff --git "a/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testIfElseWithCallsInConditions\133useFir = false\135.txt" "b/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testIfElseWithCallsInConditions\133useFir = false\135.txt" index a4d532c..6dfd5e6 100644 --- "a/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testIfElseWithCallsInConditions\133useFir = false\135.txt" +++ "b/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testIfElseWithCallsInConditions\133useFir = false\135.txt"
@@ -35,23 +35,16 @@ if (isTraceInProgress()) { traceEventStart(<>, %changed, -1, <>) } - if (%composer.startReplaceGroup(<>) - sourceInformation(%composer, "<B(a)>") - val tmp0_group = B(a, %composer, 0) - %composer.endReplaceGroup() - tmp0_group) { + %composer.startReplaceGroup(<>) + sourceInformation(%composer, "<B(a)>,<B(b)>") + if (B(a, %composer, 0)) { NA() - } else if (%composer.startReplaceGroup(<>) - sourceInformation(%composer, "<B(b)>") - val tmp1_group = B(b, %composer, 0) - %composer.endReplaceGroup() - tmp1_group) { + } else if (B(b, %composer, 0)) { NA() - } else if (%composer.startReplaceGroup(<>) - %composer.endReplaceGroup() - true) { + } else { NA() } + %composer.endReplaceGroup() if (isTraceInProgress()) { traceEventEnd() }
diff --git "a/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testIfElseWithCallsInConditions\133useFir = true\135.txt" "b/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testIfElseWithCallsInConditions\133useFir = true\135.txt" index a4d532c..6dfd5e6 100644 --- "a/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testIfElseWithCallsInConditions\133useFir = true\135.txt" +++ "b/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testIfElseWithCallsInConditions\133useFir = true\135.txt"
@@ -35,23 +35,16 @@ if (isTraceInProgress()) { traceEventStart(<>, %changed, -1, <>) } - if (%composer.startReplaceGroup(<>) - sourceInformation(%composer, "<B(a)>") - val tmp0_group = B(a, %composer, 0) - %composer.endReplaceGroup() - tmp0_group) { + %composer.startReplaceGroup(<>) + sourceInformation(%composer, "<B(a)>,<B(b)>") + if (B(a, %composer, 0)) { NA() - } else if (%composer.startReplaceGroup(<>) - sourceInformation(%composer, "<B(b)>") - val tmp1_group = B(b, %composer, 0) - %composer.endReplaceGroup() - tmp1_group) { + } else if (B(b, %composer, 0)) { NA() - } else if (%composer.startReplaceGroup(<>) - %composer.endReplaceGroup() - true) { + } else { NA() } + %composer.endReplaceGroup() if (isTraceInProgress()) { traceEventEnd() }
diff --git "a/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testIfWithCallInCondition\133useFir = false\135.txt" "b/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testIfWithCallInCondition\133useFir = false\135.txt" index 1696718..afa4db1 100644 --- "a/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testIfWithCallInCondition\133useFir = false\135.txt" +++ "b/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testIfWithCallInCondition\133useFir = false\135.txt"
@@ -27,19 +27,13 @@ @NonRestartableComposable @Composable fun Example(x: Int, %composer: Composer?, %changed: Int) { - sourceInformationMarkerStart(%composer, <>, "C(Example):Test.kt") + sourceInformationMarkerStart(%composer, <>, "C(Example)<B()>:Test.kt") if (isTraceInProgress()) { traceEventStart(<>, %changed, -1, <>) } - if (%composer.startReplaceGroup(<>) - sourceInformation(%composer, "<B()>") - val tmp0_group = B(%composer, 0) - %composer.endReplaceGroup() - tmp0_group) { + if (B(%composer, 0)) { NA() - } else if (%composer.startReplaceGroup(<>) - %composer.endReplaceGroup() - true) { + } else { NA() } if (isTraceInProgress()) {
diff --git "a/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testIfWithCallInCondition\133useFir = true\135.txt" "b/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testIfWithCallInCondition\133useFir = true\135.txt" index 1696718..afa4db1 100644 --- "a/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testIfWithCallInCondition\133useFir = true\135.txt" +++ "b/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testIfWithCallInCondition\133useFir = true\135.txt"
@@ -27,19 +27,13 @@ @NonRestartableComposable @Composable fun Example(x: Int, %composer: Composer?, %changed: Int) { - sourceInformationMarkerStart(%composer, <>, "C(Example):Test.kt") + sourceInformationMarkerStart(%composer, <>, "C(Example)<B()>:Test.kt") if (isTraceInProgress()) { traceEventStart(<>, %changed, -1, <>) } - if (%composer.startReplaceGroup(<>) - sourceInformation(%composer, "<B()>") - val tmp0_group = B(%composer, 0) - %composer.endReplaceGroup() - tmp0_group) { + if (B(%composer, 0)) { NA() - } else if (%composer.startReplaceGroup(<>) - %composer.endReplaceGroup() - true) { + } else { NA() } if (isTraceInProgress()) {
diff --git "a/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testOR\133useFir = false\135.txt" "b/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testOR\133useFir = false\135.txt" index a2933cf..54c4439 100644 --- "a/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testOR\133useFir = false\135.txt" +++ "b/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testOR\133useFir = false\135.txt"
@@ -21,19 +21,24 @@ @NonRestartableComposable @Composable fun Example(%composer: Composer?, %changed: Int) { - sourceInformationMarkerStart(%composer, <>, "C(Example):Test.kt") + sourceInformationMarkerStart(%composer, <>, "C(Example)<B()>:Test.kt") if (isTraceInProgress()) { traceEventStart(<>, %changed, -1, <>) } - %composer.startReplaceGroup(<>) - sourceInformation(%composer, "<B()>") - val tmp0_group = B(%composer, 0) - %composer.endReplaceGroup() - tmp0_group || %composer.startReplaceGroup(<>) - sourceInformation(%composer, "<B()>") - val tmp1_group = B(%composer, 0) - %composer.endReplaceGroup() - tmp1_group + when { + B(%composer, 0) -> { + %composer.startReplaceGroup(<>) + %composer.endReplaceGroup() + true + } + else -> { + %composer.startReplaceGroup(<>) + sourceInformation(%composer, "<B()>") + val tmp0_group = B(%composer, 0) + %composer.endReplaceGroup() + tmp0_group + } + } if (isTraceInProgress()) { traceEventEnd() }
diff --git "a/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testOR\133useFir = true\135.txt" "b/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testOR\133useFir = true\135.txt" index a2933cf..54c4439 100644 --- "a/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testOR\133useFir = true\135.txt" +++ "b/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testOR\133useFir = true\135.txt"
@@ -21,19 +21,24 @@ @NonRestartableComposable @Composable fun Example(%composer: Composer?, %changed: Int) { - sourceInformationMarkerStart(%composer, <>, "C(Example):Test.kt") + sourceInformationMarkerStart(%composer, <>, "C(Example)<B()>:Test.kt") if (isTraceInProgress()) { traceEventStart(<>, %changed, -1, <>) } - %composer.startReplaceGroup(<>) - sourceInformation(%composer, "<B()>") - val tmp0_group = B(%composer, 0) - %composer.endReplaceGroup() - tmp0_group || %composer.startReplaceGroup(<>) - sourceInformation(%composer, "<B()>") - val tmp1_group = B(%composer, 0) - %composer.endReplaceGroup() - tmp1_group + when { + B(%composer, 0) -> { + %composer.startReplaceGroup(<>) + %composer.endReplaceGroup() + true + } + else -> { + %composer.startReplaceGroup(<>) + sourceInformation(%composer, "<B()>") + val tmp0_group = B(%composer, 0) + %composer.endReplaceGroup() + tmp0_group + } + } if (isTraceInProgress()) { traceEventEnd() }
diff --git "a/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhenWithCallsInConditionsAndCallAfter\133useFir = false\135.txt" "b/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhenWithCallsInConditionsAndCallAfter\133useFir = false\135.txt" index 5eb4429..f5ad2c5 100644 --- "a/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhenWithCallsInConditionsAndCallAfter\133useFir = false\135.txt" +++ "b/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhenWithCallsInConditionsAndCallAfter\133useFir = false\135.txt"
@@ -32,27 +32,20 @@ if (isTraceInProgress()) { traceEventStart(<>, %changed, -1, <>) } + %composer.startReplaceGroup(<>) + sourceInformation(%composer, "<R(a)>,<R(b)>") when { - %composer.startReplaceGroup(<>) - sourceInformation(%composer, "<R(a)>") - val tmp0_group = x == R(a, %composer, 0) - %composer.endReplaceGroup() - tmp0_group -> { + x == R(a, %composer, 0) -> { NA() } - %composer.startReplaceGroup(<>) - sourceInformation(%composer, "<R(b)>") - val tmp1_group = x > R(b, %composer, 0) - %composer.endReplaceGroup() - tmp1_group -> { + x > R(b, %composer, 0) -> { NA() } - %composer.startReplaceGroup(<>) - %composer.endReplaceGroup() - true -> { + else -> { NA() } } + %composer.endReplaceGroup() A(%composer, 0) if (isTraceInProgress()) { traceEventEnd()
diff --git "a/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhenWithCallsInConditionsAndCallAfter\133useFir = true\135.txt" "b/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhenWithCallsInConditionsAndCallAfter\133useFir = true\135.txt" index 5eb4429..f5ad2c5 100644 --- "a/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhenWithCallsInConditionsAndCallAfter\133useFir = true\135.txt" +++ "b/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhenWithCallsInConditionsAndCallAfter\133useFir = true\135.txt"
@@ -32,27 +32,20 @@ if (isTraceInProgress()) { traceEventStart(<>, %changed, -1, <>) } + %composer.startReplaceGroup(<>) + sourceInformation(%composer, "<R(a)>,<R(b)>") when { - %composer.startReplaceGroup(<>) - sourceInformation(%composer, "<R(a)>") - val tmp0_group = x == R(a, %composer, 0) - %composer.endReplaceGroup() - tmp0_group -> { + x == R(a, %composer, 0) -> { NA() } - %composer.startReplaceGroup(<>) - sourceInformation(%composer, "<R(b)>") - val tmp1_group = x > R(b, %composer, 0) - %composer.endReplaceGroup() - tmp1_group -> { + x > R(b, %composer, 0) -> { NA() } - %composer.startReplaceGroup(<>) - %composer.endReplaceGroup() - true -> { + else -> { NA() } } + %composer.endReplaceGroup() A(%composer, 0) if (isTraceInProgress()) { traceEventEnd()
diff --git "a/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhenWithCallsInConditions\133useFir = false\135.txt" "b/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhenWithCallsInConditions\133useFir = false\135.txt" index c76de7f..1e9d59a 100644 --- "a/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhenWithCallsInConditions\133useFir = false\135.txt" +++ "b/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhenWithCallsInConditions\133useFir = false\135.txt"
@@ -32,27 +32,20 @@ if (isTraceInProgress()) { traceEventStart(<>, %changed, -1, <>) } + %composer.startReplaceGroup(<>) + sourceInformation(%composer, "<R(a)>,<R(b)>") when { - %composer.startReplaceGroup(<>) - sourceInformation(%composer, "<R(a)>") - val tmp0_group = x == R(a, %composer, 0) - %composer.endReplaceGroup() - tmp0_group -> { + x == R(a, %composer, 0) -> { NA() } - %composer.startReplaceGroup(<>) - sourceInformation(%composer, "<R(b)>") - val tmp1_group = x > R(b, %composer, 0) - %composer.endReplaceGroup() - tmp1_group -> { + x > R(b, %composer, 0) -> { NA() } - %composer.startReplaceGroup(<>) - %composer.endReplaceGroup() - true -> { + else -> { NA() } } + %composer.endReplaceGroup() if (isTraceInProgress()) { traceEventEnd() }
diff --git "a/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhenWithCallsInConditions\133useFir = true\135.txt" "b/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhenWithCallsInConditions\133useFir = true\135.txt" index c76de7f..1e9d59a 100644 --- "a/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhenWithCallsInConditions\133useFir = true\135.txt" +++ "b/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhenWithCallsInConditions\133useFir = true\135.txt"
@@ -32,27 +32,20 @@ if (isTraceInProgress()) { traceEventStart(<>, %changed, -1, <>) } + %composer.startReplaceGroup(<>) + sourceInformation(%composer, "<R(a)>,<R(b)>") when { - %composer.startReplaceGroup(<>) - sourceInformation(%composer, "<R(a)>") - val tmp0_group = x == R(a, %composer, 0) - %composer.endReplaceGroup() - tmp0_group -> { + x == R(a, %composer, 0) -> { NA() } - %composer.startReplaceGroup(<>) - sourceInformation(%composer, "<R(b)>") - val tmp1_group = x > R(b, %composer, 0) - %composer.endReplaceGroup() - tmp1_group -> { + x > R(b, %composer, 0) -> { NA() } - %composer.startReplaceGroup(<>) - %composer.endReplaceGroup() - true -> { + else -> { NA() } } + %composer.endReplaceGroup() if (isTraceInProgress()) { traceEventEnd() }
diff --git "a/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testFunInterfaces2\133useFir = false\135.txt" "b/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testFunInterfaces2\133useFir = false\135.txt" index 67206bc..6de1c6d 100644 --- "a/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testFunInterfaces2\133useFir = false\135.txt" +++ "b/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testFunInterfaces2\133useFir = false\135.txt"
@@ -64,19 +64,13 @@ @Composable override fun getColor(%composer: Composer?, %changed: Int): Color { %composer.startReplaceGroup(<>) - sourceInformation(%composer, "C(getColor):Test.kt") + sourceInformation(%composer, "C(getColor)<condit...>:Test.kt") if (isTraceInProgress()) { traceEventStart(<>, %changed, -1, <>) } - val tmp0 = if (%composer.startReplaceGroup(<>) - sourceInformation(%composer, "<condit...>") - val tmp1_group = condition(%composer, 0) - %composer.endReplaceGroup() - tmp1_group) { + val tmp0 = if (condition(%composer, 0)) { Companion.Red - } else if (%composer.startReplaceGroup(<>) - %composer.endReplaceGroup() - true) { + } else { Companion.Blue } if (isTraceInProgress()) {
diff --git "a/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testFunInterfaces2\133useFir = true\135.txt" "b/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testFunInterfaces2\133useFir = true\135.txt" index 67206bc..6de1c6d 100644 --- "a/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testFunInterfaces2\133useFir = true\135.txt" +++ "b/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testFunInterfaces2\133useFir = true\135.txt"
@@ -64,19 +64,13 @@ @Composable override fun getColor(%composer: Composer?, %changed: Int): Color { %composer.startReplaceGroup(<>) - sourceInformation(%composer, "C(getColor):Test.kt") + sourceInformation(%composer, "C(getColor)<condit...>:Test.kt") if (isTraceInProgress()) { traceEventStart(<>, %changed, -1, <>) } - val tmp0 = if (%composer.startReplaceGroup(<>) - sourceInformation(%composer, "<condit...>") - val tmp1_group = condition(%composer, 0) - %composer.endReplaceGroup() - tmp1_group) { + val tmp0 = if (condition(%composer, 0)) { Companion.Red - } else if (%composer.startReplaceGroup(<>) - %composer.endReplaceGroup() - true) { + } else { Companion.Blue } if (isTraceInProgress()) {
diff --git "a/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/test_groupAroundIfComposeCallInIfConditionWithShortCircuit\133useFir = false\135.txt" "b/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/test_groupAroundIfComposeCallInIfConditionWithShortCircuit\133useFir = false\135.txt" index e846eb8..97c3c4d 100644 --- "a/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/test_groupAroundIfComposeCallInIfConditionWithShortCircuit\133useFir = false\135.txt" +++ "b/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/test_groupAroundIfComposeCallInIfConditionWithShortCircuit\133useFir = false\135.txt"
@@ -21,11 +21,21 @@ if (isTraceInProgress()) { traceEventStart(<>, %changed, -1, <>) } - ReceiveValue(if (state && %composer.startReplaceGroup(<>) - sourceInformation(%composer, "<getCon...>") - val tmp0_group = getCondition(%composer, 0) - %composer.endReplaceGroup() - tmp0_group) 0 else 1, %composer, 0) + ReceiveValue(if (when { + state -> { + %composer.startReplaceGroup(<>) + sourceInformation(%composer, "<getCon...>") + val tmp0_group = getCondition(%composer, 0) + %composer.endReplaceGroup() + tmp0_group + } + else -> { + %composer.startReplaceGroup(<>) + %composer.endReplaceGroup() + false + } + } + ) 0 else 1, %composer, 0) if (isTraceInProgress()) { traceEventEnd() }
diff --git "a/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/test_groupAroundIfComposeCallInIfConditionWithShortCircuit\133useFir = true\135.txt" "b/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/test_groupAroundIfComposeCallInIfConditionWithShortCircuit\133useFir = true\135.txt" index e846eb8..97c3c4d 100644 --- "a/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/test_groupAroundIfComposeCallInIfConditionWithShortCircuit\133useFir = true\135.txt" +++ "b/plugins/compose/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/test_groupAroundIfComposeCallInIfConditionWithShortCircuit\133useFir = true\135.txt"
@@ -21,11 +21,21 @@ if (isTraceInProgress()) { traceEventStart(<>, %changed, -1, <>) } - ReceiveValue(if (state && %composer.startReplaceGroup(<>) - sourceInformation(%composer, "<getCon...>") - val tmp0_group = getCondition(%composer, 0) - %composer.endReplaceGroup() - tmp0_group) 0 else 1, %composer, 0) + ReceiveValue(if (when { + state -> { + %composer.startReplaceGroup(<>) + sourceInformation(%composer, "<getCon...>") + val tmp0_group = getCondition(%composer, 0) + %composer.endReplaceGroup() + tmp0_group + } + else -> { + %composer.startReplaceGroup(<>) + %composer.endReplaceGroup() + false + } + } + ) 0 else 1, %composer, 0) if (isTraceInProgress()) { traceEventEnd() }
diff --git a/plugins/compose/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableFunctionBodyTransformer.kt b/plugins/compose/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableFunctionBodyTransformer.kt index 575c950..1e33713 100644 --- a/plugins/compose/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableFunctionBodyTransformer.kt +++ b/plugins/compose/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableFunctionBodyTransformer.kt
@@ -3830,7 +3830,6 @@ // conditionally executed. var needsWrappingGroup = false var resultsWithCalls = 0 - var conditionsWithCalls = 0 var hasElseBranch = false val transformed = IrWhenImpl( @@ -3872,19 +3871,13 @@ condScopes.add(condScope) resultScopes.add(resultScope) - // If we are optimizing non-skipping groups we never use a wrapping group, each condition - // is wrapped in a group instead. - if (!FeatureFlag.OptimizeNonSkippingGroups.enabled) { - // the first condition is always executed so if it has a composable call in it, - // it doesn't necessitate a group. However, non-skipping group optimization is - // enabled, we need a wrapping group if any conditions have a composable call. - needsWrappingGroup = - needsWrappingGroup || ((index != 0) && condScope.hasComposableCalls) - } + // the first condition is always executed so if it has a composable call in it, + // it doesn't necessitate a group. However, non-skipping group optimization is + // enabled, we need a wrapping group if any conditions have a composable call. + needsWrappingGroup = needsWrappingGroup || ((index != 0) && condScope.hasComposableCalls) + if (resultScope.hasComposableCalls && !it.result.isGroupBalanced()) resultsWithCalls++ - if (condScope.hasComposableCalls && !it.condition.isGroupBalanced()) - conditionsWithCalls++ transformed.branches.add( IrBranchImpl( @@ -3908,13 +3901,6 @@ resultsWithCalls > 1 && !needsWrappingGroup } - val needsConditionGroups = if (FeatureFlag.OptimizeNonSkippingGroups.enabled) { - conditionsWithCalls > 0 - } else { - // A wrapping group is used instead. - false - } - // If we are putting groups around the result branches, we need to guarantee that exactly // one result branch is executed. We do this by adding an else branch if it there is not // one already. Note that we only need to do this if we aren't going to wrap the if @@ -3948,7 +3934,7 @@ forEachWith(transformed.branches, condScopes, resultScopes) { it, condScope, resultScope -> if (condScope.hasComposableCalls) { - if (needsWrappingGroup) { + if (needsWrappingGroup && !FeatureFlag.OptimizeNonSkippingGroups.enabled) { // Generate a group around the conditional block when it has a composable call // in it and we are generating a group around when block. it.condition = it.condition.asReplaceGroup(condScope) @@ -3973,10 +3959,6 @@ it.result = it.result.asReplaceGroup(resultScope) } - if (needsConditionGroups) { - it.condition = it.condition.asReplaceGroup(condScope) - } - if (resultsWithCalls == 1 && resultScope.hasComposableCalls) { // Realize all groups in the branch result with a conditional call - making sure // that nested control structures are wrapped correctly. @@ -3984,9 +3966,20 @@ } } + if ( + FeatureFlag.OptimizeNonSkippingGroups.enabled && needsResultGroups && ( + transformed.origin == IrStatementOrigin.ANDAND || transformed.origin == IrStatementOrigin.OROR + ) + ) { + // When a IrWhen has a ANDAND or OROR origin it is required they also have a specific shape such as for ANDAND requires a + // `true -> false` clause at the end. As we violate this by adding a wrapping group around all results, this origin is removed + // down-stream lowerings will no longer special case this IrWhen. + transformed.origin = IrStatementOrigin.WHEN + } + return when { - !FeatureFlag.OptimizeNonSkippingGroups.enabled && - (resultsWithCalls == 1 || needsWrappingGroup) -> transformed.asCoalescableGroup(whenScope) + ((!FeatureFlag.OptimizeNonSkippingGroups.enabled && resultsWithCalls == 1) || needsWrappingGroup) -> + transformed.asCoalescableGroup(whenScope) else -> transformed } }