diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2019-05-25 20:53:00 +0200 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2019-05-25 20:53:11 +0200 |
commit | 36a398d96fb001b157592eecc798bb846bd4525f (patch) | |
tree | 53f900f680320db389d330707c8cf759073f8400 | |
parent | 3a06022071d3ecf62c8e2f4812062e2e2fe71954 (diff) | |
download | Nim-36a398d96fb001b157592eecc798bb846bd4525f.tar.gz |
C codegen: preparations for better code generation
-rw-r--r-- | compiler/ccgexprs.nim | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/compiler/ccgexprs.nim b/compiler/ccgexprs.nim index 2312ce9fd..a4046635b 100644 --- a/compiler/ccgexprs.nim +++ b/compiler/ccgexprs.nim @@ -152,7 +152,7 @@ proc getStorageLoc(n: PNode): TStorageLoc = result = getStorageLoc(n.sons[0]) 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: if n.kind == nkBracket: # 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 return true result = n.kind in nkCallKinds + #if not result and dest.k == locTemp: + # return true + #if result: # echo n.info, " optimized ", n # result = false @@ -271,7 +274,7 @@ proc genAssignment(p: BProc, dest, src: TLoc, flags: TAssignmentFlags) = of tySequence: if p.config.selectedGC == gcDestructors: 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) else: linefmt(p, cpsStmts, "#genericSeqAssign($1, $2, $3);$n", @@ -280,7 +283,7 @@ proc genAssignment(p: BProc, dest, src: TLoc, flags: TAssignmentFlags) = of tyString: if p.config.selectedGC == gcDestructors: 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) else: if (dest.storage == OnStack and p.config.selectedGC != gcGo) or not usesWriteBarrier(p.config): |