parent
76f74fae88
commit
faabcfa643
1 changed files with 28 additions and 16 deletions
|
|
@ -317,36 +317,46 @@ proc skipTrivialIndirections(n: PNode): PNode =
|
||||||
result = n
|
result = n
|
||||||
while true:
|
while true:
|
||||||
case result.kind
|
case result.kind
|
||||||
of {nkDerefExpr, nkHiddenDeref, nkAddr, nkHiddenAddr, nkObjDownConv, nkObjUpConv}:
|
of nkDerefExpr, nkHiddenDeref, nkAddr, nkHiddenAddr, nkObjDownConv, nkObjUpConv:
|
||||||
result = result[0]
|
result = result[0]
|
||||||
of {nkHiddenStdConv, nkHiddenSubConv}:
|
of nkHiddenStdConv, nkHiddenSubConv:
|
||||||
result = result[1]
|
result = result[1]
|
||||||
else: break
|
else: break
|
||||||
|
|
||||||
proc getPotentialWrites(n: PNode, mutate = false): seq[PNode] =
|
proc getPotentialWrites(n: PNode; mutate: bool; result: var seq[PNode]) =
|
||||||
case n.kind:
|
case n.kind:
|
||||||
of nkLiterals, nkIdent: discard
|
of nkLiterals, nkIdent: discard
|
||||||
of nkSym:
|
of nkSym:
|
||||||
if mutate: result.add n
|
if mutate: result.add n
|
||||||
of nkAsgn, nkFastAsgn:
|
of nkAsgn, nkFastAsgn:
|
||||||
result.add getPotentialWrites(n[0], true)
|
getPotentialWrites(n[0], true, result)
|
||||||
result.add getPotentialWrites(n[1], mutate)
|
getPotentialWrites(n[1], mutate, result)
|
||||||
of nkAddr, nkHiddenAddr:
|
of nkAddr, nkHiddenAddr:
|
||||||
result.add getPotentialWrites(n[0], true)
|
getPotentialWrites(n[0], true, result)
|
||||||
of nkCallKinds: #TODO: Find out why in f += 1, f is a nkSym and not a nkHiddenAddr
|
of nkCallKinds:
|
||||||
for s in n.sons:
|
case n.getMagic:
|
||||||
result.add getPotentialWrites(s, true)
|
of mIncl, mExcl, mInc, mDec, mAppendStrCh, mAppendStrStr, mAppendSeqElem,
|
||||||
|
mAddr, mNew, mNewFinalize, mWasMoved, mDestroy, mReset:
|
||||||
|
getPotentialWrites(n[1], true, result)
|
||||||
|
for i in 2..<n.len:
|
||||||
|
getPotentialWrites(n[i], mutate, result)
|
||||||
|
of mSwap:
|
||||||
|
for i in 1..<n.len:
|
||||||
|
getPotentialWrites(n[i], true, result)
|
||||||
else:
|
else:
|
||||||
for s in n.sons:
|
for i in 1..<n.len:
|
||||||
result.add getPotentialWrites(s, mutate)
|
getPotentialWrites(n[i], mutate, result)
|
||||||
|
else:
|
||||||
|
for s in n:
|
||||||
|
getPotentialWrites(s, mutate, result)
|
||||||
|
|
||||||
proc getPotentialReads(n: PNode): seq[PNode] =
|
proc getPotentialReads(n: PNode; result: var seq[PNode]) =
|
||||||
case n.kind:
|
case n.kind:
|
||||||
of nkLiterals, nkIdent: discard
|
of nkLiterals, nkIdent: discard
|
||||||
of nkSym: result.add n
|
of nkSym: result.add n
|
||||||
else:
|
else:
|
||||||
for s in n.sons:
|
for s in n:
|
||||||
result.add getPotentialReads(s)
|
getPotentialReads(s, result)
|
||||||
|
|
||||||
proc genParams(p: BProc, ri: PNode, typ: PType): Rope =
|
proc genParams(p: BProc, ri: PNode, typ: PType): Rope =
|
||||||
# We must generate temporaries in cases like #14396
|
# We must generate temporaries in cases like #14396
|
||||||
|
|
@ -357,10 +367,12 @@ proc genParams(p: BProc, ri: PNode, typ: PType): Rope =
|
||||||
if ri[i].skipTrivialIndirections.kind == nkSym:
|
if ri[i].skipTrivialIndirections.kind == nkSym:
|
||||||
needTmp[i - 1] = potentialAlias(ri[i], potentialWrites)
|
needTmp[i - 1] = potentialAlias(ri[i], potentialWrites)
|
||||||
else:
|
else:
|
||||||
for n in getPotentialReads(ri[i]):
|
var potentialReads: seq[PNode]
|
||||||
|
getPotentialReads(ri[i], potentialReads)
|
||||||
|
for n in potentialReads:
|
||||||
if not needTmp[i - 1]:
|
if not needTmp[i - 1]:
|
||||||
needTmp[i - 1] = potentialAlias(n, potentialWrites)
|
needTmp[i - 1] = potentialAlias(n, potentialWrites)
|
||||||
potentialWrites.add getPotentialWrites(ri[i])
|
getPotentialWrites(ri[i], false, potentialWrites)
|
||||||
if ri[i].kind == nkHiddenAddr:
|
if ri[i].kind == nkHiddenAddr:
|
||||||
# Optimization: don't use a temp, if we would only take the adress anyway
|
# Optimization: don't use a temp, if we would only take the adress anyway
|
||||||
needTmp[i - 1] = false
|
needTmp[i - 1] = false
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue