]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.ssa] cmd/compile: use function calls instead of special ops for panics
authorKeith Randall <khr@golang.org>
Thu, 17 Sep 2015 23:54:15 +0000 (16:54 -0700)
committerKeith Randall <khr@golang.org>
Mon, 21 Sep 2015 02:54:06 +0000 (02:54 +0000)
There's no need for special ops for panicindex and panicslice.
Just use regular runtime calls.

Change-Id: I71b9b73f4f1ebce1220fdc1e7b7f65cfcf4b7bae
Reviewed-on: https://go-review.googlesource.com/14726
Reviewed-by: David Chase <drchase@google.com>
src/cmd/compile/internal/gc/ssa.go
src/cmd/compile/internal/ssa/gen/AMD64.rules
src/cmd/compile/internal/ssa/gen/AMD64Ops.go
src/cmd/compile/internal/ssa/gen/genericOps.go
src/cmd/compile/internal/ssa/opGen.go
src/cmd/compile/internal/ssa/rewriteAMD64.go

index 4b71d1f8805cf8a6f60f6749585c743b45c217c2..b9da5eda7cec2604f339ea314e45138b185ad622 100644 (file)
@@ -2312,7 +2312,7 @@ func (s *state) boundsCheck(idx, len *ssa.Value) {
 
        // bounds check
        cmp := s.newValue2(ssa.OpIsInBounds, Types[TBOOL], idx, len)
-       s.check(cmp, ssa.OpPanicIndexCheck)
+       s.check(cmp, Panicindex)
 }
 
 // sliceBoundsCheck generates slice bounds checking code.  Checks if 0 <= idx <= len, branches to exit if not.
@@ -2326,11 +2326,11 @@ func (s *state) sliceBoundsCheck(idx, len *ssa.Value) {
 
        // bounds check
        cmp := s.newValue2(ssa.OpIsSliceInBounds, Types[TBOOL], idx, len)
-       s.check(cmp, ssa.OpPanicSliceCheck)
+       s.check(cmp, panicslice)
 }
 
