new move analyser2 (#20471)

* produce better code for closure environment creation
* new 'first write' analysis; 
* scope based move analyser
* code cleanup

Co-authored-by: ringabout <43030857+ringabout@users.noreply.github.com>
This commit is contained in:
Andreas Rumpf 2022-10-01 16:46:51 +02:00 • committed by GitHub
commit 8d47bf1822
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
19 changed files with 472 additions and 684 deletions

View file

@ -93,6 +93,7 @@ destroy
destroy
destroy
sink
sink
destroy
copy
(f: 1)
@ -767,8 +768,7 @@ proc initC(): C =
C(o: initO())
proc pair(): tuple[a: C, b: C] =
result.a = initC() # <- when firstWrite tries to find this node to start its analysis it fails, because injectdestructors uses copyTree/shallowCopy
result.b = initC()
result = (a: initC(), b: initC())# <- when firstWrite tries to find this node to start its analysis it fails, because injectdestructors uses copyTree/shallowCopy
discard pair()
@ -818,3 +818,24 @@ proc atomicClosureOp =
atomicClosureOp()
template assertEq(a, b: untyped): untyped =
block:
let
aval = a
bval = b
if aval != bval:
quit "bug!"
proc convoluted =
let _ = (;
var val1: string;
if true: val1 = "22"
true
)
assertEq val1, "22"
assertEq val1, "22"
convoluted()