fixing the compilation eror and maybe breaking the code
This commit is contained in:
parent
8083bcb0e8
commit
8bbc40b9b1
|
@ -3340,18 +3340,55 @@ impl Codegen {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn push_down(nodes: &mut Nodes, node: Nid) {
|
fn push_down(nodes: &mut Nodes, node: Nid, lowest_pos: &mut [u32]) {
|
||||||
if !nodes.visited.set(node as _) {
|
if !nodes.visited.set(node as _) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: handle memory nodes first
|
// TODO: handle memory nodes first
|
||||||
|
|
||||||
|
if nodes[node].kind.is_pinned() {
|
||||||
|
for i in 0..nodes[node].inputs.len() {
|
||||||
|
let i = nodes[node].inputs[i];
|
||||||
|
push_up(nodes, i);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
let mut max = 0;
|
||||||
|
for i in 0..nodes[node].inputs.len() {
|
||||||
|
let i = nodes[node].inputs[i];
|
||||||
|
let is_call = matches!(nodes[i].kind, Kind::Call { .. });
|
||||||
|
if nodes.is_cfg(i) && !is_call {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
push_up(nodes, i);
|
||||||
|
if idepth(nodes, i) > idepth(nodes, max) {
|
||||||
|
max = if is_call { i } else { idom(nodes, i) };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if max == 0 {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let index = nodes[0].outputs.iter().position(|&p| p == node).unwrap();
|
||||||
|
nodes[0].outputs.remove(index);
|
||||||
|
nodes[node].inputs[0] = max;
|
||||||
|
debug_assert!(
|
||||||
|
!nodes[max].outputs.contains(&node)
|
||||||
|
|| matches!(nodes[max].kind, Kind::Call { .. }),
|
||||||
|
"{node} {:?} {max} {:?}",
|
||||||
|
nodes[node],
|
||||||
|
nodes[max]
|
||||||
|
);
|
||||||
|
nodes[max].outputs.push(node);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
self.ci.nodes.visited.clear(self.ci.nodes.values.len());
|
self.ci.nodes.visited.clear(self.ci.nodes.values.len());
|
||||||
push_up(&mut self.ci.nodes, self.ci.end);
|
push_up(&mut self.ci.nodes, self.ci.end);
|
||||||
// TODO: handle infinte loops
|
// TODO: handle infinte loops
|
||||||
self.ci.nodes.visited.clear(self.ci.nodes.values.len());
|
self.ci.nodes.visited.clear(self.ci.nodes.values.len());
|
||||||
|
push_down(&mut self.ci.nodes, self.ci.start);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3506,6 +3543,8 @@ 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 {
|
||||||
|
|
|
@ -9,11 +9,8 @@ macro_rules! fnsdef {
|
||||||
$vis fn $name(val: $from, mode: RoundingMode) -> $to {
|
$vis fn $name(val: $from, mode: RoundingMode) -> $to {
|
||||||
let result: $to;
|
let result: $to;
|
||||||
unsafe {
|
unsafe {
|
||||||
if mode == RoundingMode::NearestEven {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
let fpcr: u64;
|
let fpcr: u64;
|
||||||
|
|
||||||
unsafe { asm!("mrs {}, fpcr", out(reg) fpcr) };
|
unsafe { asm!("mrs {}, fpcr", out(reg) fpcr) };
|
||||||
|
|
||||||
let fpcr_new = fpcr & !(0b11 << 22)
|
let fpcr_new = fpcr & !(0b11 << 22)
|
||||||
|
|
Loading…
Reference in a new issue