This commit is contained in:
mlokr 2024-09-06 02:04:19 +02:00
parent fdf4cccde0
commit 414a07b99a
No known key found for this signature in database
GPG key ID: DEA147DDEE644993

View file

@ -966,6 +966,7 @@ struct ItemCtx {
loop_depth: u32, loop_depth: u32,
colors: Vec<ColorMeta>, colors: Vec<ColorMeta>,
call_count: usize, call_count: usize,
filled: Vec<Nid>,
loops: Vec<Loop>, loops: Vec<Loop>,
vars: Vec<Variable>, vars: Vec<Variable>,
@ -1872,6 +1873,8 @@ impl Codegen {
self.tys.funcs[id as usize].code.append(&mut self.ci.code); self.tys.funcs[id as usize].code.append(&mut self.ci.code);
self.tys.funcs[id as usize].relocs.append(&mut self.ci.relocs); self.tys.funcs[id as usize].relocs.append(&mut self.ci.relocs);
self.ci.nodes.clear(); self.ci.nodes.clear();
self.ci.colors.clear();
self.ci.filled.clear();
self.pool.cis.push(std::mem::replace(&mut self.ci, prev_ci)); self.pool.cis.push(std::mem::replace(&mut self.ci, prev_ci));
} }
@ -1883,7 +1886,6 @@ impl Codegen {
Kind::Return => { Kind::Return => {
if let Some(&ret) = self.ci.nodes[ctrl].inputs().get(2) { if let Some(&ret) = self.ci.nodes[ctrl].inputs().get(2) {
_ = self.color_expr_consume(ret); _ = self.color_expr_consume(ret);
node_loc!(self, ret) = match self.tys.size_of(self.ci.ret.expect("TODO")) { node_loc!(self, ret) = match self.tys.size_of(self.ci.ret.expect("TODO")) {
0 => Loc::default(), 0 => Loc::default(),
1..=8 => Loc { reg: 1 }, 1..=8 => Loc { reg: 1 },
@ -1900,6 +1902,7 @@ impl Codegen {
Kind::Call { args, .. } => { Kind::Call { args, .. } => {
for &arg in args.iter() { for &arg in args.iter() {
_ = self.color_expr_consume(arg); _ = self.color_expr_consume(arg);
self.ci.nodes[arg].color = self.ci.next_color(); // hack?
} }
self.ci.nodes[ctrl].color = self.ci.next_color(); self.ci.nodes[ctrl].color = self.ci.next_color();
@ -1916,14 +1919,6 @@ impl Codegen {
let left_unreachable = self.color_control(self.ci.nodes[ctrl].outputs[0]); let left_unreachable = self.color_control(self.ci.nodes[ctrl].outputs[0]);
let right_unreachable = self.color_control(self.ci.nodes[ctrl].outputs[1]); let right_unreachable = self.color_control(self.ci.nodes[ctrl].outputs[1]);
for i in 0..self.ci.nodes[ctrl].outputs.len() {
let o = self.ci.nodes[ctrl].outputs[i];
if self.ci.nodes[o].kind == Kind::Phi {
self.color_phy(o);
self.ci.nodes[o].depth = self.ci.loop_depth;
}
}
let dest = left_unreachable.or(right_unreachable)?; let dest = left_unreachable.or(right_unreachable)?;
if self.ci.nodes[dest].kind == Kind::Loop { if self.ci.nodes[dest].kind == Kind::Loop {
return Some(dest); return Some(dest);
@ -1931,6 +1926,14 @@ impl Codegen {
debug_assert_eq!(self.ci.nodes[dest].kind, Kind::Region); debug_assert_eq!(self.ci.nodes[dest].kind, Kind::Region);
for i in 0..self.ci.nodes[dest].outputs.len() {
let o = self.ci.nodes[dest].outputs[i];
if self.ci.nodes[o].kind == Kind::Phi {
self.color_phy(o);
self.ci.nodes[o].depth = self.ci.loop_depth;
}
}
ctrl = *self.ci.nodes[dest] ctrl = *self.ci.nodes[dest]
.outputs .outputs
.iter() .iter()
@ -2015,7 +2018,6 @@ impl Codegen {
fn color_expr_consume(&mut self, expr: Nid) -> Option<u32> { fn color_expr_consume(&mut self, expr: Nid) -> Option<u32> {
if self.ci.nodes[expr].lock_rc == 0 && self.ci.nodes[expr].kind != Kind::Phi { if self.ci.nodes[expr].lock_rc == 0 && self.ci.nodes[expr].kind != Kind::Phi {
self.ci.nodes[expr].depth = self.ci.loop_depth; self.ci.nodes[expr].depth = self.ci.loop_depth;
log::dbg!(self.ci.nodes[expr]);
self.color_expr(expr); self.color_expr(expr);
} }
self.use_colored_expr(expr) self.use_colored_expr(expr)
@ -2034,7 +2036,6 @@ impl Codegen {
let [left, right, ..] = self.ci.nodes[expr].inputs; let [left, right, ..] = self.ci.nodes[expr].inputs;
let lcolor = self.color_expr_consume(left); let lcolor = self.color_expr_consume(left);
let rcolor = self.color_expr_consume(right); let rcolor = self.color_expr_consume(right);
log::dbg!(op, lcolor, rcolor);
self.ci.nodes[expr].color = self.ci.nodes[expr].color =
lcolor.or(rcolor).unwrap_or_else(|| self.ci.next_color()); lcolor.or(rcolor).unwrap_or_else(|| self.ci.next_color());
@ -2054,9 +2055,6 @@ impl Codegen {
(self.ci.nodes[expr].lock_rc as usize >= self.ci.nodes[expr].outputs.len() (self.ci.nodes[expr].lock_rc as usize >= self.ci.nodes[expr].outputs.len()
&& self.ci.nodes[expr].depth == self.ci.loop_depth) && self.ci.nodes[expr].depth == self.ci.loop_depth)
.then_some(self.ci.nodes[expr].color) .then_some(self.ci.nodes[expr].color)
.inspect(|_| {
log::dbg!(self.ci.nodes[expr]);
})
} }
fn emit_control(&mut self, mut ctrl: Nid) -> Option<Nid> { fn emit_control(&mut self, mut ctrl: Nid) -> Option<Nid> {
@ -2154,7 +2152,11 @@ impl Codegen {
} }
} }
let filled_base = self.ci.filled.len();
let left_unreachable = self.emit_control(self.ci.nodes[ctrl].outputs[0]); let left_unreachable = self.emit_control(self.ci.nodes[ctrl].outputs[0]);
for fld in self.ci.filled.drain(filled_base..) {
self.ci.nodes[fld].lock_rc = 1;
}
let mut skip_then_offset = self.ci.code.len() as i64; let mut skip_then_offset = self.ci.code.len() as i64;
if let Some(region) = left_unreachable { if let Some(region) = left_unreachable {
for i in 0..self.ci.nodes[region].outputs.len() { for i in 0..self.ci.nodes[region].outputs.len() {
@ -2172,7 +2174,12 @@ impl Codegen {
} }
let right_base = self.ci.code.len(); let right_base = self.ci.code.len();
let filled_base = self.ci.filled.len();
let right_unreachable = self.emit_control(self.ci.nodes[ctrl].outputs[1]); let right_unreachable = self.emit_control(self.ci.nodes[ctrl].outputs[1]);
for fld in self.ci.filled.drain(filled_base..) {
self.ci.nodes[fld].lock_rc = 1;
}
if let Some(region) = left_unreachable { if let Some(region) = left_unreachable {
for i in 0..self.ci.nodes[region].outputs.len() { for i in 0..self.ci.nodes[region].outputs.len() {
let o = self.ci.nodes[region].outputs[i]; let o = self.ci.nodes[region].outputs[i];
@ -2289,6 +2296,7 @@ impl Codegen {
if std::mem::take(&mut self.ci.nodes[expr].lock_rc) == 0 { if std::mem::take(&mut self.ci.nodes[expr].lock_rc) == 0 {
return; return;
} }
self.ci.filled.push(expr);
match self.ci.nodes[expr].kind { match self.ci.nodes[expr].kind {
Kind::Start => unreachable!(), Kind::Start => unreachable!(),
@ -2334,7 +2342,8 @@ impl Codegen {
self.emit_expr_consume(left); self.emit_expr_consume(left);
if let Kind::ConstInt { value } = self.ci.nodes[right].kind if let Kind::ConstInt { value } = self.ci.nodes[right].kind
&& node_loc!(self, right) == Loc::default() && (node_loc!(self, right) == Loc::default()
|| self.ci.nodes[right].lock_rc != 0)
&& let Some(op) = Self::imm_math_op(op, ty.is_signed(), self.tys.size_of(ty)) && let Some(op) = Self::imm_math_op(op, ty.is_signed(), self.tys.size_of(ty))
{ {
let instr = let instr =
@ -2768,8 +2777,6 @@ mod tests {
return; return;
} }
return;
let mut stack = [0_u64; 128]; let mut stack = [0_u64; 128];
let mut vm = unsafe { let mut vm = unsafe {