]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.ssa] cmd/compile: make zero-divide panic from div/mod explicit
authorDavid Chase <drchase@google.com>
Wed, 28 Oct 2015 17:55:46 +0000 (13:55 -0400)
committerDavid Chase <drchase@google.com>
Wed, 28 Oct 2015 19:31:11 +0000 (19:31 +0000)
Added an explicit compare-zero and branch-to-panic for
integer division and mod so that other optimizations will
not be fooled by their implicit panics.

Change-Id: Ibf96f636b541c0088861907c537a6beb4b99fa4c
Reviewed-on: https://go-review.googlesource.com/16450
Reviewed-by: Keith Randall <khr@golang.org>
src/cmd/compile/internal/gc/go.go
src/cmd/compile/internal/gc/pgen.go
src/cmd/compile/internal/gc/ssa.go

index dcc16d09343ec776975da8078ed8ad781fbff624..7b73380cd1f4a4c7d636d82f1b09cbe0e6ace6f3 100644 (file)
@@ -858,6 +858,8 @@ var Panicindex *Node
 
 var panicslice *Node
 
+var panicdivide *Node
+
 var throwreturn *Node
 
 var growslice *Node
index b3ba2fbb4673ffa9ac6704046b9909a56c644871..87e99df2e674abce7f1657566ba8896096dcde21 100644 (file)
@@ -339,6 +339,7 @@ func compile(fn *Node) {
                Deferreturn = Sysfunc("deferreturn")
                Panicindex = Sysfunc("panicindex")
                panicslice = Sysfunc("panicslice")
+               panicdivide = Sysfunc("panicdivide")
                throwreturn = Sysfunc("throwreturn")
                growslice = Sysfunc("growslice")
                typedmemmove_nostore = Sysfunc("typedmemmove_nostore")
index c988465e9f746f460ff87db2489522cfb36bee95..4b4dc09f11172e25a36ed5bdf648ea88ea09821c 100644 (file)
@@ -1655,9 +1655,22 @@ func (s *state) expr(n *Node) *ssa.Value {
                                xreal = s.newValue1(ssa.OpCvt64Fto32F, pt, xreal)
                                ximag = s.newValue1(ssa.OpCvt64Fto32F, pt, ximag)
                        }
-
                        return s.newValue2(ssa.OpComplexMake, n.Type, xreal, ximag)
                }
+               if n.Type.IsFloat() {
+                       return s.newValue2(s.ssaOp(n.Op, n.Type), a.Type, a, b)
+               } else {
+                       // do a size-appropriate check for zero
+                       cmp := s.newValue2(s.ssaOp(ONE, n.Type), Types[TBOOL], b, s.zeroVal(n.Type))
+                       s.check(cmp, panicdivide)
+                       return s.newValue2(s.ssaOp(n.Op, n.Type), a.Type, a, b)
+               }
+       case OMOD:
+               a := s.expr(n.Left)
+               b := s.expr(n.Right)
+               // do a size-appropriate check for zero
+               cmp := s.newValue2(s.ssaOp(ONE, n.Type), Types[TBOOL], b, s.zeroVal(n.Type))
+               s.check(cmp, panicdivide)
                return s.newValue2(s.ssaOp(n.Op, n.Type), a.Type, a, b)
        case OADD, OSUB:
                a := s.expr(n.Left)
@@ -1670,7 +1683,7 @@ func (s *state) expr(n *Node) *ssa.Value {
                                s.newValue2(op, pt, s.newValue1(ssa.OpComplexImag, pt, a), s.newValue1(ssa.OpComplexImag, pt, b)))
                }
                return s.newValue2(s.ssaOp(n.Op, n.Type), a.Type, a, b)
-       case OAND, OOR, OMOD, OHMUL, OXOR:
+       case OAND, OOR, OHMUL, OXOR:
                a := s.expr(n.Left)
                b := s.expr(n.Right)
                return s.newValue2(s.ssaOp(n.Op, n.Type), a.Type, a, b)