great
This commit is contained in:
parent
fdf4cccde0
commit
414a07b99a
|
@ -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 {
|
||||||
|
|
Loading…
Reference in a new issue