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.glsl | ||
DoWhileTestCannotBeInlined.glsl | ||
EnumsCanBeInlinedSafely.glsl | ||
ExponentialGrowth.glsl | ||
ExponentialGrowthStandaloneSettings.glsl | ||
ForBodyMustBeInlinedIntoAScope.glsl | ||
ForInitializerExpressionsCanBeInlined.glsl | ||
ForWithoutReturnInsideCanBeInlined.glsl | ||
ForWithReturnInsideCannotBeInlined.glsl | ||
IfBodyMustBeInlinedIntoAScope.glsl | ||
IfElseBodyMustBeInlinedIntoAScope.glsl | ||
IfElseChainWithReturnsCanBeInlined.glsl | ||
IfTestCanBeInlined.glsl | ||
IfWithReturnsCanBeInlined.glsl | ||
InlineKeywordOverridesThreshold.glsl | ||
InlinerAvoidsVariableNameOverlap.glsl | ||
InlinerCanBeDisabled.glsl | ||
InlinerCanBeDisabledStandaloneSettings.glsl | ||
InlinerElidesTempVarForReturnsInsideBlock.glsl | ||
InlinerHonorsGLSLOutParamSemantics.glsl | ||
InlinerManglesNames.glsl | ||
InlinerUsesTempVarForMultipleReturns.glsl | ||
InlinerUsesTempVarForReturnsInsideBlockWithVar.glsl | ||
InlinerWrapsEarlyReturnsWithForLoop.glsl | ||
InlinerWrapsSwitchWithReturnInsideWithForLoop.glsl | ||
InlineThreshold.glsl | ||
InlineWithInoutArgument.glsl | ||
InlineWithModifiedArgument.glsl | ||
InlineWithNestedBigCalls.glsl | ||
InlineWithNestedCalls.glsl | ||
InlineWithUnmodifiedArgument.glsl | ||
InlineWithUnnecessaryBlocks.glsl | ||
ShortCircuitEvaluationsCannotInlineRightHandSide.glsl | ||
StaticSwitch.glsl | ||
StructsCanBeInlinedSafely.glsl | ||
SwitchWithCastCanBeInlined.glsl | ||
SwitchWithoutReturnInsideCanBeInlined.glsl | ||
SwizzleCanBeInlinedDirectly.glsl | ||
TernaryResultsCannotBeInlined.glsl | ||
TernaryTestCanBeInlined.glsl | ||
TrivialArgumentsInlineDirectly.glsl | ||
WhileBodyMustBeInlinedIntoAScope.glsl | ||
WhileTestCannotBeInlined.glsl |