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>
20 lines
468 B
Plaintext
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;
|
|
}
|