# Future This document introduces some ideas for future improvements. ## Basic Optimizations Implement basic optimizations such as common subexpression elimination and loop invariant code motion. Importantly, common subexpression elimination could be used to avoid redundant type checks. ## Operation-specific Optimizations Some operations or combinations of successive operations can be replaced with more efficient operations. Examples: * If `s` is a string, `s[i] == 'x'` doesn't need to construct the intermediate single-character string object `s[i]` but just compare the character value to `ord('x')`. * `a + ':' + b` (two string concetenations) can be implemented as single three-operand concatenation that doesn't construct an intermediate object. * `x in {1, 3}` can be translated into `x == 1 or x == 3` (more generally we need to evaluate all right-hand-side items). ## Integer Range Analysis Implement integer range analysis. This can be used in various ways: * Use untagged representations for some registers. * Use faster integer arithmetic operations for operations that only deal with short integers or that can't overflow. * Remove redundant list and string index checks. ## Always Defined Attributes Somehow make it possible to enforce that attributes in a class are always defined. This makes attribute access faster since we don't need to explicitly check if the attribute is defined.