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, builtins::DefaultFunction,
machine::cost_model::ExBudget, machine::cost_model::ExBudget,
optimize::aiken_optimize_and_intern,
parser::interner::Interner, parser::interner::Interner,
}; };
@ -112,9 +113,11 @@ impl<'a> CodeGenerator<'a> {
term, 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 program
} }

View File

@ -1,7 +1,16 @@
use crate::ast::{Name, Program}; use crate::{
ast::{Name, Program},
parser::interner::Interner,
};
pub mod shrinker; pub mod shrinker;
pub fn aiken_optimize(term: Program<Name>) -> Program<Name> { pub fn aiken_optimize_and_intern(program: Program<Name>) -> Program<Name> {
term.builtin_force_reduce().lambda_reduce().inline_reduce() 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, ()); builtin_map.insert(*func as u8, ());
*term = Term::Var( *term = Term::Var(
Name { Name {
text: format!("__{}", func.aiken_name()), text: format!("__{}_wrapped", func.aiken_name()),
unique: 0.into(), unique: 0.into(),
} }
.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) { fn var_occurrences(term: &Term<Name>, search_for: Rc<Name>, occurrences: &mut usize) {
match term { match term {
Term::Var(name) => { Term::Var(name) => {
if name.clone() == search_for { if name.as_ref() == search_for.as_ref() {
*occurrences += 1; *occurrences += 1;
} }
} }
@ -202,8 +202,7 @@ fn lambda_reduce(term: &mut Term<Name>) {
{ {
if let replace_term @ (Term::Var(_) | Term::Constant(_)) = argument.as_ref() { if let replace_term @ (Term::Var(_) | Term::Constant(_)) = argument.as_ref() {
let body = Rc::make_mut(body); let body = Rc::make_mut(body);
lambda_reduce(body); *term = substitute_term(body, parameter_name.clone(), replace_term);
*body = 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> { fn substitute_term(term: &Term<Name>, original: Rc<Name>, replace_with: &Term<Name>) -> Term<Name> {
match term { match term {
Term::Var(name) => { Term::Var(name) => {
if name.clone() == original { if name.as_ref() == original.as_ref() {
replace_with.clone() replace_with.clone()
} else { } else {
Term::Var(name.clone()) Term::Var(name.clone())
@ -239,7 +238,7 @@ fn substitute_term(term: &Term<Name>, original: Rc<Name>, replace_with: &Term<Na
parameter_name, parameter_name,
body, body,
} => { } => {
if parameter_name.clone() != original { if parameter_name.as_ref() != original.as_ref() {
Term::Lambda { Term::Lambda {
parameter_name: parameter_name.clone(), parameter_name: parameter_name.clone(),
body: Rc::new(substitute_term(body.as_ref(), original, replace_with)), body: Rc::new(substitute_term(body.as_ref(), original, replace_with)),