Aiken UPLC Optimization overhaul (#1052)

* Refactor and structuring optimizations to be less computationally heavy

* Forgot to commit the new file containing the optimization do over

* Point to correct functions in shrinker2

* Split out inline_constr_ops since it adds in builtins that can then be swept up by the builtin force reduction

* Fix: issue where identity reducer was always returning true

* Forward inlining on lambdas produces better results. This is due to a forward pass being able to apply an argument that may have no_inline at the top where as vice-versa would reduce the arg first.

* Clippy and test fixes

* Clear no_inlines when inlining a function

* Convert shrinker2 to replace shrinker and update tests
This commit is contained in:
Kasey 2024-11-13 15:08:36 -05:00 committed by GitHub
parent 10c1b46bf7
commit 4ea6fdffe8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 1035 additions and 825 deletions

View File

@ -3782,7 +3782,7 @@ impl<'a> CodeGenerator<'a> {
interner.program(&mut program); interner.program(&mut program);
let eval_program: Program<NamedDeBruijn> = let eval_program: Program<NamedDeBruijn> =
program.remove_no_inlines().try_into().unwrap(); program.clean_up().try_into().unwrap();
Some( Some(
eval_program eval_program
@ -3892,7 +3892,7 @@ impl<'a> CodeGenerator<'a> {
interner.program(&mut program); interner.program(&mut program);
let eval_program: Program<NamedDeBruijn> = let eval_program: Program<NamedDeBruijn> =
program.remove_no_inlines().try_into().unwrap(); program.clean_up().try_into().unwrap();
let evaluated_term: Term<NamedDeBruijn> = eval_program let evaluated_term: Term<NamedDeBruijn> = eval_program
.eval(ExBudget::default()) .eval(ExBudget::default())
@ -4434,7 +4434,7 @@ impl<'a> CodeGenerator<'a> {
interner.program(&mut program); interner.program(&mut program);
let eval_program: Program<NamedDeBruijn> = let eval_program: Program<NamedDeBruijn> =
program.remove_no_inlines().try_into().unwrap(); program.clean_up().try_into().unwrap();
let evaluated_term: Term<NamedDeBruijn> = eval_program let evaluated_term: Term<NamedDeBruijn> = eval_program
.eval(ExBudget::default()) .eval(ExBudget::default())
@ -4459,7 +4459,7 @@ impl<'a> CodeGenerator<'a> {
interner.program(&mut program); interner.program(&mut program);
let eval_program: Program<NamedDeBruijn> = let eval_program: Program<NamedDeBruijn> =
program.remove_no_inlines().try_into().unwrap(); program.clean_up().try_into().unwrap();
let evaluated_term: Term<NamedDeBruijn> = eval_program let evaluated_term: Term<NamedDeBruijn> = eval_program
.eval(ExBudget::default()) .eval(ExBudget::default())
@ -4880,7 +4880,7 @@ impl<'a> CodeGenerator<'a> {
interner.program(&mut program); interner.program(&mut program);
let eval_program: Program<NamedDeBruijn> = let eval_program: Program<NamedDeBruijn> =
program.remove_no_inlines().try_into().unwrap(); program.clean_up().try_into().unwrap();
let evaluated_term: Term<NamedDeBruijn> = eval_program let evaluated_term: Term<NamedDeBruijn> = eval_program
.eval(ExBudget::default()) .eval(ExBudget::default())

View File

@ -3690,12 +3690,12 @@ fn always_true_validator() {
Term::snd_pair() Term::snd_pair()
.apply(Term::unconstr_data().apply(Term::var(context))) .apply(Term::unconstr_data().apply(Term::var(context)))
.as_var("tail_id_2", |tail_id_2| { .as_var("tail_id_2", |tail_id_2| {
Term::tail_list()
.apply(Term::Var(tail_id_2.clone()))
.as_var("tail_id_3", |tail_id_3| {
Term::head_list() Term::head_list()
.apply(Term::Var(tail_id_2.clone())) .apply(Term::Var(tail_id_2.clone()))
.as_var("__transaction__", |_transaction| { .as_var("__transaction__", |_transaction| {
Term::tail_list().apply(Term::Var(tail_id_2)).as_var(
"tail_id_3",
|tail_id_3| {
Term::head_list() Term::head_list()
.apply(Term::Var(tail_id_3.clone())) .apply(Term::Var(tail_id_3.clone()))
.as_var("__redeemer__", |_redeemer| { .as_var("__redeemer__", |_redeemer| {
@ -3708,8 +3708,7 @@ fn always_true_validator() {
) )
}) })
}) })
}, })
)
}) })
}) })
.delayed_if_then_else( .delayed_if_then_else(
@ -4187,12 +4186,12 @@ fn generic_validator_type_test() {
Term::snd_pair() Term::snd_pair()
.apply(Term::unconstr_data().apply(Term::var(context))) .apply(Term::unconstr_data().apply(Term::var(context)))
.as_var("tail_id_13", |tail_id_13| { .as_var("tail_id_13", |tail_id_13| {
Term::tail_list()
.apply(Term::Var(tail_id_13.clone()))
.as_var("tail_id_14", |tail_id_14| {
Term::head_list() Term::head_list()
.apply(Term::Var(tail_id_13.clone())) .apply(Term::Var(tail_id_13.clone()))
.as_var("__transaction__", |_transaction| { .as_var("__transaction__", |_transaction| {
Term::tail_list().apply(Term::Var(tail_id_13)).as_var(
"tail_id_14",
|tail_id_14| {
Term::head_list() Term::head_list()
.apply(Term::Var(tail_id_14.clone())) .apply(Term::Var(tail_id_14.clone()))
.as_var("__redeemer__", |redeemer| { .as_var("__redeemer__", |redeemer| {
@ -4202,8 +4201,7 @@ fn generic_validator_type_test() {
choose_purpose(redeemer, purpose, trace) choose_purpose(redeemer, purpose, trace)
}) })
}) })
}, })
)
}) })
}) })
.delayed_if_then_else( .delayed_if_then_else(

View File

@ -4,25 +4,39 @@ pub mod interner;
pub mod shrinker; pub mod shrinker;
pub fn aiken_optimize_and_intern(program: Program<Name>) -> Program<Name> { pub fn aiken_optimize_and_intern(program: Program<Name>) -> Program<Name> {
program let mut prog = program.run_once_pass();
.inline_constr_ops()
.bls381_compressor() let mut prev_count = 0;
.builtin_force_reducer()
.lambda_reducer() loop {
.inline_reducer() let (current_program, context) = prog.multi_pass();
.identity_reducer()
.lambda_reducer() if context.node_count == prev_count {
.inline_reducer() prog = current_program;
.force_delay_reducer() break;
.cast_data_reducer() } else {
.builtin_eval_reducer() prog = current_program;
.convert_arithmetic_ops() prev_count = context.node_count;
}
}
prog = prog
.builtin_curry_reducer() .builtin_curry_reducer()
.lambda_reducer() .multi_pass()
.inline_reducer() .0
.identity_reducer() .builtin_curry_reducer();
.builtin_curry_reducer()
.lambda_reducer() loop {
.inline_reducer() let (current_program, context) = prog.multi_pass();
.remove_no_inlines()
if context.node_count == prev_count {
prog = current_program;
break;
} else {
prog = current_program;
prev_count = context.node_count;
}
}
prog.clean_up()
} }

File diff suppressed because it is too large Load Diff