Remove the "optimization" that was causing the issue.
For the following code the "optimization" was
converting v to (OpCopy x) which is wrong because
x doesn't dominate v.
b1:
y = ...
First .. b3
b2:
x = ...
Goto b3
b3:
v = phi x y
... use v ...
That "optimization" is likely no longer needed because
we now have a second opt pass with a dce in between
which removes blocks of type First.
For pkg/tools/linux_amd64/* the binary size drops
from
82142886 to
82060034.
Change-Id: I10428abbd8b32c5ca66fec3da2e6f3686dddbe31
Reviewed-on: https://go-review.googlesource.com/22312
Run-TryBot: Alexandru Moșoi <alexandru@mosoi.ro>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Keith Randall <khr@golang.org>
// are not v itself, then the phi must remain.
// Otherwise, we can replace it with a copy.
var w *Value
- for i, x := range v.Args {
- if b := v.Block.Preds[i]; b.Kind == BlockFirst && b.Succs[1] == v.Block {
- // This branch is never taken so we can just eliminate it.
- continue
- }
+ for _, x := range v.Args {
if x == v {
continue
}
}
curb = nil
for _, v := range b.Values {
+ change = phielimValue(v) || change
+
// Eliminate copy inputs.
// If any copy input becomes unused, mark it
// as invalid and discard its argument. Repeat