| == sum == |
| tailrec fun sum(x: Long, sum: Long): Long { |
| if (x == 0.toLong()) return sum |
| return sum(x - 1, sum + x) |
| } |
| --------------------- |
| L0: |
| 1 <START> |
| v(x: Long) |
| magic[FAKE_INITIALIZER](x: Long) -> <v0> |
| w(x|<v0>) |
| v(sum: Long) |
| magic[FAKE_INITIALIZER](sum: Long) -> <v1> |
| w(sum|<v1>) |
| 2 mark({ if (x == 0.toLong()) return sum return sum(x - 1, sum + x) }) |
| mark(if (x == 0.toLong()) return sum) |
| r(x) -> <v2> |
| mark(0.toLong()) |
| r(0) -> <v3> |
| mark(toLong()) |
| call(toLong(), toLong|<v3>) -> <v4> |
| mark(x == 0.toLong()) |
| call(x == 0.toLong(), equals|<v2>, <v4>) -> <v5> |
| jf(L2|<v5>) NEXT:[read (Unit), r(sum) -> <v6>] |
| r(sum) -> <v6> |
| ret(*|<v6>) L1 NEXT:[<END>] |
| - jmp(L3) NEXT:[merge(if (x == 0.toLong()) return sum|!<v7>) -> <v8>] PREV:[] |
| L2 [else branch]: |
| read (Unit) PREV:[jf(L2|<v5>)] |
| L3 ['if' expression result]: |
| merge(if (x == 0.toLong()) return sum|!<v7>) -> <v8> |
| r(x) -> <v9> |
| r(1) -> <v10> |
| mark(x - 1) |
| call(x - 1, minus|<v9>, <v10>) -> <v11> |
| r(sum) -> <v12> |
| r(x) -> <v13> |
| mark(sum + x) |
| call(sum + x, plus|<v12>, <v13>) -> <v14> |
| mark(sum(x - 1, sum + x)) |
| call(sum(x - 1, sum + x), sum|<v11>, <v14>) -> <v15> |
| ret(*|<v15>) L1 |
| L1: |
| 1 <END> NEXT:[<SINK>] PREV:[ret(*|<v6>) L1, ret(*|<v15>) L1] |
| error: |
| <ERROR> PREV:[] |
| sink: |
| <SINK> PREV:[<ERROR>, <END>] |
| ===================== |