From 1080f5eba2fedcbe0b9cc20886a5d30eb73be869 Mon Sep 17 00:00:00 2001 From: Andreas Rumpf Date: Mon, 11 Sep 2023 18:48:20 +0200 Subject: [PATCH] produce better code for object constructions and 'result' [backport] (#22668) (cherry picked from commit 8f5b90f886501862bd27d4e0e8244e2f7f0ebc2a) --- compiler/ccgexprs.nim | 8 ++++++-- compiler/cgen.nim | 22 ++++++++++++++++------ tests/misc/trunner.nim | 11 +++++++---- 3 files changed, 29 insertions(+), 12 deletions(-) diff --git a/compiler/ccgexprs.nim b/compiler/ccgexprs.nim index 712b874d93..7d5168ea4b 100644 --- a/compiler/ccgexprs.nim +++ b/compiler/ccgexprs.nim @@ -1550,6 +1550,7 @@ proc genObjConstr(p: BProc, e: PNode, d: var TLoc) = var tmp: TLoc var r: Rope + let needsZeroMem = p.config.selectedGC notin {gcArc, gcAtomicArc, gcOrc} or nfAllFieldsSet notin e.flags if useTemp: getTemp(p, t, tmp) r = rdLoc(tmp) @@ -1558,10 +1559,13 @@ proc genObjConstr(p: BProc, e: PNode, d: var TLoc) = t = t.lastSon.skipTypes(abstractInstOwned) r = "(*$1)" % [r] gcUsage(p.config, e) - else: + elif needsZeroMem: constructLoc(p, tmp) + else: + genObjectInit(p, cpsStmts, t, tmp, constructObj) else: - resetLoc(p, d) + if needsZeroMem: resetLoc(p, d) + else: genObjectInit(p, cpsStmts, d.t, d, if isRef: constructRefObj else: constructObj) r = rdLoc(d) discard getTypeDesc(p.module, t) let ty = getUniqueType(t) diff --git a/compiler/cgen.nim b/compiler/cgen.nim index 994633727b..d71896ef8c 100644 --- a/compiler/cgen.nim +++ b/compiler/cgen.nim @@ -986,11 +986,19 @@ proc closureSetup(p: BProc, prc: PSym) = linefmt(p, cpsStmts, "$1 = ($2) ClE_0;$n", [rdLoc(env.loc), getTypeDesc(p.module, env.typ)]) +const harmless = {nkConstSection, nkTypeSection, nkEmpty, nkCommentStmt, nkTemplateDef, + nkMacroDef, nkMixinStmt, nkBindStmt, nkFormalParams} + + declarativeDefs + proc containsResult(n: PNode): bool = result = false case n.kind - of nkEmpty..pred(nkSym), succ(nkSym)..nkNilLit, nkFormalParams: + of succ(nkEmpty)..pred(nkSym), succ(nkSym)..nkNilLit, harmless: discard + of nkReturnStmt: + for i in 0.. 0 and n[0].kind == nkEmpty of nkSym: if n.sym.kind == skResult: result = true @@ -998,10 +1006,6 @@ proc containsResult(n: PNode): bool = for i in 0..