Commit 766bcc92 authored by Josh Bleecher Snyder's avatar Josh Bleecher Snyder

[dev.ssa] cmd/compile: don't Compile if Unimplemented

If we've already hit an Unimplemented, there may be important
SSA invariants that do not hold and which could cause
ssa.Compile to hang or spin.

While we're here, make detected dependency cycles stop execution.

Change-Id: Ic7d4eea659e1fe3f2c9b3e8a4eee5567494f46ad
Reviewed-on: https://go-review.googlesource.com/12310Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
parent cd7e0594
......@@ -108,17 +108,18 @@ func buildssa(fn *Node) (ssafn *ssa.Func, usessa bool) {
// Link up variable uses to variable definitions
s.linkForwardReferences()
// Main call to ssa package to compile function
ssa.Compile(s.f)
// Calculate stats about what percentage of functions SSA handles.
if false {
fmt.Printf("SSA implemented: %t\n", !e.unimplemented)
defer func() { fmt.Printf("SSA implemented: %t\n", !e.unimplemented) }()
}
if e.unimplemented {
return nil, false
}
// Main call to ssa package to compile function.
ssa.Compile(s.f)
return s.f, usessa // TODO: return s.f, true once runtime support is in (gc maps, write barriers, etc.)
}
......
......@@ -8,6 +8,7 @@ import (
"bytes"
"fmt"
"io"
"os"
)
func printFunc(f *Func) {
......@@ -68,16 +69,22 @@ func fprintFunc(w io.Writer, f *Func) {
n++
}
if m == n {
fmt.Fprintln(w, "dependency cycle!")
fmt.Fprintln(os.Stderr, "dependency cycle in block", b)
for _, v := range b.Values {
if printed[v.ID] {
continue
}
fmt.Fprint(w, " ")
fmt.Fprintln(w, v.LongString())
fmt.Fprintf(os.Stderr, " %v\n", v.LongString())
printed[v.ID] = true
n++
}
// Things are going to go very badly from here;
// one of the optimization passes is likely to hang.
// Frustratingly, panics here get swallowed by fmt,
// and just we end up here again if we call Fatalf.
// Use our last resort.
os.Exit(1)
return
}
}
......
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