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:
parent
10c1b46bf7
commit
4ea6fdffe8
|
@ -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())
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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
Loading…
Reference in New Issue