|
1 | 1 | from kirin.prelude import basic_no_opt |
| 2 | +from kirin.dialects import cf, func |
2 | 3 | from kirin.lowering import Lowering |
3 | 4 |
|
4 | 5 | lowering = Lowering(basic_no_opt) |
5 | | -range_a = range(10) |
6 | 6 |
|
7 | 7 |
|
8 | | -def simple_loop(x): |
9 | | - for i in range(10): |
10 | | - for j in range(10): |
11 | | - x = x + i + j |
| 8 | +def test_simple_loop(): |
| 9 | + def simple_loop(x): |
| 10 | + for i in range(10): |
| 11 | + for j in range(10): |
| 12 | + x = x + i + j |
12 | 13 |
|
| 14 | + code = lowering.run(simple_loop) |
| 15 | + assert isinstance(code, func.Function) |
| 16 | + assert isinstance(stmt := code.body.blocks[0].last_stmt, cf.ConditionalBranch) |
| 17 | + assert stmt.then_arguments[0] is code.body.blocks[0].args[1] |
| 18 | + assert stmt.then_successor is code.body.blocks[4] |
| 19 | + assert stmt.else_arguments[0] is code.body.blocks[0].stmts.at(6).results[0] |
| 20 | + assert stmt.else_arguments[1] is code.body.blocks[0].args[1] |
| 21 | + assert stmt.else_successor is code.body.blocks[1] |
13 | 22 |
|
14 | | -code = lowering.run(simple_loop) |
15 | | -# code.print() |
| 23 | + assert isinstance(stmt := code.body.blocks[1].last_stmt, cf.ConditionalBranch) |
| 24 | + assert stmt.then_arguments[0] is code.body.blocks[1].args[1] |
| 25 | + assert stmt.then_arguments[1] is code.body.blocks[1].args[0] |
| 26 | + assert stmt.else_arguments[0] is code.body.blocks[1].stmts.at(-3).results[0] |
| 27 | + assert stmt.else_arguments[1] is code.body.blocks[1].args[1] |
| 28 | + assert stmt.else_arguments[2] is code.body.blocks[1].args[0] |
| 29 | + assert stmt.else_successor is code.body.blocks[2] |
16 | 30 |
|
| 31 | + assert isinstance(stmt := code.body.blocks[2].last_stmt, cf.ConditionalBranch) |
| 32 | + var_x = code.body.blocks[2].stmts.at(1).results[0] |
| 33 | + var_i = code.body.blocks[2].args[2] |
| 34 | + assert stmt.then_arguments[0] is var_x |
| 35 | + assert stmt.then_arguments[1] is var_i |
| 36 | + assert stmt.then_successor is code.body.blocks[3] |
| 37 | + assert stmt.else_arguments[0] is code.body.blocks[2].stmts.at(-3).results[0] |
| 38 | + assert stmt.else_arguments[1] is var_x |
| 39 | + assert stmt.else_arguments[2] is var_i |
| 40 | + # code.print() |
17 | 41 |
|
18 | | -def branch_pass(): |
19 | | - if True: |
20 | | - pass |
21 | | - else: |
22 | | - pass |
23 | 42 |
|
| 43 | +def test_branch_pass(): |
| 44 | + def branch_pass(): |
| 45 | + if True: |
| 46 | + pass |
| 47 | + else: |
| 48 | + pass |
24 | 49 |
|
25 | | -code = lowering.run(branch_pass, compactify=False) |
| 50 | + code = lowering.run(branch_pass) |
| 51 | + assert isinstance(code, func.Function) |
| 52 | + assert isinstance(code.body.blocks[0].last_stmt, func.Return) |
| 53 | + # code.print() |
| 54 | + |
| 55 | + |
| 56 | +def test_side_effect(): |
| 57 | + def side_effect(reg, n: int): |
| 58 | + if n == 0: |
| 59 | + return |
| 60 | + |
| 61 | + for i in range(10): |
| 62 | + reg[0] = i |
| 63 | + |
| 64 | + code = lowering.run(side_effect) |
| 65 | + assert isinstance(code, func.Function) |
| 66 | + assert isinstance(stmt := code.body.blocks[0].last_stmt, cf.ConditionalBranch) |
| 67 | + assert stmt.then_arguments[0] is code.body.blocks[0].stmts.at(-2).results[0] |
| 68 | + assert stmt.then_successor is code.body.blocks[1] |
| 69 | + assert stmt.else_arguments == () |
| 70 | + assert stmt.else_successor is code.body.blocks[2] |
| 71 | + |
| 72 | + assert isinstance(code.body.blocks[1].last_stmt, func.Return) |
| 73 | + |
| 74 | + assert isinstance(stmt := code.body.blocks[2].last_stmt, cf.ConditionalBranch) |
| 75 | + reg = code.body.blocks[0].args[1] |
| 76 | + assert stmt.then_arguments[0] is reg |
| 77 | + assert stmt.then_successor is code.body.blocks[4] |
| 78 | + assert stmt.else_arguments[0] is code.body.blocks[2].stmts.at(-3).results[0] |
| 79 | + assert stmt.else_arguments[1] is reg |
| 80 | + assert stmt.else_successor is code.body.blocks[3] |
| 81 | + |
| 82 | + assert isinstance(stmt := code.body.blocks[3].last_stmt, cf.ConditionalBranch) |
| 83 | + reg = code.body.blocks[3].args[1] |
| 84 | + assert stmt.then_arguments[0] is reg |
| 85 | + assert stmt.then_successor is code.body.blocks[4] |
| 86 | + assert stmt.else_arguments[0] is code.body.blocks[3].stmts.at(-3).results[0] |
| 87 | + assert stmt.else_arguments[1] is reg |
| 88 | + |
| 89 | + assert isinstance(code.body.blocks[4].last_stmt, func.Return) |
| 90 | + # code.print() |
0 commit comments