]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: elide unnecessary Not in Phi block controls
authorJakub Ciolek <jakub@ciolek.dev>
Wed, 9 Nov 2022 15:07:11 +0000 (16:07 +0100)
committerKeith Randall <khr@golang.org>
Wed, 16 Nov 2022 22:50:26 +0000 (22:50 +0000)
For a BlockIf, we can change the order of the successors if all OpPhi args are an OpNot and this allows us to elide said OpNots.

When compiling Go itself, there were no hits for (If (Phi (Not x) (Not y) (Not z)) or any other longer patterns.

compilecmp:

errors
errors.As changed

reflect
reflect.Value.FieldByIndex changed
reflect.Value.Method changed
reflect.cvtI2I changed
reflect.Value.FieldByIndexErr changed
reflect.deepValueEqual.func1 496 -> 502  (+1.21%)
reflect.deepValueEqual changed

internal/fmtsort
internal/fmtsort.nilCompare 652 -> 648  (-0.61%)

database/sql
database/sql.convertAssignRows changed

encoding/json
encoding/json.interfaceEncoder changed
encoding/json.(*decodeState).unmarshal 574 -> 571  (-0.52%)
encoding/json.mapEncoder.encode changed
encoding/json.ptrEncoder.encode changed
encoding/json.encodeByteSlice changed
encoding/json.addrMarshalerEncoder changed
encoding/json.addrTextMarshalerEncoder changed
encoding/json.(*decodeState).object changed
encoding/json.sliceEncoder.encode changed
encoding/json.indirect 1303 -> 1286  (-1.30%)

encoding/gob
encoding/gob.encOpFor.func3 changed
encoding/gob.encIndirect changed
encoding/gob.encOpFor.func5 changed
encoding/gob.(*Encoder).encodeInterface changed
encoding/gob.(*Decoder).decodeMap changed

encoding/xml
encoding/xml.(*printer).marshalStruct changed
encoding/xml.(*fieldInfo).value changed
encoding/xml.(*printer).marshalAttr changed
encoding/xml.indirect changed
encoding/xml.(*printer).marshalValue changed

encoding/asn1
encoding/asn1.UnmarshalWithParams 837 -> 845  (+0.96%)

text/template
text/template.indirectInterface changed
text/template.indirect changed
text/template.safeCall changed

net/http/httptrace
net/http/httptrace.(*ClientTrace).compose changed

cmd/fix
main.typefix.func2 changed

cmd/compile/internal/ir
cmd/compile/internal/ir.dumpNode changed

cmd/gofmt
main.match changed
main.subst changed

cmd/compile/internal/ssa
cmd/compile/internal/ssa.rewriteBlockgeneric 626 -> 1030  (+64.54%)

Change-Id: I645b3b3e37302a63e06b79ce74674882fb603ef3
Reviewed-on: https://go-review.googlesource.com/c/go/+/449055
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Joedian Reid <joedian@golang.org>
Run-TryBot: Jakub Ciolek <jakub@ciolek.dev>
Reviewed-by: Keith Randall <khr@golang.org>
Reviewed-by: Keith Randall <khr@google.com>
src/cmd/compile/internal/ssa/_gen/generic.rules
src/cmd/compile/internal/ssa/rewritegeneric.go

index d5f9e5be636b56ced91c8fec8f45142cacb3efc8..8d985526d13eb5276c2ecf15be58a0c8a418780a 100644 (file)
 (NilCheck (GetG mem) mem) => mem
 
 (If (Not cond) yes no) => (If cond no yes)
+(If (Phi <t> nx:(Not x) ny:(Not y)) yes no) && nx.Uses == 1 && ny.Uses == 1 => (If (Phi <t> x y) no yes)
 (If (ConstBool [c]) yes no) && c => (First yes no)
 (If (ConstBool [c]) yes no) && !c => (First no yes)
 
index a76f55813f8c804e772c3e1f3187c52e0020f18b..ad8d33c97d0a3749da2fc5d4c068da84600f7e70 100644 (file)
@@ -32462,6 +32462,35 @@ func rewriteBlockgeneric(b *Block) bool {
                        b.swapSuccessors()
                        return true
                }
+               // match: (If (Phi <t> nx:(Not x) ny:(Not y)) yes no)
+               // cond: nx.Uses == 1 && ny.Uses == 1
+               // result: (If (Phi <t> x y) no yes)
+               for b.Controls[0].Op == OpPhi {
+                       v_0 := b.Controls[0]
+                       if len(v_0.Args) != 2 {
+                               break
+                       }
+                       t := v_0.Type
+                       _ = v_0.Args[1]
+                       nx := v_0.Args[0]
+                       if nx.Op != OpNot {
+                               break
+                       }
+                       x := nx.Args[0]
+                       ny := v_0.Args[1]
+                       if ny.Op != OpNot {
+                               break
+                       }
+                       y := ny.Args[0]
+                       if !(nx.Uses == 1 && ny.Uses == 1) {
+                               break
+                       }
+                       v0 := b.NewValue0(v_0.Pos, OpPhi, t)
+                       v0.AddArg2(x, y)
+                       b.resetWithControl(BlockIf, v0)
+                       b.swapSuccessors()
+                       return true
+               }
                // match: (If (ConstBool [c]) yes no)
                // cond: c
                // result: (First yes no)