fixes #22268; fixes move codegen (#22288)

This commit is contained in:
ringabout
2023-07-19 18:57:58 +08:00
committed by GitHub
parent 1aff402998
commit 7d9fe106ec
4 changed files with 20 additions and 34 deletions

View File

@@ -2359,6 +2359,13 @@ proc genMove(p: BProc; n: PNode; d: var TLoc) =
if d.k == locNone: getTemp(p, n.typ, d)
if p.config.selectedGC in {gcArc, gcAtomicArc, gcOrc}:
genAssignment(p, d, a, {})
var op = getAttachedOp(p.module.g.graph, n.typ, attachedWasMoved)
if op == nil:
resetLoc(p, a)
else:
let addrExp = makeAddr(n[1], p.module.idgen)
let wasMovedCall = newTreeI(nkCall, n.info, newSymNode(op), addrExp)
genCall(p, wasMovedCall, d)
else:
let flags = if not canMove(p, n[1], d): {needToCopy} else: {}
genAssignment(p, d, a, flags)

View File

@@ -556,7 +556,7 @@ proc fillSeqOp(c: var TLiftCtx; t: PType; body, x, y: PNode) =
body.add setLenSeqCall(c, t, x, y)
forallElements(c, t, body, x, y)
of attachedSink:
let moveCall = genBuiltin(c, mMove, "internalMove", x)
let moveCall = genBuiltin(c, mMove, "move", x)
moveCall.add y
doAssert t.destructor != nil
moveCall.add destructorCall(c, t.destructor, x)
@@ -589,7 +589,7 @@ proc useSeqOrStrOp(c: var TLiftCtx; t: PType; body, x, y: PNode) =
body.add newHookCall(c, t.assignment, x, y)
of attachedSink:
# we always inline the move for better performance:
let moveCall = genBuiltin(c, mMove, "internalMove", x)
let moveCall = genBuiltin(c, mMove, "move", x)
moveCall.add y
doAssert t.destructor != nil
moveCall.add destructorCall(c, t.destructor, x)
@@ -620,7 +620,7 @@ proc fillStrOp(c: var TLiftCtx; t: PType; body, x, y: PNode) =
of attachedAsgn, attachedDeepCopy, attachedDup:
body.add callCodegenProc(c.g, "nimAsgnStrV2", c.info, genAddr(c, x), y)
of attachedSink:
let moveCall = genBuiltin(c, mMove, "internalMove", x)
let moveCall = genBuiltin(c, mMove, "move", x)
moveCall.add y
doAssert t.destructor != nil
moveCall.add destructorCall(c, t.destructor, x)

View File

@@ -66,17 +66,8 @@ proc newFastMoveStmt*(g: ModuleGraph, le, ri: PNode): PNode =
result = newNodeI(nkFastAsgn, le.info, 2)
result[0] = le
result[1] = newNodeIT(nkCall, ri.info, ri.typ)
if g.config.selectedGC in {gcArc, gcAtomicArc, gcOrc}:
result[1].add newSymNode(getCompilerProc(g, "internalMove"))
result[1].add ri
result = newTreeI(nkStmtList, le.info, result,
newTree(nkCall, newSymNode(
getSysMagic(g, ri.info, "=wasMoved", mWasMoved)),
ri
))
else:
result[1].add newSymNode(getSysMagic(g, ri.info, "move", mMove))
result[1].add ri
result[1].add newSymNode(getSysMagic(g, ri.info, "move", mMove))
result[1].add ri
proc lowerTupleUnpacking*(g: ModuleGraph; n: PNode; idgen: IdGenerator; owner: PSym): PNode =
assert n.kind == nkVarTuple

View File

@@ -151,26 +151,10 @@ proc wasMoved*[T](obj: var T) {.inline, noSideEffect.} =
{.cast(raises: []), cast(tags: []).}:
`=wasMoved`(obj)
const notJSnotNims = not defined(js) and not defined(nimscript)
const arcLikeMem = defined(gcArc) or defined(gcAtomicArc) or defined(gcOrc)
when notJSnotNims and arcLikeMem:
proc internalMove[T](x: var T): T {.magic: "Move", noSideEffect, compilerproc.} =
result = x
proc move*[T](x: var T): T {.noSideEffect, nodestroy.} =
{.cast(noSideEffect).}:
when nimvm:
result = internalMove(x)
else:
result = internalMove(x)
{.cast(raises: []), cast(tags: []).}:
`=wasMoved`(x)
else:
proc move*[T](x: var T): T {.magic: "Move", noSideEffect.} =
result = x
{.cast(raises: []), cast(tags: []).}:
`=wasMoved`(x)
proc move*[T](x: var T): T {.magic: "Move", noSideEffect.} =
result = x
{.cast(raises: []), cast(tags: []).}:
`=wasMoved`(x)
type
range*[T]{.magic: "Range".} ## Generic type to construct range types.
@@ -369,6 +353,9 @@ proc arrGet[I: Ordinal;T](a: T; i: I): T {.
proc arrPut[I: Ordinal;T,S](a: T; i: I;
x: S) {.noSideEffect, magic: "ArrPut".}
const arcLikeMem = defined(gcArc) or defined(gcAtomicArc) or defined(gcOrc)
when defined(nimAllowNonVarDestructor) and arcLikeMem:
proc `=destroy`*(x: string) {.inline, magic: "Destroy".} =
discard
@@ -445,6 +432,7 @@ include "system/inclrtl"
const NoFakeVars = defined(nimscript) ## `true` if the backend doesn't support \
## "fake variables" like `var EBADF {.importc.}: cint`.
const notJSnotNims = not defined(js) and not defined(nimscript)
when not defined(js) and not defined(nimSeqsV2):
type