]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: fix typing of IData opcodes
authorKeith Randall <khr@google.com>
Tue, 29 Oct 2019 20:14:58 +0000 (13:14 -0700)
committerKeith Randall <khr@golang.org>
Tue, 29 Oct 2019 21:21:09 +0000 (21:21 +0000)
The rules for extracting the interface data word don't leave
the result typed correctly. If I do i.([1]*int)[0], the result
should have type *int, not [1]*int. Using (IData x) for the result
keeps the typing of the original top-level Value.

I don't think this would ever cause a real codegen bug, bug fixing it
at least makes the typing shown in ssa.html more consistent.

Change-Id: I239d821c394e58347639387981b0510d13b2f7b7
Reviewed-on: https://go-review.googlesource.com/c/go/+/204042
Run-TryBot: Keith Randall <khr@golang.org>
Reviewed-by: David Chase <drchase@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/cmd/compile/internal/ssa/gen/generic.rules
src/cmd/compile/internal/ssa/rewritegeneric.go

index 1503a5da6cc34607eeb4c2c89924008ce7eeff42..67b646186938487808371501cb1ada48f57decea 100644 (file)
 
 // Putting struct{*byte} and similar into direct interfaces.
 (IMake typ (StructMake1 val)) -> (IMake typ val)
-(StructSelect [0] x:(IData _)) -> x
+(StructSelect [0] (IData x)) -> (IData x)
 
 // un-SSAable values use mem->mem copies
 (Store {t} dst (Load src mem) mem) && !fe.CanSSA(t.(*types.Type)) ->
 (Store _ (ArrayMake0) mem) -> mem
 (Store dst (ArrayMake1 e) mem) -> (Store {e.Type} dst e mem)
 
-// Putting [1]{*byte} and similar into direct interfaces.
+// Putting [1]*byte and similar into direct interfaces.
 (IMake typ (ArrayMake1 val)) -> (IMake typ val)
-(ArraySelect [0] x:(IData _)) -> x
+(ArraySelect [0] (IData x)) -> (IData x)
 
 // string ops
 // Decomposing StringMake and lowering of StringPtr and StringLen
index d7e7974e2bbb7ba0a4f5f6a11923f0505ce05422..dd0ddd4195fb87b7066e33bd3514c6a4b3881b3a 100644 (file)
@@ -6142,18 +6142,18 @@ func rewriteValuegeneric_OpArraySelect_0(v *Value) bool {
                v.AddArg(x)
                return true
        }
-       // match: (ArraySelect [0] x:(IData _))
-       // result: x
+       // match: (ArraySelect [0] (IData x))
+       // result: (IData x)
        for {
                if v.AuxInt != 0 {
                        break
                }
-               x := v.Args[0]
-               if x.Op != OpIData {
+               v_0 := v.Args[0]
+               if v_0.Op != OpIData {
                        break
                }
-               v.reset(OpCopy)
-               v.Type = x.Type
+               x := v_0.Args[0]
+               v.reset(OpIData)
                v.AddArg(x)
                return true
        }
@@ -43502,18 +43502,18 @@ func rewriteValuegeneric_OpStructSelect_10(v *Value) bool {
                v0.AddArg(mem)
                return true
        }
-       // match: (StructSelect [0] x:(IData _))
-       // result: x
+       // match: (StructSelect [0] (IData x))
+       // result: (IData x)
        for {
                if v.AuxInt != 0 {
                        break
                }
-               x := v.Args[0]
-               if x.Op != OpIData {
+               v_0 := v.Args[0]
+               if v_0.Op != OpIData {
                        break
                }
-               v.reset(OpCopy)
-               v.Type = x.Type
+               x := v_0.Args[0]
+               v.reset(OpIData)
                v.AddArg(x)
                return true
        }