Skip to content

Commit

Permalink
Remove ValueData::Alias
Browse files Browse the repository at this point in the history
  • Loading branch information
sbillig committed Jun 30, 2024
1 parent 660d0b8 commit 45a065f
Show file tree
Hide file tree
Showing 6 changed files with 14 additions and 36 deletions.
2 changes: 1 addition & 1 deletion crates/codegen/src/optim/gvn.rs
Original file line number Diff line number Diff line change
Expand Up @@ -504,7 +504,7 @@ impl GvnSolver {
value: Value,
edge: Edge,
) -> Value {
let mut rep_value = self.leader(func.dfg.resolve_alias(value));
let mut rep_value = self.leader(value);

if let Some(inferred_value) = self.infer_value_impl(edge, rep_value) {
rep_value = inferred_value;
Expand Down
2 changes: 0 additions & 2 deletions crates/codegen/src/optim/sccp.rs
Original file line number Diff line number Diff line change
Expand Up @@ -140,8 +140,6 @@ impl SccpSolver {
for (i, from) in func.dfg.phi_blocks(insn).iter().enumerate() {
if self.is_reachable(func, *from, block) {
let phi_arg = func.dfg.insn_arg(insn, i);
let phi_arg = func.dfg.resolve_alias(phi_arg);

let v_cell = self.lattice[phi_arg];
eval_result = eval_result.join(v_cell);
}
Expand Down
10 changes: 5 additions & 5 deletions crates/codegen/src/optim/simplify_impl.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ use generated_code::{Context, SimplifyRawResult};

pub fn simplify_insn(dfg: &mut DataFlowGraph, insn: Insn) -> Option<SimplifyResult> {
if dfg.is_phi(insn) {
return simplify_phi(dfg, dfg.insn_data(insn));
return simplify_phi(dfg.insn_data(insn));
}

let mut ctx = SimplifyContext::new(dfg);
Expand All @@ -27,7 +27,7 @@ pub fn simplify_insn(dfg: &mut DataFlowGraph, insn: Insn) -> Option<SimplifyResu

pub fn simplify_insn_data(dfg: &mut DataFlowGraph, data: InsnData) -> Option<SimplifyResult> {
if matches!(data, InsnData::Phi { .. }) {
return simplify_phi(dfg, &data);
return simplify_phi(&data);
}

let mut ctx = SimplifyContext::new(dfg);
Expand All @@ -40,12 +40,12 @@ pub enum SimplifyResult {
Insn(InsnData),
}

fn simplify_phi(dfg: &DataFlowGraph, insn_data: &InsnData) -> Option<SimplifyResult> {
fn simplify_phi(insn_data: &InsnData) -> Option<SimplifyResult> {
match insn_data {
InsnData::Phi { values, .. } => {
let mut values = values.iter().copied();
let first_value = values.next().unwrap();
if values.all(|value| dfg.is_same_value(first_value, value)) {
if values.all(|value| value == first_value) {
Some(SimplifyResult::Value(first_value))
} else {
None
Expand Down Expand Up @@ -499,7 +499,7 @@ impl<'a> generated_code::Context for SimplifyContext<'a> {

fn is_eq(&mut self, arg0: ExprValue, arg1: ExprValue) -> Option<()> {
match (arg0.as_value(), arg1.as_value()) {
(Some(val1), Some(val2)) => self.dfg.is_same_value(val1, val2),
(Some(val1), Some(val2)) => val1 == val2,
_ => arg0 == arg1,
}
.then_some(())
Expand Down
32 changes: 7 additions & 25 deletions crates/ir/src/dfg.rs
Original file line number Diff line number Diff line change
Expand Up @@ -82,23 +82,15 @@ impl DataFlowGraph {
}

pub fn change_to_alias(&mut self, value: Value, alias: Value) {
self.values[value] = ValueData::Alias {
alias: self.resolve_alias(alias),
}
}

pub fn resolve_alias(&self, mut value: Value) -> Value {
for _ in 0..self.values.len() {
match self.values[value] {
ValueData::Insn { .. }
| ValueData::Arg { .. }
| ValueData::Immediate { .. }
| ValueData::Global { .. } => return value,
ValueData::Alias { alias } => value = alias,
let mut users = std::mem::take(&mut self.users[value]);
for insn in &users {
for arg in self.insns[*insn].args_mut() {
if *arg == value {
*arg = alias;
}
}
}

panic!("alias loop detected");
self.users[alias].append(&mut users);
}

pub fn make_result(&mut self, insn: Insn) -> Option<ValueData> {
Expand Down Expand Up @@ -159,21 +151,18 @@ impl DataFlowGraph {
}

pub fn value_insn(&self, value: Value) -> Option<Insn> {
let value = self.resolve_alias(value);
match self.value_data(value) {
ValueData::Insn { insn, .. } => Some(*insn),
_ => None,
}
}

pub fn value_ty(&self, value: Value) -> Type {
let value = self.resolve_alias(value);
match &self.values[value] {
ValueData::Insn { ty, .. }
| ValueData::Arg { ty, .. }
| ValueData::Immediate { ty, .. }
| ValueData::Global { ty, .. } => *ty,
ValueData::Alias { .. } => unreachable!(),
}
}

Expand All @@ -182,7 +171,6 @@ impl DataFlowGraph {
}

pub fn value_imm(&self, value: Value) -> Option<Immediate> {
let value = self.resolve_alias(value);
match self.value_data(value) {
ValueData::Immediate { imm, .. } => Some(*imm),
ValueData::Global { gv, .. } => self.ctx.with_gv_store(|s| {
Expand All @@ -199,7 +187,6 @@ impl DataFlowGraph {
}

pub fn value_gv(&self, value: Value) -> Option<GlobalVariable> {
let value = self.resolve_alias(value);
match self.value_data(value) {
ValueData::Global { gv, .. } => Some(*gv),
_ => None,
Expand Down Expand Up @@ -281,18 +268,13 @@ impl DataFlowGraph {
self.insns[insn].is_branch()
}

pub fn is_same_value(&self, v0: Value, v1: Value) -> bool {
self.resolve_alias(v0) == self.resolve_alias(v1)
}

/// Returns `true` if `value` is an immediate.
pub fn is_imm(&self, value: Value) -> bool {
self.value_imm(value).is_some()
}

/// Returns `true` if `value` is a function argument.
pub fn is_arg(&self, value: Value) -> bool {
let value = self.resolve_alias(value);
matches!(self.value_data(value), ValueData::Arg { .. })
}
}
Expand Down
2 changes: 1 addition & 1 deletion crates/ir/src/ir_writer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -205,7 +205,7 @@ trait IrWrite {

impl IrWrite for Value {
fn write(&self, writer: &mut FuncWriter, w: &mut impl io::Write) -> io::Result<()> {
let value = writer.func.dfg.resolve_alias(*self);
let value = *self;
if let Some(imm) = writer.func.dfg.value_imm(value) {
write!(w, "{}.", imm)?;
let ty = writer.func.dfg.value_ty(value);
Expand Down
2 changes: 0 additions & 2 deletions crates/ir/src/value.rs
Original file line number Diff line number Diff line change
Expand Up @@ -80,8 +80,6 @@ pub enum ValueData {

/// The value is a function argument.
Arg { ty: Type, idx: usize },
/// The value is alias to another value.
Alias { alias: Value },

/// The value is immediate value.
Immediate { imm: Immediate, ty: Type },
Expand Down

0 comments on commit 45a065f

Please sign in to comment.