forked from AbleOS/holey-bytes
adding loops and seeing they totally not work
This commit is contained in:
parent
4a7b4e4ead
commit
58578dd4b2
|
@ -1003,9 +1003,10 @@ clobber := fn(cb: ^int): void {
|
||||||
#### conditional_stores
|
#### conditional_stores
|
||||||
```hb
|
```hb
|
||||||
main := fn(): int {
|
main := fn(): int {
|
||||||
|
cnd := cond()
|
||||||
mem := &1
|
mem := &1
|
||||||
|
|
||||||
if cond() == 0 {
|
if cnd == 0 {
|
||||||
*mem = 0
|
*mem = 0
|
||||||
} else {
|
} else {
|
||||||
*mem = 2
|
*mem = 2
|
||||||
|
@ -1016,3 +1017,16 @@ main := fn(): int {
|
||||||
|
|
||||||
cond := fn(): int return 0
|
cond := fn(): int return 0
|
||||||
```
|
```
|
||||||
|
|
||||||
|
#### loop_stores
|
||||||
|
```hb
|
||||||
|
main := fn(): int {
|
||||||
|
mem := &10
|
||||||
|
|
||||||
|
loop if *mem == 0 break else {
|
||||||
|
*mem -= 1
|
||||||
|
}
|
||||||
|
|
||||||
|
return *mem
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
|
@ -310,6 +310,7 @@ impl Nodes {
|
||||||
if self[target].inputs[2] != VOID
|
if self[target].inputs[2] != VOID
|
||||||
&& self[target].inputs.len() == 4
|
&& self[target].inputs.len() == 4
|
||||||
&& self[self[target].inputs[3]].kind == Kind::Stre
|
&& self[self[target].inputs[3]].kind == Kind::Stre
|
||||||
|
&& self[self[target].inputs[3]].lock_rc == 0
|
||||||
&& self[self[target].inputs[3]].inputs[2] == self[target].inputs[2]
|
&& self[self[target].inputs[3]].inputs[2] == self[target].inputs[2]
|
||||||
{
|
{
|
||||||
return Some(self.modify_input(
|
return Some(self.modify_input(
|
||||||
|
@ -1505,6 +1506,17 @@ impl Codegen {
|
||||||
self.ci.nodes.unlock_remove(scope_var.value.id);
|
self.ci.nodes.unlock_remove(scope_var.value.id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if bres.store != scope.store {
|
||||||
|
let (to_store, from_store) = (bres.store.unwrap(), scope.store.unwrap());
|
||||||
|
self.ci.nodes.unlock(to_store);
|
||||||
|
bres.store = Some(
|
||||||
|
self.ci
|
||||||
|
.nodes
|
||||||
|
.new_node(ty::Id::VOID, Kind::Phi, [node, from_store, to_store]),
|
||||||
|
);
|
||||||
|
self.ci.nodes.lock(bres.store.unwrap());
|
||||||
|
}
|
||||||
|
|
||||||
self.ci.nodes.unlock_remove_scope(&scope);
|
self.ci.nodes.unlock_remove_scope(&scope);
|
||||||
self.ci.nodes.unlock_remove_scope(&bres);
|
self.ci.nodes.unlock_remove_scope(&bres);
|
||||||
|
|
||||||
|
@ -1538,7 +1550,11 @@ impl Codegen {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut else_scope = self.ci.scope.clone();
|
let orig_store = self.ci.scope.store;
|
||||||
|
if let Some(str) = orig_store {
|
||||||
|
self.ci.nodes.lock(str);
|
||||||
|
}
|
||||||
|
let else_scope = self.ci.scope.clone();
|
||||||
self.ci.nodes.lock_scope(&else_scope);
|
self.ci.nodes.lock_scope(&else_scope);
|
||||||
|
|
||||||
self.ci.ctrl = self.ci.nodes.new_node(ty::Id::VOID, Kind::Then, [if_node]);
|
self.ci.ctrl = self.ci.nodes.new_node(ty::Id::VOID, Kind::Then, [if_node]);
|
||||||
|
@ -1552,6 +1568,10 @@ impl Codegen {
|
||||||
self.ci.ctrl
|
self.ci.ctrl
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if let Some(str) = orig_store {
|
||||||
|
self.ci.nodes.unlock_remove(str);
|
||||||
|
}
|
||||||
|
|
||||||
if lcntrl == Nid::MAX && rcntrl == Nid::MAX {
|
if lcntrl == Nid::MAX && rcntrl == Nid::MAX {
|
||||||
self.ci.nodes.unlock_remove_scope(&then_scope);
|
self.ci.nodes.unlock_remove_scope(&then_scope);
|
||||||
return None;
|
return None;
|
||||||
|
@ -1567,19 +1587,15 @@ impl Codegen {
|
||||||
|
|
||||||
self.ci.ctrl = self.ci.nodes.new_node(ty::Id::VOID, Kind::Region, [lcntrl, rcntrl]);
|
self.ci.ctrl = self.ci.nodes.new_node(ty::Id::VOID, Kind::Region, [lcntrl, rcntrl]);
|
||||||
|
|
||||||
else_scope = core::mem::take(&mut self.ci.scope);
|
|
||||||
|
|
||||||
Self::merge_scopes(
|
Self::merge_scopes(
|
||||||
&mut self.ci.nodes,
|
&mut self.ci.nodes,
|
||||||
&mut self.ci.loops,
|
&mut self.ci.loops,
|
||||||
self.ci.ctrl,
|
self.ci.ctrl,
|
||||||
&mut else_scope,
|
&mut self.ci.scope,
|
||||||
&mut then_scope,
|
&mut then_scope,
|
||||||
true,
|
true,
|
||||||
);
|
);
|
||||||
|
|
||||||
self.ci.scope = else_scope;
|
|
||||||
|
|
||||||
Some(Value::VOID)
|
Some(Value::VOID)
|
||||||
}
|
}
|
||||||
ref e => {
|
ref e => {
|
||||||
|
@ -2972,5 +2988,6 @@ mod tests {
|
||||||
//wide_ret;
|
//wide_ret;
|
||||||
pointer_opts;
|
pointer_opts;
|
||||||
conditional_stores;
|
conditional_stores;
|
||||||
|
loop_stores;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,23 +2,21 @@ cond:
|
||||||
LI64 r1, 0d
|
LI64 r1, 0d
|
||||||
JALA r0, r31, 0a
|
JALA r0, r31, 0a
|
||||||
main:
|
main:
|
||||||
ADDI64 r254, r254, -48d
|
ADDI64 r254, r254, -32d
|
||||||
ST r31, r254, 8a, 40h
|
ST r31, r254, 8a, 24h
|
||||||
LI64 r32, 1d
|
|
||||||
ADDI64 r33, r254, 0d
|
|
||||||
ST r32, r254, 0a, 8h
|
|
||||||
JAL r31, r0, :cond
|
JAL r31, r0, :cond
|
||||||
LI64 r34, 0d
|
LI64 r32, 0d
|
||||||
CP r35, r34
|
CP r33, r32
|
||||||
JNE r1, r35, :0
|
JNE r1, r33, :0
|
||||||
CP r34, r35
|
CP r32, r33
|
||||||
CP r1, r34
|
CP r1, r32
|
||||||
JMP :1
|
JMP :1
|
||||||
0: LI64 r1, 2d
|
0: LI64 r1, 2d
|
||||||
1: ST r1, r254, 0a, 8h
|
1: ADDI64 r33, r254, 0d
|
||||||
LD r31, r254, 8a, 40h
|
ST r1, r254, 0a, 8h
|
||||||
ADDI64 r254, r254, 48d
|
LD r31, r254, 8a, 24h
|
||||||
|
ADDI64 r254, r254, 32d
|
||||||
JALA r0, r31, 0a
|
JALA r0, r31, 0a
|
||||||
code size: 181
|
code size: 158
|
||||||
ret: 0
|
ret: 0
|
||||||
status: Ok(())
|
status: Ok(())
|
||||||
|
|
0
lang/tests/son_tests_loop_stores.txt
Normal file
0
lang/tests/son_tests_loop_stores.txt
Normal file
Loading…
Reference in a new issue