Feat: Add global inlining and DCE
Introduce global inlining by allowing the Optimizer to access the environment's global values. This enables replacing global variable accesses with their constant values when appropriate. Additionally, implement Dead Code Elimination (DCE) for global definitions. A global definition can be removed if it was only used for inlining within the current script and has no side effects. Update the Optimizer struct to hold an optional reference to the global values and modify the `Optimizer::new` constructor to accept this. The `Environment::specialize` and `Environment::compile_script` methods are updated to pass the global values to the optimizer. The `SubstitutionMap` is also updated to track script-local global substitutions and used global indices, supporting both global inlining and global DCE.
This commit is contained in:
@@ -182,7 +182,7 @@ impl Environment {
|
||||
let specialized = self.specialize_node(node);
|
||||
|
||||
// 2. Optimize (Level 1: Cracking, Level 2: Collapsing)
|
||||
let optimizer = Optimizer::new(self.optimization_level);
|
||||
let optimizer = Optimizer::new(self.optimization_level).with_globals(self.global_values.clone());
|
||||
let optimized = optimizer.optimize(specialized);
|
||||
|
||||
// 3. TCO (Always performed, converts to ExecNode)
|
||||
@@ -227,7 +227,7 @@ impl Environment {
|
||||
let specialized_ast = sub_specializer.specialize(retyped_ast);
|
||||
|
||||
// 3. Optimize (Phase 2: Cracking & Folding)
|
||||
let optimizer = Optimizer::new(opt_level);
|
||||
let optimizer = Optimizer::new(opt_level).with_globals(global_values.clone());
|
||||
let optimized_ast = optimizer.optimize(specialized_ast);
|
||||
|
||||
// 4. TCO (converts to ExecNode)
|
||||
|
||||
Reference in New Issue
Block a user