214 lines
5.5 KiB
Markdown
214 lines
5.5 KiB
Markdown
|
|
# Phase 161 Representative Functions Test Suite
|
||
|
|
|
||
|
|
This directory contains 5 representative Nyash functions that exercise all key analyzer patterns for the Phase 161 JoinIR/MIR to .hako migration.
|
||
|
|
|
||
|
|
## Overview
|
||
|
|
|
||
|
|
These functions are used to validate Phase 161-2+ implementation of MirAnalyzerBox and related analyzer infrastructure. Each function is carefully designed to cover a specific control flow pattern.
|
||
|
|
|
||
|
|
## Representative Functions
|
||
|
|
|
||
|
|
### 1. rep1_if_simple.hako
|
||
|
|
**Pattern**: Simple if/else with PHI merge
|
||
|
|
**Complexity**: ⭐ Simple
|
||
|
|
**Tests**:
|
||
|
|
- Branch detection
|
||
|
|
- If-merge identification
|
||
|
|
- Single PHI instruction
|
||
|
|
- PHI incoming values from both branches
|
||
|
|
|
||
|
|
**Expected MIR Analysis**:
|
||
|
|
- 1 PHI instruction
|
||
|
|
- 1 Branch instruction
|
||
|
|
- 1 If structure detected
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
### 2. rep2_loop_simple.hako
|
||
|
|
**Pattern**: Simple loop with back edge
|
||
|
|
**Complexity**: ⭐ Simple
|
||
|
|
**Tests**:
|
||
|
|
- Loop detection via backward edge
|
||
|
|
- Loop-carried PHI at header
|
||
|
|
- Back edge identification
|
||
|
|
- Loop body block identification
|
||
|
|
|
||
|
|
**Expected MIR Analysis**:
|
||
|
|
- 1 Loop detected
|
||
|
|
- 1 PHI instruction (at loop header)
|
||
|
|
- Backward edge: Block 2 → Block 1
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
### 3. rep3_if_loop.hako
|
||
|
|
**Pattern**: Nested if inside loop
|
||
|
|
**Complexity**: ⭐⭐ Medium
|
||
|
|
**Tests**:
|
||
|
|
- Complex nested control flow
|
||
|
|
- Multiple PHI instructions (loop PHI + if PHI)
|
||
|
|
- Interaction between loop and if patterns
|
||
|
|
- Correct block hierarchy
|
||
|
|
|
||
|
|
**Expected MIR Analysis**:
|
||
|
|
- 1 Loop detected (loop header)
|
||
|
|
- 1 If detected (nested within loop body)
|
||
|
|
- 3 PHI instructions total:
|
||
|
|
- 2 at loop header (for loop carries)
|
||
|
|
- 1 at if merge point
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
### 4. rep4_loop_break.hako
|
||
|
|
**Pattern**: Loop with break statement
|
||
|
|
**Complexity**: ⭐⭐ Medium
|
||
|
|
**Tests**:
|
||
|
|
- Loop with multiple exits
|
||
|
|
- Break target resolution
|
||
|
|
- Exit PHI merge with multiple incoming paths
|
||
|
|
- Complex control flow merging
|
||
|
|
|
||
|
|
**Expected MIR Analysis**:
|
||
|
|
- 1 Loop detected
|
||
|
|
- Multiple exit paths from loop
|
||
|
|
- Break condition identified
|
||
|
|
- Exit merge block identified
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
### 5. rep5_type_prop.hako
|
||
|
|
**Pattern**: Type propagation through loop
|
||
|
|
**Complexity**: ⭐⭐ Medium
|
||
|
|
**Tests**:
|
||
|
|
- Type inference through PHI chains
|
||
|
|
- BinOp type preservation
|
||
|
|
- Type consistency across loop iterations
|
||
|
|
- Compare operation type hints
|
||
|
|
|
||
|
|
**Expected MIR Analysis**:
|
||
|
|
- Type propagation converges
|
||
|
|
- All ValueIds have consistent types
|
||
|
|
- PHI merges compatible types
|
||
|
|
- 4-iteration propagation completes
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Generating MIR JSON
|
||
|
|
|
||
|
|
To generate reference MIR JSON for each representative:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
./target/release/nyash --dump-mir --emit-mir-json rep1_if_simple.mir.json rep1_if_simple.hako
|
||
|
|
./target/release/nyash --dump-mir --emit-mir-json rep2_loop_simple.mir.json rep2_loop_simple.hako
|
||
|
|
./target/release/nyash --dump-mir --emit-mir-json rep3_if_loop.mir.json rep3_if_loop.hako
|
||
|
|
./target/release/nyash --dump-mir --emit-mir-json rep4_loop_break.mir.json rep4_loop_break.hako
|
||
|
|
./target/release/nyash --dump-mir --emit-mir-json rep5_type_prop.mir.json rep5_type_prop.hako
|
||
|
|
```
|
||
|
|
|
||
|
|
This creates the reference `.mir.json` files that MirAnalyzerBox will parse.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Testing MirAnalyzerBox
|
||
|
|
|
||
|
|
Phase 161-2+ will implement analyzer methods that should produce these results:
|
||
|
|
|
||
|
|
### rep1_if_simple
|
||
|
|
|
||
|
|
```
|
||
|
|
MirAnalyzerBox analyzer("rep1_if_simple.mir.json", text)
|
||
|
|
analyzer.list_phis() → [{ block_id: 4, dest: ValueId, incoming: [...] }]
|
||
|
|
analyzer.list_ifs() → [{ condition_block: 1, merge_block: 4, ... }]
|
||
|
|
analyzer.summarize_function(0) → { has_phis: true, has_ifs: true, ... }
|
||
|
|
```
|
||
|
|
|
||
|
|
### rep2_loop_simple
|
||
|
|
|
||
|
|
```
|
||
|
|
analyzer.list_loops() → [{ header_block: 1, contains_blocks: [1,2], ... }]
|
||
|
|
analyzer.list_phis() → [{ block_id: 1, dest: ValueId, incoming: [...] }]
|
||
|
|
analyzer.summarize_function(0) → { has_loops: true, has_phis: true, ... }
|
||
|
|
```
|
||
|
|
|
||
|
|
### rep3_if_loop
|
||
|
|
|
||
|
|
```
|
||
|
|
analyzer.list_loops() → 1 loop
|
||
|
|
analyzer.list_ifs() → 1 if (nested in loop body)
|
||
|
|
analyzer.list_phis() → 3 PHI instructions
|
||
|
|
```
|
||
|
|
|
||
|
|
### rep4_loop_break
|
||
|
|
|
||
|
|
```
|
||
|
|
analyzer.list_loops() → 1 loop with multiple exits
|
||
|
|
analyzer.list_ifs() → 1 if (for break condition)
|
||
|
|
```
|
||
|
|
|
||
|
|
### rep5_type_prop
|
||
|
|
|
||
|
|
```
|
||
|
|
analyzer.propagate_types(0) → { ValueId: "i64", ... }
|
||
|
|
// All types should be consistent, no conflicts
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Structure of MIR JSON
|
||
|
|
|
||
|
|
Each `rep_N.mir.json` follows the schema defined in [phase161_joinir_analyzer_design.md](../../docs/development/current/main/phase161_joinir_analyzer_design.md):
|
||
|
|
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"schema_version": "1",
|
||
|
|
"functions": [
|
||
|
|
{
|
||
|
|
"name": "main",
|
||
|
|
"blocks": [
|
||
|
|
{
|
||
|
|
"id": 0,
|
||
|
|
"instructions": [
|
||
|
|
{
|
||
|
|
"op": "const",
|
||
|
|
"dest": 1,
|
||
|
|
"value": 0
|
||
|
|
},
|
||
|
|
...
|
||
|
|
]
|
||
|
|
},
|
||
|
|
...
|
||
|
|
],
|
||
|
|
"cfg": {
|
||
|
|
"entry": 0,
|
||
|
|
"targets": { "0": [1], "1": [2, 3], ... }
|
||
|
|
}
|
||
|
|
}
|
||
|
|
]
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Phase 161 Roadmap Usage
|
||
|
|
|
||
|
|
These representatives are used in:
|
||
|
|
|
||
|
|
1. **Phase 161-2**: Basic MirAnalyzerBox structure
|
||
|
|
- Implement on rep1 and rep2 (simple patterns)
|
||
|
|
|
||
|
|
2. **Phase 161-3**: PHI/Loop/If detection
|
||
|
|
- Full testing on all 5 representatives
|
||
|
|
|
||
|
|
3. **Phase 161-4**: Type propagation
|
||
|
|
- Validate rep5_type_prop
|
||
|
|
|
||
|
|
4. **Phase 161-5**: Full test suite
|
||
|
|
- All representatives passing all analyzer methods
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## References
|
||
|
|
|
||
|
|
- [phase161_analyzer_box_design.md](../../docs/development/current/main/phase161_analyzer_box_design.md) - Analyzer Box design
|
||
|
|
- [phase161_representative_functions.md](../../docs/development/current/main/phase161_representative_functions.md) - Function selection criteria
|
||
|
|
- [phase161_joinir_analyzer_design.md](../../docs/development/current/main/phase161_joinir_analyzer_design.md) - JSON schema reference
|