fix:minor optimization fixes

Unique only comparison for equals led to strange results
Fixed by interning in a different spot
This commit is contained in:
Kasey White 2023-02-01 22:03:50 -05:00 committed by Lucas
parent fdf89b7326
commit 9dc2bac2c3
3 changed files with 22 additions and 11 deletions

View File

@ -13,6 +13,7 @@ use uplc::{
},
builtins::DefaultFunction,
machine::cost_model::ExBudget,
optimize::aiken_optimize_and_intern,
parser::interner::Interner,
};
@ -112,9 +113,11 @@ impl<'a> CodeGenerator<'a> {
term,
};
let mut interner = Interner::new();
println!("{}", program.to_pretty());
interner.program(&mut program);
program = aiken_optimize_and_intern(program);
println!("{}", program.to_pretty());
program
}

View File

@ -1,7 +1,16 @@
use crate::ast::{Name, Program};
use crate::{
ast::{Name, Program},
parser::interner::Interner,
};
pub mod shrinker;
pub fn aiken_optimize(term: Program<Name>) -> Program<Name> {
term.builtin_force_reduce().lambda_reduce().inline_reduce()
pub fn aiken_optimize_and_intern(program: Program<Name>) -> Program<Name> {
let mut program = program.builtin_force_reduce();
let mut interner = Interner::new();
interner.program(&mut program);
program.lambda_reduce().inline_reduce()
}

View File

@ -89,7 +89,7 @@ fn builtin_force_reduce(term: &mut Term<Name>, builtin_map: &mut IndexMap<u8, ()
builtin_map.insert(*func as u8, ());
*term = Term::Var(
Name {
text: format!("__{}", func.aiken_name()),
text: format!("__{}_wrapped", func.aiken_name()),
unique: 0.into(),
}
.into(),
@ -160,7 +160,7 @@ fn inline_reduce(term: &mut Term<Name>) {
fn var_occurrences(term: &Term<Name>, search_for: Rc<Name>, occurrences: &mut usize) {
match term {
Term::Var(name) => {
if name.clone() == search_for {
if name.as_ref() == search_for.as_ref() {
*occurrences += 1;
}
}
@ -202,8 +202,7 @@ fn lambda_reduce(term: &mut Term<Name>) {
{
if let replace_term @ (Term::Var(_) | Term::Constant(_)) = argument.as_ref() {
let body = Rc::make_mut(body);
lambda_reduce(body);
*body = substitute_term(body, parameter_name.clone(), replace_term);
*term = substitute_term(body, parameter_name.clone(), replace_term);
}
}
}
@ -226,7 +225,7 @@ fn lambda_reduce(term: &mut Term<Name>) {
fn substitute_term(term: &Term<Name>, original: Rc<Name>, replace_with: &Term<Name>) -> Term<Name> {
match term {
Term::Var(name) => {
if name.clone() == original {
if name.as_ref() == original.as_ref() {
replace_with.clone()
} else {
Term::Var(name.clone())
@ -239,7 +238,7 @@ fn substitute_term(term: &Term<Name>, original: Rc<Name>, replace_with: &Term<Na
parameter_name,
body,
} => {
if parameter_name.clone() != original {
if parameter_name.as_ref() != original.as_ref() {
Term::Lambda {
parameter_name: parameter_name.clone(),
body: Rc::new(substitute_term(body.as_ref(), original, replace_with)),