]> Cypherpunks.ru repositories - gostls13.git/commitdiff
cmd/compile/internal/inline: fix latent CalleeEffects issue
authorMatthew Dempsky <mdempsky@google.com>
Mon, 8 Aug 2022 19:31:33 +0000 (12:31 -0700)
committerMatthew Dempsky <mdempsky@google.com>
Tue, 9 Aug 2022 16:41:32 +0000 (16:41 +0000)
ir.ClosureExpr implements ir.InitNode, so ir.InitExpr can prepend init
statements to it. However, CalleeEffects wasn't aware of this and
could cause the init statements to get dropped when inlining a call to
a closure.

This isn't an issue today, because we don't create closures with init
statements. But I ran into this within unified IR.

Easy and robust solution: just take advantage that ir.TakeInit can
handle any node.

Change-Id: Ica05fbf6a8c5be4b11927daf84491a1140da5431
Reviewed-on: https://go-review.googlesource.com/c/go/+/422196
Reviewed-by: Than McIntosh <thanm@google.com>
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
src/cmd/compile/internal/inline/inl.go

index 77848577c6b5ced3690565055d09b12426e3d20a..795486f7a2c992b9b9ffa110451347236c120f25 100644 (file)
@@ -827,18 +827,18 @@ func mkinlcall(n *ir.CallExpr, fn *ir.Func, maxCost int32, inlMap map[*ir.Func]b
 // CalleeEffects appends any side effects from evaluating callee to init.
 func CalleeEffects(init *ir.Nodes, callee ir.Node) {
        for {
+               init.Append(ir.TakeInit(callee)...)
+
                switch callee.Op() {
                case ir.ONAME, ir.OCLOSURE, ir.OMETHEXPR:
                        return // done
 
                case ir.OCONVNOP:
                        conv := callee.(*ir.ConvExpr)
-                       init.Append(ir.TakeInit(conv)...)
                        callee = conv.X
 
                case ir.OINLCALL:
                        ic := callee.(*ir.InlinedCallExpr)
-                       init.Append(ir.TakeInit(ic)...)
                        init.Append(ic.Body.Take()...)
                        callee = ic.SingleResult()