| # 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. |