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()

View file

@ -49,7 +49,7 @@ _ = (
blitTmp, ";")
lvalue = _[0]
lnext = _[1]
result.value = move lvalue
`=sink`(result.value, move lvalue)
`=destroy`(lnext)
`=destroy_1`(lvalue)
-- end of expandArc ------------------------

View file

@ -15,8 +15,7 @@ proc initO(): O =
O(initialized: true)
proc pair(): tuple[a, b: O] =
result.a = initO()
result.b = initO()
result = (a: initO(), b: initO())
proc main() =
discard pair()

View file

@ -21,21 +21,21 @@ proc merge(lower, greater: owned Node): owned Node =
elif greater.isNil:
result = lower
elif lower.y < greater.y:
lower.right = merge(lower.right, greater)
lower.right = merge(move lower.right, greater)
result = lower
else:
greater.left = merge(lower, greater.left)
greater.left = merge(lower, move greater.left)
result = greater
proc splitBinary(orig: owned Node, value: int32): (owned Node, owned Node) =
if orig.isNil:
result = (nil, nil)
elif orig.x < value:
let splitPair = splitBinary(orig.right, value)
let splitPair = splitBinary(move orig.right, value)
orig.right = splitPair[0]
result = (orig, splitPair[1])
else:
let splitPair = splitBinary(orig.left, value)
let splitPair = splitBinary(move orig.left, value)
orig.left = splitPair[1]
result = (splitPair[0], orig)

View file

@ -50,7 +50,7 @@ proc `=destroy`(o: var Pony) =
echo "Pony is dying!"
proc getPony: Pony =
result.name = "Sparkles"
result = Pony(name: "Sparkles")
iterator items(p: Pony): int =
for i in 1..4:

View file

@ -18,7 +18,7 @@ proc createTree(x: int): Foo =
proc take2(a, b: sink Foo) =
echo a.x, " ", b.x
proc allowThis() =
when false:
var otherTree: Foo
try:
for i in 0..3:
@ -51,5 +51,5 @@ proc preventThis() =
else:
discard
allowThis()
#allowThis()
preventThis()

View file

@ -18,7 +18,7 @@ proc createTree(x: int): Foo =
proc take2(a, b: sink Foo) =
echo a.x, " ", b.x
proc allowThis() =
when false:
var otherTree: Foo
try:
for i in 0..3:
@ -47,7 +47,7 @@ proc preventThis2() =
finally:
echo otherTree
allowThis()
#allowThis()
preventThis2()

View file

@ -1,6 +1,6 @@
discard """
cmd: '''nim c --newruntime $file'''
errormsg: "'=copy' is not available for type <owned Button>; requires a copy because it's not the last read of ':envAlt.b1'; another read is done here: tuse_ownedref_after_move.nim(52, 4)"
errormsg: "'=copy' is not available for type <owned Button>; requires a copy because it's not the last read of ':envAlt.b1'; routine: main"
line: 48
"""