]> Cypherpunks repositories - gostls13.git/commit
[dev.ssa] cmd/compile/internal/ssa: Fix scheduler
authorKeith Randall <khr@golang.org>
Mon, 3 Aug 2015 19:33:03 +0000 (12:33 -0700)
committerKeith Randall <khr@golang.org>
Tue, 4 Aug 2015 00:31:56 +0000 (00:31 +0000)
commita678a5c7a59de585a09d7bde2505b8234cc4422e
tree6bc04769dfaf208ca7cb4555e1ee88c4c90f44f7
parent4dcf8ea1a44cd1c566cb492560ee44b9e81a6d9e
[dev.ssa] cmd/compile/internal/ssa: Fix scheduler

The DFS scheduler doesn't do the right thing.  If a Value x is used by
more than one other Value, then x is put into the DFS queue when
its first user (call it y) is visited.  It is not removed and reinserted
when the second user of x (call it z) is visited, so the dependency
between x and z is not respected.  There is no easy way to fix this with
the DFS queue because we'd have to rip values out of the middle of the
DFS queue.

The new scheduler works from the end of the block backwards, scheduling
instructions which have had all of their uses already scheduled.
A simple priority scheme breaks ties between multiple instructions that
are ready to schedule simultaneously.

Keep track of whether we've scheduled or not, and make print() use
the scheduled order if we have.

Fix some shift tests that this change tickles.  Add unsigned right shift tests.

Change-Id: I44164c10bb92ae8ab8f76d7a5180cbafab826ea1
Reviewed-on: https://go-review.googlesource.com/13069
Reviewed-by: Todd Neal <todd@tneal.org>
src/cmd/compile/internal/gc/testdata/arith_ssa.go
src/cmd/compile/internal/ssa/func.go
src/cmd/compile/internal/ssa/print.go
src/cmd/compile/internal/ssa/schedule.go