preventing deduplication to cause bugs

This commit is contained in:
Jakub Doka 2024-11-09 15:14:03 +01:00
parent c657084451
commit 823c78bf74
No known key found for this signature in database
GPG key ID: C6E9A89936B8C143
5 changed files with 72 additions and 14 deletions

View file

@ -612,6 +612,30 @@ main := fn(): uint {
### Purely Testing Examples ### Purely Testing Examples
#### scheduling_block_did_dirty
```hb
Struct := struct {
pad: uint,
pad2: uint,
}
file := [u8].(255)
opaque := fn(x: uint): uint {
return file[x]
}
constructor := fn(x: uint): Struct {
a := opaque(x)
return .(a, a)
}
main := fn(): void {
something := constructor(0)
return
}
```
#### null_check_returning_small_global #### null_check_returning_small_global
```hb ```hb
MAGIC := 127 MAGIC := 127

View file

@ -4079,9 +4079,10 @@ impl<'a> Codegen<'a> {
self.pool.push_ci(file, Some(sig.ret), 0, &mut self.ci); self.pool.push_ci(file, Some(sig.ret), 0, &mut self.ci);
let prev_err_len = self.errors.borrow().len(); let prev_err_len = self.errors.borrow().len();
let &Expr::Closure { body, args, .. } = expr else { let &Expr::Closure { body, args, pos, .. } = expr else {
unreachable!("{}", self.ast_display(expr)) unreachable!("{}", self.ast_display(expr))
}; };
self.ci.pos.push(pos);
let mut tys = sig.args.args(); let mut tys = sig.args.args();
let mut args = args.iter(); let mut args = args.iter();
@ -4142,6 +4143,7 @@ impl<'a> Codegen<'a> {
backend.emit_body(id, &mut self.ci.nodes, self.tys, self.files); backend.emit_body(id, &mut self.ci.nodes, self.tys, self.files);
} }
self.ci.pos.pop();
self.pool.pop_ci(&mut self.ci); self.pool.pop_ci(&mut self.ci);
} }
@ -4646,6 +4648,7 @@ mod tests {
fb_driver; fb_driver;
// Purely Testing Examples; // Purely Testing Examples;
scheduling_block_did_dirty;
null_check_returning_small_global; null_check_returning_small_global;
null_check_in_the_loop; null_check_in_the_loop;
stack_provenance; stack_provenance;

View file

@ -10,7 +10,7 @@ use {
Offset, PLoc, Reloc, Sig, TypedReloc, Types, Offset, PLoc, Reloc, Sig, TypedReloc, Types,
}, },
alloc::{borrow::ToOwned, vec::Vec}, alloc::{borrow::ToOwned, vec::Vec},
core::{mem, ops::Range, u32, usize}, core::{mem, ops::Range},
hbbytecode::{self as instrs}, hbbytecode::{self as instrs},
}; };

View file

@ -855,6 +855,7 @@ impl<'a> Function<'a> {
} }
fn reschedule_block(&mut self, from: Nid, outputs: &mut Vc) { fn reschedule_block(&mut self, from: Nid, outputs: &mut Vc) {
// NOTE: this code is horible
let from = Some(&from); let from = Some(&from);
let mut buf = Vec::with_capacity(outputs.len()); let mut buf = Vec::with_capacity(outputs.len());
let mut seen = BitSet::default(); let mut seen = BitSet::default();
@ -878,7 +879,9 @@ impl<'a> Function<'a> {
.all(|&o| self.nodes[o].inputs.first() != from || seen.get(o)) .all(|&o| self.nodes[o].inputs.first() != from || seen.get(o))
&& seen.set(i) && seen.set(i)
{ {
buf.push(i); for &o in outputs.iter().filter(|&&n| n == i) {
buf.push(o);
}
} }
} }
cursor += 1; cursor += 1;
@ -890,7 +893,9 @@ impl<'a> Function<'a> {
continue; continue;
} }
let mut cursor = buf.len(); let mut cursor = buf.len();
buf.push(o); for &o in outputs.iter().filter(|&&n| n == o) {
buf.push(o);
}
while let Some(&n) = buf.get(cursor) { while let Some(&n) = buf.get(cursor) {
for &i in &self.nodes[n].inputs[1..] { for &i in &self.nodes[n].inputs[1..] {
if from == self.nodes[i].inputs.first() if from == self.nodes[i].inputs.first()
@ -900,22 +905,17 @@ impl<'a> Function<'a> {
.all(|&o| self.nodes[o].inputs.first() != from || seen.get(o)) .all(|&o| self.nodes[o].inputs.first() != from || seen.get(o))
&& seen.set(i) && seen.set(i)
{ {
buf.push(i); for &o in outputs.iter().filter(|&&n| n == i) {
buf.push(o);
}
} }
} }
cursor += 1; cursor += 1;
} }
} }
debug_assert!( if outputs.len() != buf.len() {
outputs.len() == buf.len() || outputs.len() == buf.len() + 1, panic!("{:?} {:?}", outputs, buf);
"{:?} {:?}",
outputs,
buf
);
if buf.len() + 1 == outputs.len() {
outputs.remove(outputs.len() - 1);
} }
outputs.copy_from_slice(&buf); outputs.copy_from_slice(&buf);
} }

View file

@ -0,0 +1,31 @@
constructor:
ADDI64 r254, r254, -32d
ST r31, r254, 16a, 16h
CP r2, r3
JAL r31, r0, :opaque
ADDI64 r32, r254, 0d
ST r1, r254, 0a, 8h
ST r1, r254, 8a, 8h
LD r1, r32, 0a, 16h
LD r31, r254, 16a, 16h
ADDI64 r254, r254, 32d
JALA r0, r31, 0a
main:
ADDI64 r254, r254, -32d
ST r31, r254, 16a, 16h
ADDI64 r32, r254, 0d
LI64 r3, 0d
JAL r31, r0, :constructor
ST r1, r254, 0a, 16h
LD r31, r254, 16a, 16h
ADDI64 r254, r254, 32d
JALA r0, r31, 0a
opaque:
LRA r3, r0, :file
ADD64 r5, r3, r2
LD r7, r5, 0a, 1h
ANDI r1, r7, 255d
JALA r0, r31, 0a
code size: 274
ret: 255
status: Ok(())