preventing dangling nodes due to cycles in loop phys
This commit is contained in:
parent
b2eefa5b83
commit
7def052749
|
@ -615,6 +615,51 @@ main := fn(): uint {
|
|||
|
||||
### Purely Testing Examples
|
||||
|
||||
#### very_nested_loops
|
||||
```hb
|
||||
$W := 200
|
||||
$H := 200
|
||||
$MAX_ITER := 20
|
||||
$ZOOM := 0.5
|
||||
|
||||
main := fn(): int {
|
||||
mv_x := 0.5
|
||||
mv_y := 0.0
|
||||
|
||||
y := 0
|
||||
loop if y < H break else {
|
||||
x := 0
|
||||
loop if x < W break else {
|
||||
i := MAX_ITER - 1
|
||||
|
||||
c_i := (2.0 * @floatcast(@itf(@as(i32, @intcast(x)))) - @floatcast(@itf(@as(i32, @intcast(W))))) / (W * ZOOM) + mv_x
|
||||
c_r := (2.0 * @floatcast(@itf(@as(i32, @intcast(y)))) - @floatcast(@itf(@as(i32, @intcast(H))))) / (H * ZOOM) + mv_y
|
||||
|
||||
z_i := c_i
|
||||
z_r := c_r
|
||||
|
||||
// iteration
|
||||
loop if (z_r + z_i) * (z_r + z_i) >= 4 | i == 0 break else {
|
||||
// z = z * z + c
|
||||
z_i = z_i * z_i + c_i
|
||||
z_r = z_r * z_r + c_r
|
||||
i -= 1
|
||||
}
|
||||
// b g r
|
||||
put_pixel(.(x, y), .(@as(u8, @intcast(i)), @as(u8, @intcast(i)), @as(u8, @intcast(i)), 255))
|
||||
}
|
||||
}
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
Color := struct {r: u8, g: u8, b: u8, a: u8}
|
||||
Vec := struct {x: uint, y: uint}
|
||||
|
||||
put_pixel := fn(pos: Vec, color: Color): void {
|
||||
}
|
||||
```
|
||||
|
||||
#### generic_type_mishap
|
||||
```hb
|
||||
opaque := fn($Expr: type, ptr: ^?Expr): void {
|
||||
|
|
|
@ -1298,14 +1298,21 @@ impl Nodes {
|
|||
}
|
||||
}
|
||||
K::Loop => {
|
||||
if self[target].inputs[0] == NEVER {
|
||||
return Some(NEVER);
|
||||
}
|
||||
|
||||
if self[target].inputs[1] == NEVER {
|
||||
if self[target].inputs[1] == NEVER || self[target].inputs[0] == NEVER {
|
||||
self.lock(target);
|
||||
for o in self[target].outputs.clone() {
|
||||
if self[o].kind == Kind::Phi {
|
||||
self.remove_node_lookup(target);
|
||||
|
||||
let prev = self[o].inputs[2];
|
||||
self[o].inputs[2] = VOID;
|
||||
self[VOID].outputs.push(o);
|
||||
let index = self[prev].outputs.iter().position(|&n| n == o).unwrap();
|
||||
self[prev].outputs.swap_remove(index);
|
||||
self.lock(o);
|
||||
self.remove(prev);
|
||||
self.unlock(o);
|
||||
|
||||
self.replace(o, self[o].inputs[1]);
|
||||
}
|
||||
}
|
||||
|
@ -3398,6 +3405,7 @@ impl<'a> Codegen<'a> {
|
|||
),
|
||||
&mut self.ci.nodes,
|
||||
);
|
||||
|
||||
self.ci.loops.push(Loop {
|
||||
node: self.ci.ctrl.get(),
|
||||
ctrl: [StrongRef::DEFAULT; 2],
|
||||
|
@ -4749,6 +4757,7 @@ mod tests {
|
|||
fb_driver;
|
||||
|
||||
// Purely Testing Examples;
|
||||
very_nested_loops;
|
||||
generic_type_mishap;
|
||||
storing_into_nullable_struct;
|
||||
scheduling_block_did_dirty;
|
||||
|
|
6
lang/tests/son_tests_very_nested_loops.txt
Normal file
6
lang/tests/son_tests_very_nested_loops.txt
Normal file
|
@ -0,0 +1,6 @@
|
|||
main:
|
||||
LI64 r1, 0d
|
||||
JALA r0, r31, 0a
|
||||
code size: 29
|
||||
ret: 0
|
||||
status: Ok(())
|
Loading…
Reference in a new issue