Skip to content

Commit

Permalink
[Compose] [nonSkippingGroupOptimization] Fixes group eliding for if s…
Browse files Browse the repository at this point in the history
…tatements

With nonSkippingGroupOptimization enabled the rules of when a group can be elided
change. It is now required that groups generate a constant number of groups unless
they are specifically looping groups which can only generate the body of the loop
repeated, each iteration must be a single group. The groups for if statements were
still being elided not following this rule.

Fixes: [346821372](https://issuetracker.google.com/346821372)
Relnote: Fixes group generation for if statements when nonSkippingGroupOptimziation is enabled.
  • Loading branch information
chuckjaz authored and ShikaSD committed Jun 28, 2024
1 parent 4307ba4 commit e207b05
Show file tree
Hide file tree
Showing 87 changed files with 882 additions and 355 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,10 @@ abstract class AbstractIrTransformTest(useFir: Boolean) : AbstractCodegenTest(us
override fun CompilerConfiguration.updateConfiguration() {
put(ComposeConfiguration.SOURCE_INFORMATION_ENABLED_KEY, true)
put(ComposeConfiguration.FEATURE_FLAGS, listOf(
FeatureFlag.StrongSkipping.featureName,
FeatureFlag.OptimizeNonSkippingGroups.featureName,
))
FeatureFlag.StrongSkipping.featureName,
FeatureFlag.OptimizeNonSkippingGroups.featureName,
)
)
}

@JvmField
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1306,6 +1306,7 @@ class FunctionBodySkippingTransformTests(
fun ReceiveValue(value: Int) { }
"""
)

}

class FunctionBodySkippingTransformTestsNoSource(
Expand All @@ -1314,6 +1315,13 @@ class FunctionBodySkippingTransformTestsNoSource(
override fun CompilerConfiguration.updateConfiguration() {
put(ComposeConfiguration.SOURCE_INFORMATION_ENABLED_KEY, false)
put(ComposeConfiguration.TRACE_MARKERS_ENABLED_KEY, false)
put(
ComposeConfiguration.FEATURE_FLAGS,
listOf(
FeatureFlag.StrongSkipping.featureName,
FeatureFlag.OptimizeNonSkippingGroups.featureName,
)
)
}

@Test
Expand Down Expand Up @@ -1457,4 +1465,32 @@ class FunctionBodySkippingTransformTestsNoSource(
fun Text(value: String) {}
"""
)

