66c53b9428
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> |
||
---|---|---|
.. | ||
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 | ||
StructsCanBeInlinedSafely.sksl | ||
SwitchWithCastCanBeInlined.sksl | ||
SwitchWithoutReturnInsideCanBeInlined.sksl | ||
SwizzleCanBeInlinedDirectly.sksl | ||
TernaryResultsCannotBeInlined.sksl | ||
TernaryTestCanBeInlined.sksl | ||
TrivialArgumentsInlineDirectly.sksl | ||
WhileBodyMustBeInlinedIntoAScope.sksl | ||
WhileTestCannotBeInlined.sksl |