]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: reenable phielim during rewrite
authorAlexandru Moșoi <mosoi@google.com>
Thu, 21 Apr 2016 08:11:33 +0000 (10:11 +0200)
committerAlexandru Moșoi <alexandru@mosoi.ro>
Fri, 22 Apr 2016 17:22:37 +0000 (17:22 +0000)
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>
src/cmd/compile/internal/ssa/phielim.go
src/cmd/compile/internal/ssa/rewrite.go

index ce3b5a199a9e9687e60a178800509c850932c0ec..77013c6481bd9da379730a373bb32b8ea4c425c9 100644 (file)
@@ -40,11 +40,7 @@ func phielimValue(v *Value) bool {
        // 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
                }
index 9c625825b90ec33eb38eef71ac343c11ed961b92..c2f8ceadafacc3d28a877dcd95ada0bbe1c3f911 100644 (file)
@@ -40,6 +40,8 @@ func applyRewrite(f *Func, rb func(*Block) bool, rv func(*Value, *Config) bool)
                        }
                        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