Skip to content

Commit

Permalink
chapter17: more Parser changes (doesn't compile yet)
Browse files Browse the repository at this point in the history
  • Loading branch information
RobertObkircher committed Feb 4, 2025
1 parent 8a1ed3d commit 446c178
Show file tree
Hide file tree
Showing 6 changed files with 388 additions and 83 deletions.
49 changes: 48 additions & 1 deletion src/sea_of_nodes/nodes.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ use crate::datastructures::id_set::IdSet;
use crate::datastructures::id_vec::IdVec;
use crate::sea_of_nodes::nodes::cfg::CfgData;
use crate::sea_of_nodes::nodes::gvn::GvnEntry;
use crate::sea_of_nodes::nodes::node::CProj;
use crate::sea_of_nodes::nodes::node::{CProj, ToFloat};
use crate::sea_of_nodes::parser::Parser;
use crate::sea_of_nodes::types::{Ty, TyStruct, Type, Types};
use iter_peeps::IterPeeps;
Expand Down Expand Up @@ -387,6 +387,53 @@ impl Node {
}
None
}
/// Semantic change to the graph (so NOT a peephole), used by the Parser.
/// If any input is a float, flip to a float-flavored opcode and widen any
/// non-float input.
fn widen(self, sea: &mut Nodes) -> Node {
if !self.has_float_input(sea) {
return self;
}
if let Some(flt) = self.copy_f(sea) {
for i in 1..self.inputs(sea).len() {
let in_i = self.inputs(sea)[i].unwrap();
flt.set_def(
i,
if in_i.ty(sea).is_some_and(|t| t.is_float()) {
in_i
} else {
ToFloat::new(in_i, sea).peephole(sea)
},
sea,
);
}
self.kill(sea);
flt
} else {
self
}
}

fn has_float_input(self, sea: &Nodes) -> bool {
self.inputs(sea)
.iter()
.skip(1)
.flatten()
.any(|i| i.ty(sea).is_some_and(|t| t.is_float()))
}

fn copy_f(self, sea: &mut Nodes) -> Option<Node> {
let op = match &sea[self] {
Op::Add => Op::AddF,
Op::Bool(b) => todo!(),
Op::Div => Op::DivF,
Op::Minus => return Some(sea.create((Op::MinusF, vec![None, None]))),
Op::Mul => Op::MulF,
Op::Sub => Op::SubF,
_ => return None,
};
Some(sea.create((op, vec![None, None, None])))
}
}

impl Phi {
Expand Down
19 changes: 17 additions & 2 deletions src/sea_of_nodes/nodes/node.rs
Original file line number Diff line number Diff line change
Expand Up @@ -541,6 +541,21 @@ impl Xor {
Self::create(vec![None, Some(left), right], sea)
}
}
impl Shl {
pub fn new(left: Node, right: Option<Node>, sea: &mut Nodes) -> Self {
Self::create(vec![None, Some(left), right], sea)
}
}
impl Shr {
pub fn new(left: Node, right: Option<Node>, sea: &mut Nodes) -> Self {
Self::create(vec![None, Some(left), right], sea)
}
}
impl Sar {
pub fn new(left: Node, right: Option<Node>, sea: &mut Nodes) -> Self {
Self::create(vec![None, Some(left), right], sea)
}
}

impl Sub {
pub fn new(left: Node, right: Node, sea: &mut Nodes) -> Self {
Expand Down Expand Up @@ -791,8 +806,8 @@ impl Node {
}

impl New {
pub fn new<'t>(ptr: TyMemPtr<'t>, ctrl: Node, sea: &mut Nodes<'t>) -> Self {
Self::create(ptr, vec![Some(ctrl)], sea)
pub fn new<'t>(ptr: TyMemPtr<'t>, inputs: Vec<Option<Node>>, sea: &mut Nodes<'t>) -> Self {
Self::create(ptr, inputs, sea)
}
}

Expand Down
6 changes: 3 additions & 3 deletions src/sea_of_nodes/nodes/scope.rs
Original file line number Diff line number Diff line change
Expand Up @@ -266,12 +266,12 @@ impl Scope {
}

/// Read from memory
fn mem_read(self, alias: usize, sea: &mut Nodes) -> Option<Node> {
pub fn mem_read(self, alias: usize, sea: &mut Nodes) -> Option<Node> {
self.mem(sea)._mem(alias, None, sea)
}

/// Write to memory
fn mem_write(self, alias: usize, st: Node, sea: &mut Nodes) {
pub fn mem_write(self, alias: usize, st: Node, sea: &mut Nodes) {
self.mem(sea)._mem(alias, Some(st), sea);
}

Expand All @@ -288,7 +288,7 @@ impl Scope {
self.update_var_index(index, Some(value), sea);
}

fn update_var_index(self, var_index: usize, st: Option<Node>, sea: &mut Nodes) {
pub fn update_var_index(self, var_index: usize, st: Option<Node>, sea: &mut Nodes) {
let mut old = self.inputs(sea)[var_index];
if let Some(loop_) = old.and_then(|o| o.to_scope(sea)) {
// Lazy Phi!
Expand Down
Loading

0 comments on commit 446c178

Please sign in to comment.