[dev.ssa] cmd/compile: copy values during rewrites
Rather than require an explicit Copy on the RHS of rewrite rules,
use rulegen magic to add it.
The advantages to handling this in rulegen are:
* simpler rules
* harder to accidentally miss a Copy
Change-Id: I46853bade83bdf517eee9495bf5a553175277b53
Reviewed-on: https://go-review.googlesource.com/13242
Reviewed-by: Keith Randall <khr@golang.org>
diff --git a/src/cmd/compile/internal/ssa/rewritegeneric.go b/src/cmd/compile/internal/ssa/rewritegeneric.go
index d706fd7..9753bde 100644
--- a/src/cmd/compile/internal/ssa/rewritegeneric.go
+++ b/src/cmd/compile/internal/ssa/rewritegeneric.go
@@ -80,78 +80,82 @@
case OpCom16:
// match: (Com16 (Com16 x))
// cond:
- // result: (Copy x)
+ // result: x
{
if v.Args[0].Op != OpCom16 {
- goto end388d572e5a72fd87a07da5cab243ebdc
+ goto end1ea17710dd4dd7ba4e710e0e4c7b5a56
}
x := v.Args[0].Args[0]
v.Op = OpCopy
v.AuxInt = 0
v.Aux = nil
v.resetArgs()
+ v.Type = x.Type
v.AddArg(x)
return true
}
- goto end388d572e5a72fd87a07da5cab243ebdc
- end388d572e5a72fd87a07da5cab243ebdc:
+ goto end1ea17710dd4dd7ba4e710e0e4c7b5a56
+ end1ea17710dd4dd7ba4e710e0e4c7b5a56:
;
case OpCom32:
// match: (Com32 (Com32 x))
// cond:
- // result: (Copy x)
+ // result: x
{
if v.Args[0].Op != OpCom32 {
- goto end5b2b3834acc7313649923604f685e7c5
+ goto end9a04ed536496e292c27bef4414128cbf
}
x := v.Args[0].Args[0]
v.Op = OpCopy
v.AuxInt = 0
v.Aux = nil
v.resetArgs()
+ v.Type = x.Type
v.AddArg(x)
return true
}
- goto end5b2b3834acc7313649923604f685e7c5
- end5b2b3834acc7313649923604f685e7c5:
+ goto end9a04ed536496e292c27bef4414128cbf
+ end9a04ed536496e292c27bef4414128cbf:
;
case OpCom64:
// match: (Com64 (Com64 x))
// cond:
- // result: (Copy x)
+ // result: x
{
if v.Args[0].Op != OpCom64 {
- goto end6d6312f25d06a327d92f028b1ce50566
+ goto ended44e29d5968f0f7b86972b7bf417ab3
}
x := v.Args[0].Args[0]
v.Op = OpCopy
v.AuxInt = 0
v.Aux = nil
v.resetArgs()
+ v.Type = x.Type
v.AddArg(x)
return true
}
- goto end6d6312f25d06a327d92f028b1ce50566
- end6d6312f25d06a327d92f028b1ce50566:
+ goto ended44e29d5968f0f7b86972b7bf417ab3
+ ended44e29d5968f0f7b86972b7bf417ab3:
;
case OpCom8:
// match: (Com8 (Com8 x))
// cond:
- // result: (Copy x)
+ // result: x
{
if v.Args[0].Op != OpCom8 {
- goto end70cbd85c4b8e82c170dba7c23f8bc0f3
+ goto end4d92ff3ba567d9afd38fc9ca113602ad
}
x := v.Args[0].Args[0]
v.Op = OpCopy
v.AuxInt = 0
v.Aux = nil
v.resetArgs()
+ v.Type = x.Type
v.AddArg(x)
return true
}
- goto end70cbd85c4b8e82c170dba7c23f8bc0f3
- end70cbd85c4b8e82c170dba7c23f8bc0f3:
+ goto end4d92ff3ba567d9afd38fc9ca113602ad
+ end4d92ff3ba567d9afd38fc9ca113602ad:
;
case OpConstString:
// match: (ConstString {s})
@@ -716,11 +720,12 @@
goto end0d922460b7e5ca88324034f4bd6c027c
}
len := v.Args[0].Args[1]
- v.Op = len.Op
- v.AuxInt = len.AuxInt
- v.Aux = len.Aux
+ v.Op = OpCopy
+ v.AuxInt = 0
+ v.Aux = nil
v.resetArgs()
- v.AddArgs(len.Args...)
+ v.Type = len.Type
+ v.AddArg(len)
return true
}
goto end0d922460b7e5ca88324034f4bd6c027c
@@ -735,11 +740,12 @@
goto end061edc5d85c73ad909089af2556d9380
}
ptr := v.Args[0].Args[0]
- v.Op = ptr.Op
- v.AuxInt = ptr.AuxInt
- v.Aux = ptr.Aux
+ v.Op = OpCopy
+ v.AuxInt = 0
+ v.Aux = nil
v.resetArgs()
- v.AddArgs(ptr.Args...)
+ v.Type = ptr.Type
+ v.AddArg(ptr)
return true
}
goto end061edc5d85c73ad909089af2556d9380