mirror of
https://github.com/grin-compiler/grin.git
synced 2024-09-11 15:37:54 +03:00
101 lines
3.4 KiB
Markdown
101 lines
3.4 KiB
Markdown
# Abstract Interpretation
|
||
|
||
Used as Heap Points To analysis implementation.
|
||
|
||
method: compiled abstract interpretation
|
||
|
||
## abstract values and locations
|
||
|
||
- heap location: store count
|
||
- register: register count (variables)
|
||
- node: count of distinct nodes = count of distinct node tags
|
||
- simple type: count of simple types (literal types)
|
||
- tag: count of distinct tags
|
||
|
||
## articles
|
||
- https://en.wikipedia.org/wiki/Data-flow_analysis
|
||
- https://en.wikipedia.org/wiki/Abstract_interpretation
|
||
|
||
### search for: abstract compilation
|
||
- http://www.iro.umontreal.ca/~feeley/papers/BoucherFeeleyCC96.pdf ; Abstract compilation: A new implementation paradigm for static analysis
|
||
- https://pdfs.semanticscholar.org/5ad8/cb6b477793ffb5ec29dde89df6b82dbb6dba.pdf ; A Graph–Free Approach to Data–Flow Analysis
|
||
|
||
## Notes
|
||
- HPT is liberal as much as possible; allow variadic case type (i.e. ANY -> ANY)
|
||
|
||
HPT is a program that fills a table. It calculates value sets for registers and heap locations.
|
||
The possible tags, simple types and heap locations are statically known for the input program.
|
||
|
||
HPT is a data flow analysis that can be implemented as an abstract machine.
|
||
The machine consists of:
|
||
- memory: heap, registers ; store abstract values
|
||
- operations: value setup with constant, value copy, conditional execution ; sequence of operations that models one iteration of a whole program data flow step
|
||
|
||
HINT: it is possible to execute some parts of the machine in parallel. (based on data dependency analysis)
|
||
|
||
HPT abstract value domain:
|
||
|
||
| | node | simple type | heap location |
|
||
| --- | --- | --- | --- |
|
||
| simple type | | simple type | |
|
||
| heap location | node | | |
|
||
| node | | simple type | heap location |
|
||
| register | node | simple type | heap location |
|
||
|
||
- node: `tag + {simple type | heap location}*`
|
||
- heap location: `node`
|
||
- register: `node | simple type | heap location`
|
||
|
||
The HPT can be performed only on high level GRIN.
|
||
|
||
High level GRIN:
|
||
- fetch full nodes only
|
||
- val: T a b | () | a | Lit
|
||
- lpat: T a b | () | a | Lit
|
||
- cpat: T a b | Lit
|
||
|
||
Conteptually the HPT analysis is done like the generic eval function was inlined.
|
||
|
||
## TODO
|
||
|
||
- HPT IR LLVM codegen (HPT IR -> LLVM IR)
|
||
- reduce temporary register usage
|
||
- cleanup HPT IR codegen
|
||
- add sharing analysis
|
||
|
||
### HPT IR improvements
|
||
|
||
- basic block support with block ID, useful for
|
||
- one time variable intialization
|
||
- tracking function body
|
||
- if body
|
||
- tracking of live or dead code
|
||
|
||
- batch `set` commands into one time running blocks
|
||
|
||
- one time run condition for `if`
|
||
|
||
- HPT IR inline support
|
||
- scoped variables (with hierarchy support, i.e. block in block)
|
||
- use explicit function block in IR
|
||
- pass call site local variable context (that contains the function's variables) when calling inlined function
|
||
|
||
### Tooling improvements
|
||
|
||
- Debug support for HPT IR pure
|
||
- [ ] log executed instructions (i.e. writer monad)
|
||
- [x] debug instruction pretty printer that shows the readable variable names, simple types and node tags (i.e. `@1{name}`)
|
||
|
||
- Calculate GRIN statistics related to HPT performance
|
||
- count of data constructors
|
||
- count of `eval` calls
|
||
- count of `stores`
|
||
- count of GRIN variables
|
||
|
||
### Documentation
|
||
|
||
- Benchmark HPT for speed and memory usage
|
||
- HPT IR LLVM
|
||
- HPT IR pure
|
||
- HPT abstract interpreter pure (with inline support)
|