diff options
author | Keith Randall <keithr@alum.mit.edu> | 2019-04-02 15:00:54 -0700 |
---|---|---|
committer | Keith Randall <khr@golang.org> | 2019-04-08 16:46:20 +0000 |
commit | c46ebec322b4f61a219f73f3f0f590cf001a074d (patch) | |
tree | 4763ab89fb375a19212f78db56a942880a983e04 /src/cmd/compile/internal/ssa/deadcode.go | |
parent | 7bb8fc10331eacc34bd38dc557a3856c8923c605 (diff) | |
download | go-c46ebec322b4f61a219f73f3f0f590cf001a074d.tar.gz go-c46ebec322b4f61a219f73f3f0f590cf001a074d.zip |
cmd/compile: get rid of unnecessary inline marks
If no other instruction mentions an inline mark, we can get rid of it.
This normally happens when the inlined function is empty, or when all
of its code is folded into other instructions.
Also use consistent statement-ness for inline mark positions, so that
more of them can be removed in favor of existing instructions.
Update #29571
Fixes #31172
Change-Id: I71f84d355101f37a27960d9e8528f42f92767496
Reviewed-on: https://go-review.googlesource.com/c/go/+/170445
Run-TryBot: Keith Randall <khr@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Josh Bleecher Snyder <josharian@gmail.com>
Diffstat (limited to 'src/cmd/compile/internal/ssa/deadcode.go')
-rw-r--r-- | src/cmd/compile/internal/ssa/deadcode.go | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/src/cmd/compile/internal/ssa/deadcode.go b/src/cmd/compile/internal/ssa/deadcode.go index 3c0f8f858a..ceb2933766 100644 --- a/src/cmd/compile/internal/ssa/deadcode.go +++ b/src/cmd/compile/internal/ssa/deadcode.go @@ -76,6 +76,30 @@ func liveValues(f *Func, reachable []bool) (live []bool, liveOrderStmts []*Value return } + // Record all the inline indexes we need + var liveInlIdx map[int]bool + pt := f.Config.ctxt.PosTable + for _, b := range f.Blocks { + for _, v := range b.Values { + i := pt.Pos(v.Pos).Base().InliningIndex() + if i < 0 { + continue + } + if liveInlIdx == nil { + liveInlIdx = map[int]bool{} + } + liveInlIdx[i] = true + } + i := pt.Pos(b.Pos).Base().InliningIndex() + if i < 0 { + continue + } + if liveInlIdx == nil { + liveInlIdx = map[int]bool{} + } + liveInlIdx[i] = true + } + // Find all live values q := f.Cache.deadcode.q[:0] defer func() { f.Cache.deadcode.q = q }() @@ -103,6 +127,13 @@ func liveValues(f *Func, reachable []bool) (live []bool, liveOrderStmts []*Value } if v.Type.IsVoid() && !live[v.ID] { // The only Void ops are nil checks and inline marks. We must keep these. + if v.Op == OpInlMark && !liveInlIdx[int(v.AuxInt)] { + // We don't need marks for bodies that + // have been completely optimized away. + // TODO: save marks only for bodies which + // have a faulting instruction or a call? + continue + } live[v.ID] = true q = append(q, v) if v.Pos.IsStmt() != src.PosNotStmt { |