-// If cmp (a bool) is true, panic using the given op.
-func (s *state) check(cmp *ssa.Value, panicOp ssa.Op) {
+// If cmp (a bool) is true, panic using the given function.
+func (s *state) check(cmp *ssa.Value, fn *Node) {
        b := s.endBlock()
        b.Kind = ssa.BlockIf
        b.Control = cmp
@@ -2340,12 +2340,10 @@ func (s *state) check(cmp *ssa.Value, panicOp ssa.Op) {
        b.AddEdgeTo(bNext)
        b.AddEdgeTo(bPanic)
        s.startBlock(bPanic)
-       // The panic check takes/returns memory to ensure that the right
+       // The panic call takes/returns memory to ensure that the right
        // memory state is observed if the panic happens.
-       chk := s.newValue1(panicOp, ssa.TypeMem, s.mem())
-       s.endBlock()
-       bPanic.Kind = ssa.BlockExit
-       bPanic.Control = chk
+       s.rtcall(fn, false, nil)
+
        s.startBlock(bNext)
 }
 
@@ -3700,16 +3698,6 @@ func (s *genState) genValue(v *ssa.Value) {
                q.From.Reg = x86.REG_AX
                q.To.Type = obj.TYPE_MEM
                q.To.Reg = r
-       case ssa.OpAMD64LoweredPanicIndexCheck:
-               p := Prog(obj.ACALL)
-               p.To.Type = obj.TYPE_MEM
-               p.To.Name = obj.NAME_EXTERN
-               p.To.Sym = Linksym(Panicindex.Sym)
-       case ssa.OpAMD64LoweredPanicSliceCheck:
-               p := Prog(obj.ACALL)
-               p.To.Type = obj.TYPE_MEM
-               p.To.Name = obj.NAME_EXTERN
-               p.To.Sym = Linksym(panicslice.Sym)
        case ssa.OpAMD64LoweredGetG:
                r := regnum(v)
                // See the comments in cmd/internal/obj/x86/obj6.go
index 26ad70278f650ac72e500003ecca85782adb222f..5b83c9781fc7d4db5470fd4408f7304f12769ee7 100644 (file)
 (IsSliceInBounds idx len) -> (SETBE (CMPQ idx len))
 
 (PanicNilCheck ptr mem) -> (LoweredPanicNilCheck ptr mem)
-(PanicIndexCheck mem) -> (LoweredPanicIndexCheck mem)
-(PanicSliceCheck mem) -> (LoweredPanicSliceCheck mem)
 (GetG) -> (LoweredGetG)
 
 (Move [size] dst src mem) -> (REPMOVSB dst src (MOVQconst <config.Frontend().TypeUInt64()> [size]) mem)
index b46dbca6c79618189d995b6d1b8e9c6e41dd084e..79d45e990a7dcec69dac20a39ac7ac7602e37a67 100644 (file)
@@ -403,8 +403,6 @@ func init() {
 
                // Pseudo-ops
                {name: "LoweredPanicNilCheck", reg: gp10},
-               {name: "LoweredPanicIndexCheck"},
-               {name: "LoweredPanicSliceCheck"},
                {name: "LoweredGetG", reg: gp01},
        }
 
index 1b9006e4e1a359a7ae83d932108386b6d03caad4..ff63fa880cd0274540e21b42f6b448e6a67886e4 100644 (file)
@@ -325,10 +325,8 @@ var genericOps = []opData{
        {name: "IsSliceInBounds", typ: "Bool"}, // 0 <= arg0 <= arg1
 
        // Pseudo-ops
-       {name: "PanicNilCheck"},   // trigger a dereference fault; arg0=nil ptr, arg1=mem, returns mem
-       {name: "PanicIndexCheck"}, // trigger a bounds check failure, arg0=mem, returns mem
-       {name: "PanicSliceCheck"}, // trigger a slice bounds check failure, arg0=mem, returns mem
-       {name: "GetG"},            // runtime.getg() (read g pointer)
+       {name: "PanicNilCheck"}, // trigger a dereference fault; arg0=nil ptr, arg1=mem, returns mem
+       {name: "GetG"},          // runtime.getg() (read g pointer)
 
        // Indexing operations
        {name: "ArrayIndex"},   // arg0=array, arg1=index.  Returns a[i]
index 7e17b7d552f3490f2159918e8df3ad263bb47d8d..8617cf3e6265c59ac7c86742315a1fb9d8bdf3be 100644 (file)
@@ -270,8 +270,6 @@ const (
        OpAMD64REPMOVSB
        OpAMD64InvertFlags
        OpAMD64LoweredPanicNilCheck
-       OpAMD64LoweredPanicIndexCheck
-       OpAMD64LoweredPanicSliceCheck
        OpAMD64LoweredGetG
 
        OpAdd8
@@ -513,8 +511,6 @@ const (
        OpIsInBounds
        OpIsSliceInBounds
        OpPanicNilCheck
-       OpPanicIndexCheck
-       OpPanicSliceCheck
        OpGetG
        OpArrayIndex
        OpPtrIndex
@@ -3115,14 +3111,6 @@ var opcodeTable = [...]opInfo{
                        },
                },
        },
-       {
-               name: "LoweredPanicIndexCheck",
-               reg:  regInfo{},
-       },
-       {
-               name: "LoweredPanicSliceCheck",
-               reg:  regInfo{},
-       },
        {
                name: "LoweredGetG",
                reg: regInfo{
@@ -4088,14 +4076,6 @@ var opcodeTable = [...]opInfo{
                name:    "PanicNilCheck",
                generic: true,
        },
-       {
-               name:    "PanicIndexCheck",
-               generic: true,
-       },
-       {
-               name:    "PanicSliceCheck",
-               generic: true,
-       },
        {
                name:    "GetG",
                generic: true,
index d4b13f3b9aa8350dbdd80fae9ed384db7a2556ca..50510d2351c086800f1c3390bae187fc43472c25 100644 (file)
@@ -6905,22 +6905,6 @@ func rewriteValueAMD64(v *Value, config *Config) bool {
                goto end6f8a8c559a167d1f0a5901d09a1fb248
        end6f8a8c559a167d1f0a5901d09a1fb248:
                ;
-       case OpPanicIndexCheck:
-               // match: (PanicIndexCheck mem)
-               // cond:
-               // result: (LoweredPanicIndexCheck mem)
-               {
-                       mem := v.Args[0]
-                       v.Op = OpAMD64LoweredPanicIndexCheck
-                       v.AuxInt = 0
-                       v.Aux = nil
-                       v.resetArgs()
-                       v.AddArg(mem)
-                       return true
-               }
-               goto enda5014ba73d3550a5b66424044395c70f
-       enda5014ba73d3550a5b66424044395c70f:
-               ;
        case OpPanicNilCheck:
                // match: (PanicNilCheck ptr mem)
                // cond:
@@ -6939,22 +6923,6 @@ func rewriteValueAMD64(v *Value, config *Config) bool {
                goto enda02b1ad5a6f929b782190145f2c8628b
        enda02b1ad5a6f929b782190145f2c8628b:
                ;
-       case OpPanicSliceCheck:
-               // match: (PanicSliceCheck mem)
-               // cond:
-               // result: (LoweredPanicSliceCheck mem)
-               {
-                       mem := v.Args[0]
-                       v.Op = OpAMD64LoweredPanicSliceCheck
-                       v.AuxInt = 0
-                       v.Aux = nil
-                       v.resetArgs()
-                       v.AddArg(mem)
-                       return true
-               }
-               goto end238ed0074810b55bd2bba7b45cdeed68
-       end238ed0074810b55bd2bba7b45cdeed68:
-               ;
        case OpRsh16Ux16:
                // match: (Rsh16Ux16 <t> x y)
                // cond: