]> Cypherpunks.ru repositories - gostls13.git/commitdiff
cmd/compile: remove duplicate nilchecks
authorKeith Randall <khr@golang.org>
Tue, 27 Sep 2016 21:39:27 +0000 (14:39 -0700)
committerKeith Randall <khr@golang.org>
Tue, 27 Sep 2016 23:54:01 +0000 (23:54 +0000)
Mark nil check operations as faulting if their arg is zero.
This lets the late nilcheck pass remove duplicates.

Fixes #17242.

Change-Id: I4c9938d8a5a1e43edd85b4a66f0b34004860bcd9
Reviewed-on: https://go-review.googlesource.com/29952
Run-TryBot: Keith Randall <khr@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
src/cmd/compile/internal/ssa/gen/386Ops.go
src/cmd/compile/internal/ssa/gen/AMD64Ops.go
src/cmd/compile/internal/ssa/gen/ARM64Ops.go
src/cmd/compile/internal/ssa/gen/ARMOps.go
src/cmd/compile/internal/ssa/gen/MIPS64Ops.go
src/cmd/compile/internal/ssa/gen/PPC64Ops.go
src/cmd/compile/internal/ssa/gen/S390XOps.go
src/cmd/compile/internal/ssa/opGen.go
test/nilptr3.go

index 9ec7c861a1dee3c4c5e980d9f49142b8c6c9adc3..43388dfc2264c016bd9e9dfe14882806a8539107 100644 (file)
@@ -439,7 +439,7 @@ func init() {
                // use of DX (the closure pointer)
                {name: "LoweredGetClosurePtr", reg: regInfo{outputs: []regMask{buildReg("DX")}}},
                //arg0=ptr,arg1=mem, returns void.  Faults if ptr is nil.
-               {name: "LoweredNilCheck", argLength: 2, reg: regInfo{inputs: []regMask{gpsp}}, clobberFlags: true, nilCheck: true},
+               {name: "LoweredNilCheck", argLength: 2, reg: regInfo{inputs: []regMask{gpsp}}, clobberFlags: true, nilCheck: true, faultOnNilArg0: true},
 
                // MOVLconvert converts between pointers and integers.
                // We have a special op for this so as to not confuse GC
index 122512205dec6ebed02168e458008f32f7f07dac..f9739e90fcffbc0421fc53e14444906d6eb1e400 100644 (file)
@@ -486,7 +486,7 @@ func init() {
                // use of DX (the closure pointer)
                {name: "LoweredGetClosurePtr", reg: regInfo{outputs: []regMask{buildReg("DX")}}},
                //arg0=ptr,arg1=mem, returns void.  Faults if ptr is nil.
-               {name: "LoweredNilCheck", argLength: 2, reg: regInfo{inputs: []regMask{gpsp}}, clobberFlags: true, nilCheck: true},
+               {name: "LoweredNilCheck", argLength: 2, reg: regInfo{inputs: []regMask{gpsp}}, clobberFlags: true, nilCheck: true, faultOnNilArg0: true},
 
                // MOVQconvert converts between pointers and integers.
                // We have a special op for this so as to not confuse GC
index 4002ab8abc2413dc75b58c2b964dcdaa5e462c85..bbb175b0de041bcf4634e890ea784539d6868e77 100644 (file)
@@ -325,7 +325,7 @@ func init() {
                {name: "CALLinter", argLength: 2, reg: regInfo{inputs: []regMask{gp}, clobbers: callerSave}, aux: "Int64", clobberFlags: true, call: true},                         // call fn by pointer.  arg0=codeptr, arg1=mem, auxint=argsize, returns mem
 
                // pseudo-ops
-               {name: "LoweredNilCheck", argLength: 2, reg: regInfo{inputs: []regMask{gpg}}, nilCheck: true}, // panic if arg0 is nil.  arg1=mem.
+               {name: "LoweredNilCheck", argLength: 2, reg: regInfo{inputs: []regMask{gpg}}, nilCheck: true, faultOnNilArg0: true}, // panic if arg0 is nil.  arg1=mem.
 
                {name: "Equal", argLength: 1, reg: readflags},         // bool, true flags encode x==y false otherwise.
                {name: "NotEqual", argLength: 1, reg: readflags},      // bool, true flags encode x!=y false otherwise.
index 313252ea884403b060512e1a45187bedde9a77ad..a6db703d59bdfc0726db341aa2ec05dd3a0e0f9a 100644 (file)
@@ -381,7 +381,7 @@ func init() {
                {name: "CALLinter", argLength: 2, reg: regInfo{inputs: []regMask{gp}, clobbers: callerSave}, aux: "Int64", clobberFlags: true, call: true},                        // call fn by pointer.  arg0=codeptr, arg1=mem, auxint=argsize, returns mem
 
                // pseudo-ops
-               {name: "LoweredNilCheck", argLength: 2, reg: regInfo{inputs: []regMask{gpg}}, nilCheck: true}, // panic if arg0 is nil.  arg1=mem.
+               {name: "LoweredNilCheck", argLength: 2, reg: regInfo{inputs: []regMask{gpg}}, nilCheck: true, faultOnNilArg0: true}, // panic if arg0 is nil.  arg1=mem.
 
                {name: "Equal", argLength: 1, reg: readflags},         // bool, true flags encode x==y false otherwise.
                {name: "NotEqual", argLength: 1, reg: readflags},      // bool, true flags encode x!=y false otherwise.
index a10352929684892e147912757d88018dd4d5fa5e..537408779e67f91ce8ec3db2569e1354d700e23f 100644 (file)
@@ -336,7 +336,7 @@ func init() {
                },
 
                // pseudo-ops
-               {name: "LoweredNilCheck", argLength: 2, reg: regInfo{inputs: []regMask{gpg}}, nilCheck: true}, // panic if arg0 is nil.  arg1=mem.
+               {name: "LoweredNilCheck", argLength: 2, reg: regInfo{inputs: []regMask{gpg}}, nilCheck: true, faultOnNilArg0: true}, // panic if arg0 is nil.  arg1=mem.
 
                {name: "FPFlagTrue", argLength: 1, reg: readflags},  // bool, true if FP flag is true
                {name: "FPFlagFalse", argLength: 1, reg: readflags}, // bool, true if FP flag is false
index 1fa84f6f25c2a7a250867793cae2a5a536ca523c..d3f4703f8996a7f9956e65cd064655ff96a21c80 100644 (file)
@@ -288,7 +288,7 @@ func init() {
                {name: "LoweredGetClosurePtr", reg: regInfo{outputs: []regMask{ctxt}}},
 
                //arg0=ptr,arg1=mem, returns void.  Faults if ptr is nil.
-               {name: "LoweredNilCheck", argLength: 2, reg: regInfo{inputs: []regMask{gp | sp | sb}, clobbers: tmp}, clobberFlags: true, nilCheck: true},
+               {name: "LoweredNilCheck", argLength: 2, reg: regInfo{inputs: []regMask{gp | sp | sb}, clobbers: tmp}, clobberFlags: true, nilCheck: true, faultOnNilArg0: true},
 
                // Convert pointer to integer, takes a memory operand for ordering.
                {name: "MOVDconvert", argLength: 2, reg: gp11, asm: "MOVD"},
index 9c362ae5e66dca03178aea14e3dabc59dcd80982..3831de403a907d65f56ab0169d42b40e14b3692d 100644 (file)
@@ -370,7 +370,7 @@ func init() {
                // use of R12 (the closure pointer)
                {name: "LoweredGetClosurePtr", reg: regInfo{outputs: []regMask{buildReg("R12")}}},
                // arg0=ptr,arg1=mem, returns void.  Faults if ptr is nil.
-               {name: "LoweredNilCheck", argLength: 2, reg: regInfo{inputs: []regMask{ptrsp}}, clobberFlags: true, nilCheck: true},
+               {name: "LoweredNilCheck", argLength: 2, reg: regInfo{inputs: []regMask{ptrsp}}, clobberFlags: true, nilCheck: true, faultOnNilArg0: true},
 
                // MOVDconvert converts between pointers and integers.
                // We have a special op for this so as to not confuse GC
index 4d47d2067cd10134a4e2417ccab19e3a7f7c0dec..8fae1685a96275a309c98ec436140571bf0caae9 100644 (file)
@@ -4023,10 +4023,11 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:         "LoweredNilCheck",
-               argLen:       2,
-               clobberFlags: true,
-               nilCheck:     true,
+               name:           "LoweredNilCheck",
+               argLen:         2,
+               clobberFlags:   true,
+               nilCheck:       true,
+               faultOnNilArg0: true,
                reg: regInfo{
                        inputs: []inputInfo{
                                {0, 255}, // AX CX DX BX SP BP SI DI
@@ -6992,10 +6993,11 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:         "LoweredNilCheck",
-               argLen:       2,
-               clobberFlags: true,
-               nilCheck:     true,
+               name:           "LoweredNilCheck",
+               argLen:         2,
+               clobberFlags:   true,
+               nilCheck:       true,
+               faultOnNilArg0: true,
                reg: regInfo{
                        inputs: []inputInfo{
                                {0, 65535}, // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15
@@ -10081,9 +10083,10 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:     "LoweredNilCheck",
-               argLen:   2,
-               nilCheck: true,
+               name:           "LoweredNilCheck",
+               argLen:         2,
+               nilCheck:       true,
+               faultOnNilArg0: true,
                reg: regInfo{
                        inputs: []inputInfo{
                                {0, 6143}, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 g R12
@@ -12200,9 +12203,10 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:     "LoweredNilCheck",
-               argLen:   2,
-               nilCheck: true,
+               name:           "LoweredNilCheck",
+               argLen:         2,
+               nilCheck:       true,
+               faultOnNilArg0: true,
                reg: regInfo{
                        inputs: []inputInfo{
                                {0, 268173311}, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R19 R20 R21 R22 R23 R24 R25 R26 g
@@ -13817,9 +13821,10 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:     "LoweredNilCheck",
-               argLen:   2,
-               nilCheck: true,
+               name:           "LoweredNilCheck",
+               argLen:         2,
+               nilCheck:       true,
+               faultOnNilArg0: true,
                reg: regInfo{
                        inputs: []inputInfo{
                                {0, 100663294}, // R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R18 R19 R20 R21 R22 R24 R25 g
@@ -15195,10 +15200,11 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:         "LoweredNilCheck",
-               argLen:       2,
-               clobberFlags: true,
-               nilCheck:     true,
+               name:           "LoweredNilCheck",
+               argLen:         2,
+               clobberFlags:   true,
+               nilCheck:       true,
+               faultOnNilArg0: true,
                reg: regInfo{
                        inputs: []inputInfo{
                                {0, 1073733630}, // SP SB R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R14 R15 R16 R17 R18 R19 R20 R21 R22 R23 R24 R25 R26 R27 R28 R29
@@ -17511,10 +17517,11 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:         "LoweredNilCheck",
-               argLen:       2,
-               clobberFlags: true,
-               nilCheck:     true,
+               name:           "LoweredNilCheck",
+               argLen:         2,
+               clobberFlags:   true,
+               nilCheck:       true,
+               faultOnNilArg0: true,
                reg: regInfo{
                        inputs: []inputInfo{
                                {0, 37886}, // R1 R2 R3 R4 R5 R6 R7 R8 R9 R12 SP
index a97873b97c5ccfba5eadf204995f916f33040039..b965cd262d2888f21b97151a20a056e64b0cd0dc 100644 (file)
@@ -233,3 +233,17 @@ func c1() {
        var x Struct
        func() { x.m() }() // ERROR "removed nil check"
 }
+
+type SS struct {
+       x byte
+}
+
+type TT struct {
+       SS
+}
+
+func f(t *TT) *byte {
+       // See issue 17242.
+       s := &t.SS  // ERROR "removed nil check"
+       return &s.x // ERROR "generated nil check"
+}