Priorities
Analysis Priorities
- Track correspondence between annotated variables and temps
- Context roots of derived static variables
- SSA for static variables
- Live-variable analysis
- Polyvariant division
- Use post-dominating edges to compute lazy points
- Extend reachability analysis to handle IGOTOs (switch
statements)
- Interprocedural annotations
- Compute may defs and uses (calls, dereferences)
- Permit addresses of static variables to be taken
- Alias analysis
- Convert keepConst to makeStatic and support new policies
Priorities for Setup/Template Constructor
- Discordant merges, unrolling, dynamic branches => multiple units
- Unit identification
- Connecting units
- Unit entry points
- Save and restore static values and execution state
- Work list
- Memory allocation and deallocation
- Multiple versions: statically generated callbacks to GEs
- Checked units: statically generated cache lookups
- Lazy specialization: emitted callbacks and cache lookups
- Unit linearization
- Laziness on edges between units, rather than per-unit
- Switch statements: copying IGOTOs (BTA and s/t merger also require
noted changes to support static and dynamic switches, respectively)
- Single run-time predecessor optimizations
- Cluster unit boundaries
- Optimize unchecked units (e.g., statically copy code for replicate)
- Optimize work-list manipulation (single-successor optimizations)
- Reduce scheduling constraints within units
- Optimize callbacks to GEs
- Regions with multiple entries (and exits)
- Reduce redundancy in static-value cache
- Static estimates of code- and table-space requirements for each unit
- Optimize cache lookups, experiment with different hash functions, etc.
- Implement the cache(n) policy with instruction-cache
invalidation, cache-replacement schemes, etc.
Priorities for the Setup/Template Merger
- Get a very simple path working (one unchecked dynamic-to-static
promotion point, no nested regions, no laziness, no unrolling, no
switch statements, no dynamic branches)
- Constrain setup instructions and template instructions
with holes to their basic blocks
- Code-space allocation
- Static-value-table allocation and access
- Jumping to stitched code
- Long-term interface with the compiler
- Ensure units are placed on cache-line boundaries
- Maintain issue alignment
- Patching of jump tables