C codegen: preparations for better code generation

This commit is contained in:
Andreas Rumpf 2019-05-25 20:53:00 +02:00
commit 36a398d96f

View file

@ -152,7 +152,7 @@ proc getStorageLoc(n: PNode): TStorageLoc =
result = getStorageLoc(n.sons[0]) result = getStorageLoc(n.sons[0])
else: result = OnUnknown else: result = OnUnknown
proc canMove(p: BProc, n: PNode): bool = proc canMove(p: BProc, n: PNode; dest: TLoc): bool =
# for now we're conservative here: # for now we're conservative here:
if n.kind == nkBracket: if n.kind == nkBracket:
# This needs to be kept consistent with 'const' seq code # This needs to be kept consistent with 'const' seq code
@ -165,6 +165,9 @@ proc canMove(p: BProc, n: PNode): bool =
# Empty strings are codegen'd as NIM_NIL so it's just a pointer copy # Empty strings are codegen'd as NIM_NIL so it's just a pointer copy
return true return true
result = n.kind in nkCallKinds result = n.kind in nkCallKinds
#if not result and dest.k == locTemp:
# return true
#if result: #if result:
# echo n.info, " optimized ", n # echo n.info, " optimized ", n
# result = false # result = false
@ -271,7 +274,7 @@ proc genAssignment(p: BProc, dest, src: TLoc, flags: TAssignmentFlags) =
of tySequence: of tySequence:
if p.config.selectedGC == gcDestructors: if p.config.selectedGC == gcDestructors:
genGenericAsgn(p, dest, src, flags) genGenericAsgn(p, dest, src, flags)
elif (needToCopy notin flags and src.storage != OnStatic) or canMove(p, src.lode): elif (needToCopy notin flags and src.storage != OnStatic) or canMove(p, src.lode, dest):
genRefAssign(p, dest, src) genRefAssign(p, dest, src)
else: else:
linefmt(p, cpsStmts, "#genericSeqAssign($1, $2, $3);$n", linefmt(p, cpsStmts, "#genericSeqAssign($1, $2, $3);$n",
@ -280,7 +283,7 @@ proc genAssignment(p: BProc, dest, src: TLoc, flags: TAssignmentFlags) =
of tyString: of tyString:
if p.config.selectedGC == gcDestructors: if p.config.selectedGC == gcDestructors:
genGenericAsgn(p, dest, src, flags) genGenericAsgn(p, dest, src, flags)
elif (needToCopy notin flags and src.storage != OnStatic) or canMove(p, src.lode): elif (needToCopy notin flags and src.storage != OnStatic) or canMove(p, src.lode, dest):
genRefAssign(p, dest, src) genRefAssign(p, dest, src)
else: else:
if (dest.storage == OnStack and p.config.selectedGC != gcGo) or not usesWriteBarrier(p.config): if (dest.storage == OnStack and p.config.selectedGC != gcGo) or not usesWriteBarrier(p.config):