ARC Analysis in one pass (#16849)

* Analyse last reads all at once

* Integrate firstWrite analysis

* Small cleanup

* Use sets instead of seqs

* Remove instrTargets

* Reap the benefits

* Implement error diagnostics

* Operate on DFA index for lastRead analysis

* Use mgetOrPut
This commit is contained in:
Clyybber 2021-02-09 14:20:58 +01:00 • committed by GitHub
commit ab740cb5b9
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 139 additions and 128 deletions

View file

@ -632,8 +632,10 @@ proc aliases*(obj, field: PNode): AliasKind =
case currFieldPath.kind
of nkSym:
if currFieldPath.sym != currObjPath.sym: return no
of nkDotExpr, nkCheckedFieldExpr:
of nkDotExpr:
if currFieldPath[1].sym != currObjPath[1].sym: return no
of nkCheckedFieldExpr:
if currFieldPath[0][1].sym != currObjPath[0][1].sym: return no
of nkBracketExpr:
if currFieldPath[1].kind in nkLiterals and currObjPath[1].kind in nkLiterals:
if currFieldPath[1].intVal != currObjPath[1].intVal:
@ -642,19 +644,6 @@ proc aliases*(obj, field: PNode): AliasKind =
result = maybe
else: assert false # unreachable
type InstrTargetKind* = enum
None, Full, Partial
proc instrTargets*(insloc, loc: PNode): InstrTargetKind =
case insloc.aliases(loc)
of yes:
Full # x -> x; x -> x.f
of maybe:
Partial # We treat this like a partial write/read
elif loc.aliases(insloc) != no:
Partial # x.f -> x
else: None
proc isAnalysableFieldAccess*(orig: PNode; owner: PSym): bool =
var n = orig
while true: