8.6 Static analyzer

since Haxe 3.3.0

Haxe 3.3.0 introduces a new static analyzer for code optimizations. It is enabled by using the -D analyzer compiler flag and consists of multiple modules which can be configured globally with a compiler flag as well as at type-level and field-level with a compiler metadata:

Global configuration

To globally enable an analyzer module -D analyzer-module is used. To globally disable a module -D analyzer-no-module is used. In both cases "module" represents the name of the module to be disabled or enabled:

# Global enable from command line
haxe -D analyzer-module
# Global disable from command line
haxe -D analyzer-no-module
Local configuration

To enable an analyzer module for a given type or field @:analyzer(module) is used. To disable a module @:analyzer(no_module) is used. In both cases "module" represents the name of the module to be disabled or enabled:

@:analyzer(module)
class C {
    @:analyzer(module) function f() { } // Field-level enable
    @:analyzer(no_module) function f() { } // Field-level disable
}
@:analyzer(no_module)
class D { } // Type-level disable
Modules

The static analyzer currently comes with the following modules. Unless noted otherwise they are enabled if -D analyzer is used.

  • const_propagation: Implements sparse conditional constant propagation to promote values that are known at compile-time to usage places. Also detects dead branches.
  • copy_propagation: Detects local variables that alias other local variables and replaces them accordingly.
  • local_dce: Detects and removes unused local variables.
  • fusion: Moves variable expressions to its usage in case of single-occurrence. Disabled on Flash and Java.
  • purity_inference: Infers if fields are "pure", i.e. do not have any side-effects. This can improve the effect of the fusion module.
  • unreachable_code: Reports unreachable code.