aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile/internal/ssa/deadcode.go
diff options
context:
space:
mode:
authorKeith Randall <khr@golang.org>2015-11-02 08:10:26 -0800
committerKeith Randall <khr@golang.org>2015-11-03 17:29:40 +0000
commit02f4d0a130ba95d7a03418c3ef308d7d21b34af3 (patch)
tree215eb9851e2a439261fd40af792b5d17688cccf9 /src/cmd/compile/internal/ssa/deadcode.go
parent582baae22a108e0b5f09da52c20f5ced83fe6084 (diff)
downloadgo-02f4d0a130ba95d7a03418c3ef308d7d21b34af3.tar.gz
go-02f4d0a130ba95d7a03418c3ef308d7d21b34af3.zip
[dev.ssa] cmd/compile: start arguments as spilled
Declare a function's arguments as having already been spilled so their use just requires a restore. Allow spill locations to be portions of larger objects the stack. Required to load portions of compound input arguments. Rename the memory input to InputMem. Use Arg for the pre-spilled argument values. Change-Id: I8fe2a03ffbba1022d98bfae2052b376b96d32dda Reviewed-on: https://go-review.googlesource.com/16536 Run-TryBot: Keith Randall <khr@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: David Chase <drchase@google.com>
Diffstat (limited to 'src/cmd/compile/internal/ssa/deadcode.go')
-rw-r--r--src/cmd/compile/internal/ssa/deadcode.go34
1 files changed, 24 insertions, 10 deletions
diff --git a/src/cmd/compile/internal/ssa/deadcode.go b/src/cmd/compile/internal/ssa/deadcode.go
index 3351589fda..e9d6525701 100644
--- a/src/cmd/compile/internal/ssa/deadcode.go
+++ b/src/cmd/compile/internal/ssa/deadcode.go
@@ -162,24 +162,38 @@ func deadcode(f *Func) {
}
f.Blocks = f.Blocks[:i]
- // Remove dead entries from namedValues map.
- for name, values := range f.NamedValues {
- i := 0
+ // Remove dead & duplicate entries from namedValues map.
+ s := newSparseSet(f.NumValues())
+ i = 0
+ for _, name := range f.Names {
+ j := 0
+ s.clear()
+ values := f.NamedValues[name]
for _, v := range values {
for v.Op == OpCopy {
v = v.Args[0]
}
- if live[v.ID] {
- values[i] = v
- i++
+ if live[v.ID] && !s.contains(v.ID) {
+ values[j] = v
+ j++
+ s.add(v.ID)
}
}
- f.NamedValues[name] = values[:i]
- tail := values[i:]
- for j := range tail {
- tail[j] = nil
+ if j == 0 {
+ delete(f.NamedValues, name)
+ } else {
+ f.Names[i] = name
+ i++
+ for k := len(values) - 1; k >= j; k-- {
+ values[k] = nil
+ }
+ f.NamedValues[name] = values[:j]
}
}
+ for k := len(f.Names) - 1; k >= i; k-- {
+ f.Names[k] = LocalSlot{}
+ }
+ f.Names = f.Names[:i]
// TODO: renumber Blocks and Values densely?
// TODO: save dead Values and Blocks for reuse? Or should we just let GC handle it?