Adds a more convenient way to define Funcs for testing.
For instance,
b1:
v1 = Arg <mem> [.mem]
Plain -> b2
b2:
Exit v1
b3:
v2 = Const <bool> [true]
If v2 -> b3 b2
can be defined as
fun :=Fun("entry",
Bloc("entry",
Valu("mem", OpArg, TypeMem, ".mem"),
Goto("exit")),
Bloc("exit",
Exit("mem")),
Bloc("deadblock",
Valu("deadval", OpConst, TypeBool, true),
If("deadval", "deadblock", "exit")))
Also add an Equiv function to test two Funcs for equivalence.
Change-Id: If1633865aeefb8e765e772b6dad19250d93a413a
Reviewed-on: https://go-review.googlesource.com/9992
Reviewed-by: Keith Randall <khr@golang.org>
Separate out opcode tables into separate ranges for each architecture.
Put architecture-specific opcodes into separate files.
Comment each opcode in a consistent format.
Change-Id: Iddf03c062bc8a88ad2bcebbf6528088c01a75779
Reviewed-on: https://go-review.googlesource.com/10033
Reviewed-by: Alan Donovan <adonovan@google.com>
We don't need this standalone tool any more. We can now feed the
ssa compiler directly from the Go frontend.
Change-Id: I922f1e061c2d3db6bf77acc137d4d1fc7dc86c0d
Reviewed-on: https://go-review.googlesource.com/10034
Reviewed-by: Alan Donovan <adonovan@google.com>
Fix a few compilation errors due to previous merge from tip.
Change-Id: I826ad5a9d602a8f8be2762ad00b030dea6f41bcc
Reviewed-on: https://go-review.googlesource.com/9967
Reviewed-by: Alan Donovan <adonovan@google.com>
Add a simple register allocator. It does only intra-basicblock
allocation. It uses a greedy one-pass allocation treating the
register file as a cache.
Change-Id: Ib6b52f48270e08dfda98f2dd842b05afc3ab01ce
Reviewed-on: https://go-review.googlesource.com/9761
Reviewed-by: Alan Donovan <adonovan@google.com>
Hook into the current compiler to convert the existing
IR (after walk) into SSA. Any function ending in "_ssa"
will take this path. The resulting assembly is printed
and then discarded.
Use gc.Type directly in ssa instead of a wrapper for go types.
It makes the IR->SSA rewrite a lot simpler.
Only a few opcodes are implemented in this change. It is
enough to compile simple examples like
func f(p *int) int { return *p }
func g(a []int, i int) int { return a[i] }
Change-Id: I5e18841b752a83ca0519aa1b2d36ef02ce1de6f9
Reviewed-on: https://go-review.googlesource.com/8971
Reviewed-by: Alan Donovan <adonovan@google.com>
Implement a simple common-subexpression elimination.
It uses value numbering & a dominator tree to detect redundant computation.
Change-Id: Id0ff775e439c22f4d41bdd5976176017dd2a2086
Reviewed-on: https://go-review.googlesource.com/8172
Reviewed-by: Alan Donovan <adonovan@google.com>
Mostly suggested by Alan.
Convert Const* ops to just one Const op.
Use more of go/types.
Get rid of typers, all types must be specified explicitly.
Change-Id: Id4758f2b887d8a6888e88a7e047d97af55e34b62
Reviewed-on: https://go-review.googlesource.com/8110
Reviewed-by: Alan Donovan <adonovan@google.com>
opt: machine-independent optimization
fuse: join basic blocks
lower: convert to machine-dependent opcodes
critical: remove critical edges for register alloc
layout: order basic blocks
schedule: order values in basic blocks
cgen: generate assembly output
opt and lower use machine-generated matching rules using
the rule generator in rulegen/
cgen will probably change in the real compiler, as we want to
generate binary directly instead of ascii assembly.
Change-Id: Iedd7ca70f6f55a4cde30e27cfad6a7fa05691b83
Reviewed-on: https://go-review.googlesource.com/7981
Reviewed-by: Alan Donovan <adonovan@google.com>
Reviewed-by: Keith Randall <khr@golang.org>
These were review comments for CL 6681 that didn't get sent in time.
Change-Id: If161af3655770487f3ba34535d3fb55dbfde7917
Reviewed-on: https://go-review.googlesource.com/7644
Reviewed-by: Keith Randall <khr@golang.org>
First pass adding code for SSA backend. It is standalone for now.
I've included just a few passes to make the review size manageable -
I have more passes coming.
cmd/internal/ssa is the library containing the ssa compiler proper.
cmd/internal/ssa/ssac is a driver that loads an sexpr-based IR,
converts it to SSA form, and calls the above library. It is essentially
throwaway code - it will disappear once the Go compiler calls
cmd/internal/ssa itself. The .goir files in ssac/ are dumps of fibonacci
programs I made from a hacked-up compiler. They are just for testing.
Change-Id: I5ee89356ec12c87cd916681097cd3c2cd591040c
Reviewed-on: https://go-review.googlesource.com/6681
Reviewed-by: Alan Donovan <adonovan@google.com>