Commit a72f9f46 authored by Russ Cox's avatar Russ Cox

cmd/gc: avoid duplicate allocation during inlining

Fixes #4667.

R=ken2
CC=golang-dev
https://golang.org/cl/7275046
parent fc6b530f
...@@ -266,6 +266,8 @@ gen(Node *n) ...@@ -266,6 +266,8 @@ gen(Node *n)
Label *lab; Label *lab;
int32 wasregalloc; int32 wasregalloc;
//dump("gen", n);
lno = setlineno(n); lno = setlineno(n);
wasregalloc = anyregalloc(); wasregalloc = anyregalloc();
......
...@@ -553,6 +553,8 @@ mkinlcall1(Node **np, Node *fn, int isddd) ...@@ -553,6 +553,8 @@ mkinlcall1(Node **np, Node *fn, int isddd)
ninit = n->ninit; ninit = n->ninit;
//dumplist("ninit pre", ninit);
if (fn->defn) // local function if (fn->defn) // local function
dcl = fn->defn->dcl; dcl = fn->defn->dcl;
else // imported function else // imported function
...@@ -566,7 +568,8 @@ mkinlcall1(Node **np, Node *fn, int isddd) ...@@ -566,7 +568,8 @@ mkinlcall1(Node **np, Node *fn, int isddd)
ll->n->inlvar = inlvar(ll->n); ll->n->inlvar = inlvar(ll->n);
// Typecheck because inlvar is not necessarily a function parameter. // Typecheck because inlvar is not necessarily a function parameter.
typecheck(&ll->n->inlvar, Erv); typecheck(&ll->n->inlvar, Erv);
ninit = list(ninit, nod(ODCL, ll->n->inlvar, N)); // otherwise gen won't emit the allocations for heapallocs if ((ll->n->class&~PHEAP) != PAUTO)
ninit = list(ninit, nod(ODCL, ll->n->inlvar, N)); // otherwise gen won't emit the allocations for heapallocs
if (ll->n->class == PPARAMOUT) // we rely on the order being correct here if (ll->n->class == PPARAMOUT) // we rely on the order being correct here
inlretvars = list(inlretvars, ll->n->inlvar); inlretvars = list(inlretvars, ll->n->inlvar);
} }
...@@ -733,6 +736,7 @@ mkinlcall1(Node **np, Node *fn, int isddd) ...@@ -733,6 +736,7 @@ mkinlcall1(Node **np, Node *fn, int isddd)
body = list(body, nod(OLABEL, inlretlabel, N)); body = list(body, nod(OLABEL, inlretlabel, N));
typechecklist(body, Etop); typechecklist(body, Etop);
//dumplist("ninit post", ninit);
call = nod(OINLCALL, N, N); call = nod(OINLCALL, N, N);
call->ninit = ninit; call->ninit = ninit;
...@@ -742,6 +746,7 @@ mkinlcall1(Node **np, Node *fn, int isddd) ...@@ -742,6 +746,7 @@ mkinlcall1(Node **np, Node *fn, int isddd)
call->typecheck = 1; call->typecheck = 1;
setlno(call, n->lineno); setlno(call, n->lineno);
//dumplist("call body", body);
*np = call; *np = call;
......
// run
// Copyright 2013 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package main
import (
"fmt"
"os"
"testing"
)
var globl *int
func G() {
F()
}
func F() {
var x int
globl = &x
}
func main() {
nf := testing.AllocsPerRun(100, F)
ng := testing.AllocsPerRun(100, G)
if int(nf) != 1 {
fmt.Printf("AllocsPerRun(100, F) = %v, want 1\n", nf)
os.Exit(1)
}
if int(ng) != 1 {
fmt.Printf("AllocsPerRun(100, G) = %v, want 1\n", ng)
os.Exit(1)
}
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment