Skip to content

Commit 325904f

Browse files
committed
cmd/compile: port liveness analysis to SSA
Passes toolstash-check -all. Change-Id: I92c3c25d6c053f971f346f4fa3bbc76419b58183 Reviewed-on: https://go-review.googlesource.com/38087 Run-TryBot: Matthew Dempsky <[email protected]> TryBot-Result: Gobot Gobot <[email protected]> Reviewed-by: Keith Randall <[email protected]>
1 parent ea8c7da commit 325904f

File tree

6 files changed

+424
-1004
lines changed

6 files changed

+424
-1004
lines changed

src/cmd/compile/fmt_test.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -593,7 +593,6 @@ var knownFormats = map[string]string{
593593
"*cmd/compile/internal/ssa.sparseTreeMapEntry %v": "",
594594
"*cmd/internal/obj.Addr %v": "",
595595
"*cmd/internal/obj.LSym %v": "",
596-
"*cmd/internal/obj.Prog %p": "",
597596
"*cmd/internal/obj.Prog %s": "",
598597
"*cmd/internal/obj.Prog %v": "",
599598
"*math/big.Int %#x": "",

src/cmd/compile/internal/gc/gsubr.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,7 @@ func Patch(p *obj.Prog, to *obj.Prog) {
282282
// Gins inserts instruction as. f is from, t is to.
283283
func Gins(as obj.As, f, t *Node) *obj.Prog {
284284
switch as {
285-
case obj.AVARKILL, obj.AVARLIVE, obj.AVARDEF, obj.ATEXT, obj.AFUNCDATA:
285+
case obj.ATEXT, obj.AFUNCDATA:
286286
default:
287287
Fatalf("unhandled gins op %v", as)
288288
}

src/cmd/compile/internal/gc/pgen.go

Lines changed: 8 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,17 @@ var makefuncdatasym_nsym int
2222
func makefuncdatasym(nameprefix string, funcdatakind int64) *Sym {
2323
sym := lookupN(nameprefix, makefuncdatasym_nsym)
2424
makefuncdatasym_nsym++
25-
pnod := newname(sym)
26-
pnod.Class = PEXTERN
27-
p := Gins(obj.AFUNCDATA, nil, pnod)
25+
p := Prog(obj.AFUNCDATA)
2826
Addrconst(&p.From, funcdatakind)
27+
p.To.Type = obj.TYPE_MEM
28+
p.To.Name = obj.NAME_EXTERN
29+
p.To.Sym = Linksym(sym)
2930
return sym
3031
}
3132

32-
// gvardef inserts a VARDEF for n into the instruction stream.
33+
// TODO(mdempsky): Update to reference OpVar{Def,Kill,Live} instead
34+
// and move to plive.go.
35+
3336
// VARDEF is an annotation for the liveness analysis, marking a place
3437
// where a complete initialization (definition) of a variable begins.
3538
// Since the liveness analysis can see initialization of single-word
@@ -85,55 +88,6 @@ func makefuncdatasym(nameprefix string, funcdatakind int64) *Sym {
8588
// that its argument is certainly dead, for use when the liveness analysis
8689
// would not otherwise be able to deduce that fact.
8790

88-
func gvardefx(n *Node, as obj.As) {
89-
if n == nil {
90-
Fatalf("gvardef nil")
91-
}
92-
if n.Op != ONAME {
93-
Fatalf("gvardef %#v; %v", n.Op, n)
94-
return
95-
}
96-
97-
switch n.Class {
98-
case PAUTO, PPARAM, PPARAMOUT:
99-
if !n.Used() {
100-
Prog(obj.ANOP)
101-
return
102-
}
103-
104-
if as == obj.AVARLIVE {
105-
Gins(as, n, nil)
106-
} else {
107-
Gins(as, nil, n)
108-
}
109-
}
110-
}
111-
112-
func Gvardef(n *Node) {
113-
gvardefx(n, obj.AVARDEF)
114-
}
115-
116-
func Gvarkill(n *Node) {
117-
gvardefx(n, obj.AVARKILL)
118-
}
119-
120-
func Gvarlive(n *Node) {
121-
gvardefx(n, obj.AVARLIVE)
122-
}
123-
124-
func removevardef(firstp *obj.Prog) {
125-
for p := firstp; p != nil; p = p.Link {
126-
for p.Link != nil && (p.Link.As == obj.AVARDEF || p.Link.As == obj.AVARKILL || p.Link.As == obj.AVARLIVE) {
127-
p.Link = p.Link.Link
128-
}
129-
if p.To.Type == obj.TYPE_BRANCH {
130-
for p.To.Val.(*obj.Prog) != nil && (p.To.Val.(*obj.Prog).As == obj.AVARDEF || p.To.Val.(*obj.Prog).As == obj.AVARKILL || p.To.Val.(*obj.Prog).As == obj.AVARLIVE) {
131-
p.To.Val = p.To.Val.(*obj.Prog).Link
132-
}
133-
}
134-
}
135-
}
136-
13791
func emitptrargsmap() {
13892
if Curfn.Func.Nname.Sym.Name == "_" {
13993
return
@@ -407,10 +361,7 @@ func compile(fn *Node) {
407361
}
408362
}
409363

410-
gcargs := makefuncdatasym("gcargs·", obj.FUNCDATA_ArgsPointerMaps)
411-
gclocals := makefuncdatasym("gclocals·", obj.FUNCDATA_LocalsPointerMaps)
412-
413-
genssa(ssafn, ptxt, gcargs, gclocals)
364+
genssa(ssafn, ptxt)
414365

415366
obj.Flushplist(Ctxt, plist) // convert from Prog list to machine code
416367
ptxt = nil // nil to prevent misuse; Prog may have been freed by Flushplist

0 commit comments

Comments
 (0)