hook up update mode for reset/reuse

This commit is contained in:
Folkert 2021-11-28 14:25:51 +01:00
parent 0bdda2506c
commit aefe719e56
2 changed files with 31 additions and 11 deletions

View file

@ -1512,6 +1512,7 @@ impl<'a> Expr<'a> {
symbol, symbol,
tag_name, tag_name,
arguments, arguments,
update_mode,
.. ..
} => { } => {
let doc_tag = match tag_name { let doc_tag = match tag_name {
@ -1529,11 +1530,19 @@ impl<'a> Expr<'a> {
.text("Reuse ") .text("Reuse ")
.append(symbol_to_doc(alloc, *symbol)) .append(symbol_to_doc(alloc, *symbol))
.append(alloc.space()) .append(alloc.space())
.append(format!("{:?}", update_mode))
.append(alloc.space())
.append(doc_tag) .append(doc_tag)
.append(alloc.space()) .append(alloc.space())
.append(alloc.intersperse(it, " ")) .append(alloc.intersperse(it, " "))
} }
Reset { symbol, .. } => alloc.text("Reset ").append(symbol_to_doc(alloc, *symbol)), Reset {
symbol,
update_mode,
} => alloc.text(format!(
"Reset {{ symbol: {:?}, id: {} }}",
symbol, update_mode.id
)),
Struct(args) => { Struct(args) => {
let it = args.iter().map(|s| symbol_to_doc(alloc, *s)); let it = args.iter().map(|s| symbol_to_doc(alloc, *s));

View file

@ -1,5 +1,7 @@
use crate::inc_dec::{collect_stmt, occurring_variables_expr, JPLiveVarMap, LiveVarSet}; use crate::inc_dec::{collect_stmt, occurring_variables_expr, JPLiveVarMap, LiveVarSet};
use crate::ir::{BranchInfo, Call, Expr, ListLiteralElement, Proc, Stmt, UpdateModeIds}; use crate::ir::{
BranchInfo, Call, Expr, ListLiteralElement, Proc, Stmt, UpdateModeId, UpdateModeIds,
};
use crate::layout::{Layout, TagIdIntType, UnionLayout}; use crate::layout::{Layout, TagIdIntType, UnionLayout};
use bumpalo::collections::Vec; use bumpalo::collections::Vec;
use bumpalo::Bump; use bumpalo::Bump;
@ -67,7 +69,7 @@ impl<'a, 'i> Env<'a, 'i> {
fn function_s<'a, 'i>( fn function_s<'a, 'i>(
env: &mut Env<'a, 'i>, env: &mut Env<'a, 'i>,
w: Symbol, w: Opportunity,
c: &CtorInfo<'a>, c: &CtorInfo<'a>,
stmt: &'a Stmt<'a>, stmt: &'a Stmt<'a>,
) -> &'a Stmt<'a> { ) -> &'a Stmt<'a> {
@ -85,12 +87,11 @@ fn function_s<'a, 'i>(
} if may_reuse(*tag_layout, *tag_id, c) => { } if may_reuse(*tag_layout, *tag_id, c) => {
// for now, always overwrite the tag ID just to be sure // for now, always overwrite the tag ID just to be sure
let update_tag_id = true; let update_tag_id = true;
let update_mode = env.update_mode_ids.next_id();
let new_expr = Expr::Reuse { let new_expr = Expr::Reuse {
symbol: w, symbol: w.symbol,
update_mode: w.update_mode,
update_tag_id, update_tag_id,
update_mode,
tag_layout: *tag_layout, tag_layout: *tag_layout,
tag_id: *tag_id, tag_id: *tag_id,
tag_name: tag_name.clone(), tag_name: tag_name.clone(),
@ -180,13 +181,22 @@ fn function_s<'a, 'i>(
} }
} }
#[derive(Clone, Copy)]
struct Opportunity {
symbol: Symbol,
update_mode: UpdateModeId,
}
fn try_function_s<'a, 'i>( fn try_function_s<'a, 'i>(
env: &mut Env<'a, 'i>, env: &mut Env<'a, 'i>,
x: Symbol, x: Symbol,
c: &CtorInfo<'a>, c: &CtorInfo<'a>,
stmt: &'a Stmt<'a>, stmt: &'a Stmt<'a>,
) -> &'a Stmt<'a> { ) -> &'a Stmt<'a> {
let w = env.unique_symbol(); let w = Opportunity {
symbol: env.unique_symbol(),
update_mode: env.update_mode_ids.next_id(),
};
let new_stmt = function_s(env, w, c, stmt); let new_stmt = function_s(env, w, c, stmt);
@ -199,7 +209,7 @@ fn try_function_s<'a, 'i>(
fn insert_reset<'a>( fn insert_reset<'a>(
env: &mut Env<'a, '_>, env: &mut Env<'a, '_>,
w: Symbol, w: Opportunity,
x: Symbol, x: Symbol,
union_layout: UnionLayout<'a>, union_layout: UnionLayout<'a>,
mut stmt: &'a Stmt<'a>, mut stmt: &'a Stmt<'a>,
@ -226,15 +236,16 @@ fn insert_reset<'a>(
} }
} }
let update_mode = env.update_mode_ids.next_id();
let reset_expr = Expr::Reset { let reset_expr = Expr::Reset {
symbol: x, symbol: x,
update_mode, update_mode: w.update_mode,
}; };
let layout = Layout::Union(union_layout); let layout = Layout::Union(union_layout);
stmt = env.arena.alloc(Stmt::Let(w, reset_expr, layout, stmt)); stmt = env
.arena
.alloc(Stmt::Let(w.symbol, reset_expr, layout, stmt));
for (symbol, expr, expr_layout) in stack.into_iter().rev() { for (symbol, expr, expr_layout) in stack.into_iter().rev() {
stmt = env stmt = env