| == test == |
| fun test(b: Boolean) { |
| do { |
| if (b) break; |
| continue; |
| } while (true); |
| } |
| --------------------- |
| L0: |
| 1 <START> |
| v(b: Boolean) |
| magic[FAKE_INITIALIZER](b: Boolean) -> <v0> |
| w(b|<v0>) |
| 2 mark({ do { if (b) break; continue; } while (true); }) |
| 3 mark(do { if (b) break; continue; } while (true)) |
| L2 [loop entry point]: |
| L4 [body entry point]: |
| mark({ if (b) break; continue; }) PREV:[mark(do { if (b) break; continue; } while (true)), jmp(L2)] |
| mark(if (b) break) |
| r(b) -> <v1> |
| jf(L7|<v1>) NEXT:[read (Unit), jmp(L3)] |
| jmp(L3) NEXT:[read (Unit)] |
| - jmp(L8) NEXT:[merge(if (b) break|!<v2>) -> <v3>] PREV:[] |
| L7 [else branch]: |
| read (Unit) PREV:[jf(L7|<v1>)] |
| L8 ['if' expression result]: |
| merge(if (b) break|!<v2>) -> <v3> |
| jmp(L6) |
| L5 [body exit point]: |
| L6 [condition entry point]: |
| r(true) -> <v5> |
| 2 magic[VALUE_CONSUMER](true|<v5>) -> <v6> |
| jmp(L2) NEXT:[mark({ if (b) break; continue; })] |
| L3 [loop exit point]: |
| read (Unit) PREV:[jmp(L3)] |
| L1: |
| 1 <END> NEXT:[<SINK>] |
| error: |
| <ERROR> PREV:[] |
| sink: |
| <SINK> PREV:[<ERROR>, <END>] |
| ===================== |