@Test
fun testIfStatementGroups() = verifyGoldenComposeIrTransform(
source = """
import androidx.compose.runtime.*
@Composable
fun Test(level: Int) {
Wrap {
if (level > 0) {
used(remember { "Before" })
Wrap {
used(remember { "Middle" })
}
used(remember { "End" })
}
}
}
""",
"""
import androidx.compose.runtime.*
@Composable
fun Wrap(content: @Composable () -> Unit) = content()
fun used(value: Any) { }
"""
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,12 +35,15 @@ fun Label(test: Boolean, %composer: Composer?, %changed: Int) {
Layout({ %composer: Composer?, %changed: Int ->
sourceInformationMarkerStart(%composer, <>, "C<Box()>:Test.kt")
Box(%composer, 0)
%composer.startReplaceGroup(<>)
sourceInformation(%composer, "<Box()>")
if (test) {
%composer.startReplaceGroup(<>)
sourceInformation(%composer, "<Box()>")
Box(%composer, 0)
%composer.endReplaceGroup()
} else {
%composer.startReplaceGroup(<>)
%composer.endReplaceGroup()
}
%composer.endReplaceGroup()
sourceInformationMarkerEnd(%composer)
}, %composer, 0)
if (isTraceInProgress()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,12 +35,15 @@ fun Label(test: Boolean, %composer: Composer?, %changed: Int) {
Layout({ %composer: Composer?, %changed: Int ->
sourceInformationMarkerStart(%composer, <>, "C<Box()>:Test.kt")
Box(%composer, 0)
%composer.startReplaceGroup(<>)
sourceInformation(%composer, "<Box()>")
if (test) {
%composer.startReplaceGroup(<>)
sourceInformation(%composer, "<Box()>")
Box(%composer, 0)
%composer.endReplaceGroup()
} else {
%composer.startReplaceGroup(<>)
%composer.endReplaceGroup()
}
%composer.endReplaceGroup()
sourceInformationMarkerEnd(%composer)
}, %composer, 0)
if (isTraceInProgress()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,12 @@ fun Example(%composer: Composer?, %changed: Int) {
traceEventStart(<>, %changed, -1, <>)
}
%composer.startReplaceGroup(<>)
sourceInformation(%composer, "<B()>,<B()>")
val tmp0_group = B(%composer, 0) && B(%composer, 0)
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
if (isTraceInProgress()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,12 @@ fun Example(%composer: Composer?, %changed: Int) {
traceEventStart(<>, %changed, -1, <>)
}
%composer.startReplaceGroup(<>)
sourceInformation(%composer, "<B()>,<B()>")
val tmp0_group = B(%composer, 0) && B(%composer, 0)
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
if (isTraceInProgress()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,27 +41,31 @@ fun Test(test: Boolean, %composer: Composer?, %changed: Int) {
Column({ %composer: Composer?, %changed: Int ->
%composer.startReplaceGroup(<>)
sourceInformation(%composer, "C<Text("...>:Test.kt")
%composer.startReplaceGroup(<>)
sourceInformation(%composer, "<Text("...>")
if (!test) {
%composer.startReplaceGroup(<>)
sourceInformation(%composer, "<Text("...>")
Text("Say", %composer, 0b0110)
%composer.endReplaceGroup()
%composer.endReplaceGroup()
return@Column
} else {
%composer.startReplaceGroup(<>)
%composer.endReplaceGroup()
}
%composer.endReplaceGroup()
Text("Hello", %composer, 0b0110)
%composer.endReplaceGroup()
}, %composer, 0)
NonComposable {
%composer.startReplaceGroup(<>)
sourceInformation(%composer, "<Text("...>")
if (!test) {
%composer.startReplaceGroup(<>)
sourceInformation(%composer, "<Text("...>")
Text("Say", %composer, 0b0110)
%composer.endReplaceGroup()
return@NonComposable
} else {
%composer.startReplaceGroup(<>)
%composer.endReplaceGroup()
}
%composer.endReplaceGroup()
Text("Hello", %composer, 0b0110)
}
if (isTraceInProgress()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,27 +41,31 @@ fun Test(test: Boolean, %composer: Composer?, %changed: Int) {
Column({ %composer: Composer?, %changed: Int ->
%composer.startReplaceGroup(<>)
sourceInformation(%composer, "C<Text("...>:Test.kt")
%composer.startReplaceGroup(<>)
sourceInformation(%composer, "<Text("...>")
if (!test) {
%composer.startReplaceGroup(<>)
sourceInformation(%composer, "<Text("...>")
Text("Say", %composer, 0b0110)
%composer.endReplaceGroup()
%composer.endReplaceGroup()
return@Column
} else {
%composer.startReplaceGroup(<>)
%composer.endReplaceGroup()
}
%composer.endReplaceGroup()
Text("Hello", %composer, 0b0110)
%composer.endReplaceGroup()
}, %composer, 0)
NonComposable {
%composer.startReplaceGroup(<>)
sourceInformation(%composer, "<Text("...>")
if (!test) {
%composer.startReplaceGroup(<>)
sourceInformation(%composer, "<Text("...>")
Text("Say", %composer, 0b0110)
%composer.endReplaceGroup()
return@NonComposable
} else {
%composer.startReplaceGroup(<>)
%composer.endReplaceGroup()
}
%composer.endReplaceGroup()
Text("Hello", %composer, 0b0110)
}
if (isTraceInProgress()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,25 +28,28 @@ fun Example(x: Int, %composer: Composer?, %changed: Int): Int {
if (isTraceInProgress()) {
traceEventStart(<>, %changed, -1, <>)
}
val tmp0 = <block>{
val tmp0 = if (x > 0) {
%composer.startReplaceGroup(<>)
sourceInformation(%composer, "")
val tmp4_group = if (x > 0) {
val tmp3_group = if (%composer.startReplaceGroup(<>)
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 3
tmp3_group
} else {
4
tmp2_group) 2 else if (%composer.startReplaceGroup(<>)
%composer.endReplaceGroup()
true) 3
}
%composer.endReplaceGroup()
tmp4_group
tmp3_group
} else {
%composer.startReplaceGroup(<>)
%composer.endReplaceGroup()
4
}
if (isTraceInProgress()) {
traceEventEnd()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,25 +28,28 @@ fun Example(x: Int, %composer: Composer?, %changed: Int): Int {
if (isTraceInProgress()) {
traceEventStart(<>, %changed, -1, <>)
}
val tmp0 = <block>{
val tmp0 = if (x > 0) {
%composer.startReplaceGroup(<>)
sourceInformation(%composer, "")
val tmp4_group = if (x > 0) {
val tmp3_group = if (%composer.startReplaceGroup(<>)
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 3
tmp3_group
} else {
4
tmp2_group) 2 else if (%composer.startReplaceGroup(<>)
%composer.endReplaceGroup()
true) 3
}
%composer.endReplaceGroup()
tmp4_group
tmp3_group
} else {
%composer.startReplaceGroup(<>)
%composer.endReplaceGroup()
4
}
if (isTraceInProgress()) {
traceEventEnd()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,18 +28,20 @@ fun Example(x: Int, %composer: Composer?, %changed: Int): Int {
if (isTraceInProgress()) {
traceEventStart(<>, %changed, -1, <>)
}
%composer.startReplaceGroup(<>)
sourceInformation(%composer, "<R()>")
if (x > 0) {
%composer.startReplaceGroup(<>)
sourceInformation(%composer, "<R()>")
val tmp1_return = R(%composer, 0)
%composer.endReplaceGroup()
if (isTraceInProgress()) {
traceEventEnd()
}
%composer.endReplaceGroup()
return tmp1_return
} else {
%composer.startReplaceGroup(<>)
%composer.endReplaceGroup()
}
%composer.endReplaceGroup()
val tmp0 = R(%composer, 0)
if (isTraceInProgress()) {
traceEventEnd()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,18 +28,20 @@ fun Example(x: Int, %composer: Composer?, %changed: Int): Int {
if (isTraceInProgress()) {
traceEventStart(<>, %changed, -1, <>)
}
%composer.startReplaceGroup(<>)
sourceInformation(%composer, "<R()>")
if (x > 0) {
%composer.startReplaceGroup(<>)
sourceInformation(%composer, "<R()>")
val tmp1_return = R(%composer, 0)
%composer.endReplaceGroup()
if (isTraceInProgress()) {
traceEventEnd()
}
%composer.endReplaceGroup()
return tmp1_return
} else {
%composer.startReplaceGroup(<>)
%composer.endReplaceGroup()
}
%composer.endReplaceGroup()
val tmp0 = R(%composer, 0)
if (isTraceInProgress()) {
traceEventEnd()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,13 +30,16 @@ private fun Test(param: String?, %composer: Composer?, %changed: Int) {
Dialog({ %composer: Composer?, %changed: Int ->
%composer.startReplaceGroup(<>)
sourceInformation(%composer, "C:Test.kt")
%composer.startReplaceGroup(<>)
sourceInformation(%composer, "<Test(p...>")
if (false) {
%composer.startReplaceGroup(<>)
sourceInformation(%composer, "<Test(p...>")
Test(param, %composer, 0)
%composer.endReplaceGroup()
} else {
%composer.startReplaceGroup(<>)
%composer.endReplaceGroup()
}
%composer.endReplaceGroup()
%composer.endReplaceGroup()
}, %composer, 0)
if (isTraceInProgress()) {
traceEventEnd()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,13 +30,16 @@ private fun Test(param: String?, %composer: Composer?, %changed: Int) {
Dialog({ %composer: Composer?, %changed: Int ->
%composer.startReplaceGroup(<>)
sourceInformation(%composer, "C:Test.kt")
%composer.startReplaceGroup(<>)
sourceInformation(%composer, "<Test(p...>")
if (false) {
%composer.startReplaceGroup(<>)
sourceInformation(%composer, "<Test(p...>")
Test(param, %composer, 0)
%composer.endReplaceGroup()
} else {
%composer.startReplaceGroup(<>)
%composer.endReplaceGroup()
}
%composer.endReplaceGroup()
%composer.endReplaceGroup()
}, %composer, 0)
if (isTraceInProgress()) {
traceEventEnd()
Expand Down
Loading

0 comments on commit e207b05

Please sign in to comment.