fixing yet another edge case

This commit is contained in:
Jakub Doka 2024-11-10 20:30:35 +01:00
parent c61efc3933
commit b6274f3455
No known key found for this signature in database
GPG key ID: C6E9A89936B8C143
3 changed files with 58 additions and 42 deletions

View file

@ -617,12 +617,14 @@ main := fn(): uint {
#### storing_into_nullable_struct #### storing_into_nullable_struct
```hb ```hb
StructA := struct {b: StructB} StructA := struct {b: StructB, c: ^uint, d: uint}
StructB := struct {c: uint} StructB := struct {g: ^uint, c: StructC}
StructC := struct {c: uint}
optionala := fn(): ?StructA { optionala := fn(): ?StructA {
return .(.(1)) return .(.(&0, .(1)), &0, 0)
} }
Struct := struct {inner: uint} Struct := struct {inner: uint}
@ -635,13 +637,17 @@ do_stuff := fn(arg: uint): uint {
return arg return arg
} }
just_read := fn(s: StructA): void {
}
main := fn(): uint { main := fn(): uint {
a := optionala() a := optionala()
if a == null { if a == null {
return 10 return 10
} }
a.b = .(0) a.b.c = .(0)
innera := do_stuff(a.b.c) just_read(a)
innera := do_stuff(a.b.c.c)
val := optional() val := optional()
if val == null { if val == null {

View file

@ -1247,20 +1247,22 @@ impl Nodes {
}, },
); );
let size = tys.size_of(ty); let size = tys.size_of(ty);
let mut offset = 0;
loop { loop {
break match s[region].kind { match s[region].kind {
_ if region == loc => 0..size as usize, _ if region == loc => {
break offset as usize..offset as usize + size as usize
}
Kind::Assert { kind: AssertKind::NullCheck, .. } => { Kind::Assert { kind: AssertKind::NullCheck, .. } => {
region = s[region].inputs[2]; region = s[region].inputs[2]
continue;
} }
Kind::BinOp { op: TokenKind::Add | TokenKind::Sub } Kind::BinOp { op: TokenKind::Add | TokenKind::Sub }
if let Kind::CInt { value } = s[s[region].inputs[2]].kind if let Kind::CInt { value } = s[s[region].inputs[2]].kind =>
&& s[region].inputs[1] == loc =>
{ {
value as usize..value as usize + size as usize offset += value;
region = s[region].inputs[1];
} }
_ => 0..full_size as usize, _ => break 0..full_size as usize,
}; };
} }
} }
@ -1280,6 +1282,8 @@ impl Nodes {
if range.start >= load_range.end || range.end <= load_range.start { if range.start >= load_range.end || range.end <= load_range.start {
cursor = self[cursor].inputs[3]; cursor = self[cursor].inputs[3];
} else { } else {
let reg = self.aclass_index(self[cursor].inputs[2]).1;
self[reg].peep_triggers.push(target);
break; break;
} }
} }
@ -4327,7 +4331,7 @@ impl<'a> Codegen<'a> {
self.ci.nodes.basic_blocks(); self.ci.nodes.basic_blocks();
self.ci.nodes.graphviz(self.ty_display(ty::Id::VOID)); self.ci.nodes.graphviz(self.ty_display(ty::Id::VOID));
} else { } else {
//self.ci.nodes.graphviz_in_browser(self.ty_display(ty::Id::VOID)); self.ci.nodes.graphviz_in_browser(self.ty_display(ty::Id::VOID));
} }
self.errors.borrow().len() == prev_err_len self.errors.borrow().len() == prev_err_len

View file

@ -1,40 +1,42 @@
do_stuff: do_stuff:
CP r1, r2 CP r1, r2
JALA r0, r31, 0a JALA r0, r31, 0a
just_read:
JALA r0, r31, 0a
main: main:
ADDI64 r254, r254, -104d ADDI64 r254, r254, -120d
ST r31, r254, 32a, 72h ST r31, r254, 48a, 72h
ADDI64 r32, r254, 16d ADDI64 r32, r254, 16d
CP r1, r32
JAL r31, r0, :optionala JAL r31, r0, :optionala
ST r1, r254, 16a, 16h CP r2, r32
LI8 r33, 0b LI64 r33, 0d
LD r34, r254, 16a, 1h LD r34, r254, 16a, 8h
ANDI r34, r34, 255d
ANDI r33, r33, 255d
JNE r34, r33, :0 JNE r34, r33, :0
LI64 r1, 10d LI64 r1, 10d
JMP :1 JMP :1
0: LI64 r35, 0d 0: ST r33, r254, 24a, 8h
ST r35, r254, 24a, 8h JAL r31, r0, :just_read
LD r2, r254, 24a, 8h LD r2, r254, 24a, 8h
JAL r31, r0, :do_stuff JAL r31, r0, :do_stuff
CP r36, r1 CP r35, r1
ADDI64 r37, r254, 0d ADDI64 r36, r254, 0d
JAL r31, r0, :optional JAL r31, r0, :optional
ST r1, r254, 0a, 16h ST r1, r254, 0a, 16h
LI8 r37, 0b
LD r38, r254, 0a, 1h LD r38, r254, 0a, 1h
ANDI r38, r38, 255d ANDI r38, r38, 255d
ANDI r33, r33, 255d ANDI r37, r37, 255d
JNE r38, r33, :2 JNE r38, r37, :2
LI64 r1, 20d LI64 r1, 20d
JMP :1 JMP :1
2: LI64 r39, 100d 2: LI64 r39, 100d
ST r39, r254, 8a, 8h ST r39, r254, 8a, 8h
LD r2, r254, 8a, 8h LD r2, r254, 8a, 8h
JAL r31, r0, :do_stuff JAL r31, r0, :do_stuff
ADD64 r1, r1, r36 ADD64 r1, r1, r35
1: LD r31, r254, 32a, 72h 1: LD r31, r254, 48a, 72h
ADDI64 r254, r254, 104d ADDI64 r254, r254, 120d
JALA r0, r31, 0a JALA r0, r31, 0a
optional: optional:
ADDI64 r254, r254, -16d ADDI64 r254, r254, -16d
@ -47,18 +49,22 @@ optional:
ADDI64 r254, r254, 16d ADDI64 r254, r254, 16d
JALA r0, r31, 0a JALA r0, r31, 0a
optionala: optionala:
ADDI64 r254, r254, -24d ADDI64 r254, r254, -56d
ADDI64 r1, r254, 0d ADDI64 r7, r254, 0d
LI64 r3, 1d LI64 r8, 1d
LI8 r7, 1b ADDI64 r9, r254, 16d
ADDI64 r6, r254, 8d ADDI64 r6, r254, 24d
ST r3, r254, 0a, 8h ST r8, r254, 0a, 8h
ST r7, r254, 8a, 1h ST r9, r254, 24a, 8h
ADDI64 r11, r6, 8d ADDI64 r3, r6, 8d
BMC r1, r11, 8h BMC r7, r3, 8h
LD r1, r6, 0a, 16h ADDI64 r4, r254, 8d
ADDI64 r254, r254, 24d ST r4, r254, 40a, 8h
LI64 r2, 0d
ST r2, r254, 48a, 8h
BMC r6, r1, 32h
ADDI64 r254, r254, 56d
JALA r0, r31, 0a JALA r0, r31, 0a
code size: 568 code size: 604
ret: 100 ret: 100
status: Ok(()) status: Ok(())