-*- text -*-

Pointer analysis to-do list
===========================

CONSTRAINT GENERATION:
- support reflection 
- implement native intrinsics.  These vary by platform.
- unsafe.Pointer conversions.  Three options:
  1) unsoundly (but type-safely) treat p=unsafe.Pointer(x) conversions as
     allocations, losing aliases.  This is what's currently implemented.
  2) unsoundly (but type-safely) treat p=unsafe.Pointer(x) and T(p)
     conversions as interface boxing and unboxing operations.  
     This may preserve some aliasing relations at little cost.
  3) soundly track physical field offsets.  (Summarise dannyb's email here.)
     A downside is that we can't keep the identity field of struct
     allocations that identifies the object.    

OPTIMISATIONS
- pre-solver: PE and LE via HVN/HRU.
- solver: HCD, LCD.
- use sparse bitvectors for ptsets
- use sparse bitvectors for graph edges
- experiment with different worklist algorithms:
   priority queue (solver visit-time order)
   red-black tree (node id order)
   double-ended queue (insertion order)
   fast doubly-linked list (See Zhanh et al PLDI'13)
     (insertion order with fast membership test)
  dannyb recommends sparse bitmap.

API:
- Some optimisations (e.g. LE, PE) may change the API.
  Think about them sooner rather than later.

MISC:
- Test on all platforms.  
  Currently we assume these go/build tags: linux, amd64, !cgo.
