skia2/resources/sksl/inliner/StaticSwitch.sksl
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

20 lines
468 B
Plaintext

/*#pragma settings NoDeadCodeElimination*/
uniform half4 colorGreen, colorRed;
float get() {
@switch (2) {
case 1: return abs(1);
case 2: return abs(2); // Only this case should be preserved.
case 3: return abs(3);
case 4: return abs(4);
}
// This won't be removed because dead-code elimination is disabled.
return abs(5);
}
half4 main() {
float result = get();
return result == 2 ? colorGreen : colorRed;
}