skia2/resources/sksl/inliner
John Stiles 66c53b9428 Demonstrate a bug with inlined static switches.
When we detect a static switch, the optimizer finds the matching switch-
case and eliminates all the other switch-cases. It handles case
fall-through by scanning forward and looking for an unconditional break.

However, the inliner has an interesting quirk--it can replace `return`
statements inside of a switch with `continue` statements, since the body
of the inlined function has been wrapped with a for-loop to allow for
early exits. The optimizer does not recognize these continue statements
as exits from the switch (although they certainly qualify), so it
treats continues as fallen-through and keeps emitting switch-cases.

The dead-code elimination pass was actually doing us a favor here and
eliminating the excess code later. A flag was added to disable DCE in
order to reveal the problem in a test.

Change-Id: I8ff19fde5e32d0ab73d7c5411da40cb953a446f5
Bug: skia:11352
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/372956
Auto-Submit: John Stiles <johnstiles@google.com>
Reviewed-by: Ethan Nicholas <ethannicholas@google.com>
2021-02-22 15:05:58 +00:00
..
DoWhileBodyMustBeInlinedIntoAScope.sksl
DoWhileTestCannotBeInlined.sksl
EnumsCanBeInlinedSafely.sksl
ExponentialGrowth.sksl
ForBodyMustBeInlinedIntoAScope.sksl
ForInitializerExpressionsCanBeInlined.sksl
ForWithoutReturnInsideCanBeInlined.sksl
ForWithReturnInsideCannotBeInlined.sksl
IfBodyMustBeInlinedIntoAScope.sksl
IfElseBodyMustBeInlinedIntoAScope.sksl
IfElseChainWithReturnsCanBeInlined.sksl
IfTestCanBeInlined.sksl
IfWithReturnsCanBeInlined.sksl
InlineKeywordOverridesThreshold.sksl
InlinerAvoidsVariableNameOverlap.sksl
InlinerCanBeDisabled.sksl
InlinerElidesTempVarForReturnsInsideBlock.sksl
InlinerHonorsGLSLOutParamSemantics.sksl
InlinerManglesNames.sksl
InlinerUsesTempVarForMultipleReturns.sksl
InlinerUsesTempVarForReturnsInsideBlockWithVar.sksl
InlinerWrapsEarlyReturnsWithForLoop.sksl
InlinerWrapsSwitchWithReturnInsideWithForLoop.sksl
InlineThreshold.sksl
InlineWithInoutArgument.sksl
InlineWithModifiedArgument.sksl
InlineWithNestedBigCalls.sksl
InlineWithNestedCalls.sksl
InlineWithUnmodifiedArgument.sksl
InlineWithUnnecessaryBlocks.sksl
ShortCircuitEvaluationsCannotInlineRightHandSide.sksl
StaticSwitch.sksl Demonstrate a bug with inlined static switches. 2021-02-22 15:05:58 +00:00
StructsCanBeInlinedSafely.sksl
SwitchWithCastCanBeInlined.sksl
SwitchWithoutReturnInsideCanBeInlined.sksl
SwizzleCanBeInlinedDirectly.sksl
TernaryResultsCannotBeInlined.sksl
TernaryTestCanBeInlined.sksl
TrivialArgumentsInlineDirectly.sksl
WhileBodyMustBeInlinedIntoAScope.sksl
WhileTestCannotBeInlined.sksl