Commit 38c725b1 authored by David Chase's avatar David Chase

cmd/compile: repair name propagation into aggregate parts

For structs, slices, strings, interfaces, etc, propagation of
names to their components (e.g., complex.real, complex.imag)
is fragile (depends on phase ordering) and not done right
for the "dec" pass.

The dec pass is subsumed into decomposeBuiltin,
and then names are pushed into the args of all
OpFooMake opcodes.

compile/ssa/debug_test.go was fixed to pay attention to
variable values, and the reference files include checks
for the fixes in this CL (which make debugging better).

Change-Id: Ic2591ebb1698d78d07292b92c53667e6c37fa0cd
Reviewed-on: https://go-review.googlesource.com/73210
Run-TryBot: David Chase <drchase@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: 's avatarHeschi Kreinick <heschi@google.com>
parent c4b65fa4
...@@ -344,7 +344,6 @@ var passes = [...]pass{ ...@@ -344,7 +344,6 @@ var passes = [...]pass{
{name: "prove", fn: prove}, {name: "prove", fn: prove},
{name: "loopbce", fn: loopbce}, {name: "loopbce", fn: loopbce},
{name: "decompose builtin", fn: decomposeBuiltIn, required: true}, {name: "decompose builtin", fn: decomposeBuiltIn, required: true},
{name: "dec", fn: dec, required: true},
{name: "late opt", fn: opt, required: true}, // TODO: split required rules and optimizing rules {name: "late opt", fn: opt, required: true}, // TODO: split required rules and optimizing rules
{name: "generic deadcode", fn: deadcode}, {name: "generic deadcode", fn: deadcode},
{name: "check bce", fn: checkbce}, {name: "check bce", fn: checkbce},
......
...@@ -409,6 +409,19 @@ func (h *nextHist) equals(k *nextHist) bool { ...@@ -409,6 +409,19 @@ func (h *nextHist) equals(k *nextHist) bool {
return false return false
} }
} }
for i, hv := range h.vars {
kv := k.vars[i]
if len(hv) != len(kv) {
return false
}
for j, hvt := range hv {
if hvt != kv[j] {
return false
}
}
}
return true return true
} }
......
...@@ -4,12 +4,15 @@ ...@@ -4,12 +4,15 @@
package ssa package ssa
import "cmd/compile/internal/types" import (
"cmd/compile/internal/types"
)
// decompose converts phi ops on compound builtin types into phi // decompose converts phi ops on compound builtin types into phi
// ops on simple types. // ops on simple types, then invokes rewrite rules to decompose
// (The remaining compound ops are decomposed with rewrite rules.) // other ops on those types.
func decomposeBuiltIn(f *Func) { func decomposeBuiltIn(f *Func) {
// Decompose phis
for _, b := range f.Blocks { for _, b := range f.Blocks {
for _, v := range b.Values { for _, v := range b.Values {
if v.Op != OpPhi { if v.Op != OpPhi {
...@@ -19,81 +22,72 @@ func decomposeBuiltIn(f *Func) { ...@@ -19,81 +22,72 @@ func decomposeBuiltIn(f *Func) {
} }
} }
// Decompose other values
applyRewrite(f, rewriteBlockdec, rewriteValuedec)
if f.Config.RegSize == 4 {
applyRewrite(f, rewriteBlockdec64, rewriteValuedec64)
}
// Split up named values into their components. // Split up named values into their components.
// NOTE: the component values we are making are dead at this point.
// We must do the opt pass before any deadcode elimination or we will
// lose the name->value correspondence.
var newNames []LocalSlot var newNames []LocalSlot
for _, name := range f.Names { for _, name := range f.Names {
t := name.Type t := name.Type
switch { switch {
case t.IsInteger() && t.Size() > f.Config.RegSize: case t.IsInteger() && t.Size() > f.Config.RegSize:
var elemType *types.Type
if t.IsSigned() {
elemType = f.Config.Types.Int32
} else {
elemType = f.Config.Types.UInt32
}
hiName, loName := f.fe.SplitInt64(name) hiName, loName := f.fe.SplitInt64(name)
newNames = append(newNames, hiName, loName) newNames = append(newNames, hiName, loName)
for _, v := range f.NamedValues[name] { for _, v := range f.NamedValues[name] {
hi := v.Block.NewValue1(v.Pos, OpInt64Hi, elemType, v) if v.Op != OpInt64Make {
lo := v.Block.NewValue1(v.Pos, OpInt64Lo, f.Config.Types.UInt32, v) continue
f.NamedValues[hiName] = append(f.NamedValues[hiName], hi) }
f.NamedValues[loName] = append(f.NamedValues[loName], lo) f.NamedValues[hiName] = append(f.NamedValues[hiName], v.Args[0])
f.NamedValues[loName] = append(f.NamedValues[loName], v.Args[1])
} }
delete(f.NamedValues, name) delete(f.NamedValues, name)
case t.IsComplex(): case t.IsComplex():
var elemType *types.Type
if t.Size() == 16 {
elemType = f.Config.Types.Float64
} else {
elemType = f.Config.Types.Float32
}
rName, iName := f.fe.SplitComplex(name) rName, iName := f.fe.SplitComplex(name)
newNames = append(newNames, rName, iName) newNames = append(newNames, rName, iName)
for _, v := range f.NamedValues[name] { for _, v := range f.NamedValues[name] {
r := v.Block.NewValue1(v.Pos, OpComplexReal, elemType, v) if v.Op != OpComplexMake {
i := v.Block.NewValue1(v.Pos, OpComplexImag, elemType, v) continue
f.NamedValues[rName] = append(f.NamedValues[rName], r) }
f.NamedValues[iName] = append(f.NamedValues[iName], i) f.NamedValues[rName] = append(f.NamedValues[rName], v.Args[0])
f.NamedValues[iName] = append(f.NamedValues[iName], v.Args[1])
} }
delete(f.NamedValues, name) delete(f.NamedValues, name)
case t.IsString(): case t.IsString():
ptrType := f.Config.Types.BytePtr
lenType := f.Config.Types.Int
ptrName, lenName := f.fe.SplitString(name) ptrName, lenName := f.fe.SplitString(name)
newNames = append(newNames, ptrName, lenName) newNames = append(newNames, ptrName, lenName)
for _, v := range f.NamedValues[name] { for _, v := range f.NamedValues[name] {
ptr := v.Block.NewValue1(v.Pos, OpStringPtr, ptrType, v) if v.Op != OpStringMake {
len := v.Block.NewValue1(v.Pos, OpStringLen, lenType, v) continue
f.NamedValues[ptrName] = append(f.NamedValues[ptrName], ptr) }
f.NamedValues[lenName] = append(f.NamedValues[lenName], len) f.NamedValues[ptrName] = append(f.NamedValues[ptrName], v.Args[0])
f.NamedValues[lenName] = append(f.NamedValues[lenName], v.Args[1])
} }
delete(f.NamedValues, name) delete(f.NamedValues, name)
case t.IsSlice(): case t.IsSlice():
ptrType := f.Config.Types.BytePtr
lenType := f.Config.Types.Int
ptrName, lenName, capName := f.fe.SplitSlice(name) ptrName, lenName, capName := f.fe.SplitSlice(name)
newNames = append(newNames, ptrName, lenName, capName) newNames = append(newNames, ptrName, lenName, capName)
for _, v := range f.NamedValues[name] { for _, v := range f.NamedValues[name] {
ptr := v.Block.NewValue1(v.Pos, OpSlicePtr, ptrType, v) if v.Op != OpSliceMake {
len := v.Block.NewValue1(v.Pos, OpSliceLen, lenType, v) continue
cap := v.Block.NewValue1(v.Pos, OpSliceCap, lenType, v) }
f.NamedValues[ptrName] = append(f.NamedValues[ptrName], ptr) f.NamedValues[ptrName] = append(f.NamedValues[ptrName], v.Args[0])
f.NamedValues[lenName] = append(f.NamedValues[lenName], len) f.NamedValues[lenName] = append(f.NamedValues[lenName], v.Args[1])
f.NamedValues[capName] = append(f.NamedValues[capName], cap) f.NamedValues[capName] = append(f.NamedValues[capName], v.Args[2])
} }
delete(f.NamedValues, name) delete(f.NamedValues, name)
case t.IsInterface(): case t.IsInterface():
ptrType := f.Config.Types.BytePtr
typeName, dataName := f.fe.SplitInterface(name) typeName, dataName := f.fe.SplitInterface(name)
newNames = append(newNames, typeName, dataName) newNames = append(newNames, typeName, dataName)
for _, v := range f.NamedValues[name] { for _, v := range f.NamedValues[name] {
typ := v.Block.NewValue1(v.Pos, OpITab, ptrType, v) if v.Op != OpIMake {
data := v.Block.NewValue1(v.Pos, OpIData, ptrType, v) continue
f.NamedValues[typeName] = append(f.NamedValues[typeName], typ) }
f.NamedValues[dataName] = append(f.NamedValues[dataName], data) f.NamedValues[typeName] = append(f.NamedValues[typeName], v.Args[0])
f.NamedValues[dataName] = append(f.NamedValues[dataName], v.Args[1])
} }
delete(f.NamedValues, name) delete(f.NamedValues, name)
case t.IsFloat(): case t.IsFloat():
...@@ -229,9 +223,6 @@ func decomposeUser(f *Func) { ...@@ -229,9 +223,6 @@ func decomposeUser(f *Func) {
} }
} }
// Split up named values into their components. // Split up named values into their components.
// NOTE: the component values we are making are dead at this point.
// We must do the opt pass before any deadcode elimination or we will
// lose the name->value correspondence.
i := 0 i := 0
var newNames []LocalSlot var newNames []LocalSlot
for _, name := range f.Names { for _, name := range f.Names {
...@@ -266,8 +257,10 @@ func decomposeUserArrayInto(f *Func, name LocalSlot, slots []LocalSlot) []LocalS ...@@ -266,8 +257,10 @@ func decomposeUserArrayInto(f *Func, name LocalSlot, slots []LocalSlot) []LocalS
} }
elemName := f.fe.SplitArray(name) elemName := f.fe.SplitArray(name)
for _, v := range f.NamedValues[name] { for _, v := range f.NamedValues[name] {
e := v.Block.NewValue1I(v.Pos, OpArraySelect, t.ElemType(), 0, v) if v.Op != OpArrayMake1 {
f.NamedValues[elemName] = append(f.NamedValues[elemName], e) continue
}
f.NamedValues[elemName] = append(f.NamedValues[elemName], v.Args[0])
} }
// delete the name for the array as a whole // delete the name for the array as a whole
delete(f.NamedValues, name) delete(f.NamedValues, name)
...@@ -299,11 +292,14 @@ func decomposeUserStructInto(f *Func, name LocalSlot, slots []LocalSlot) []Local ...@@ -299,11 +292,14 @@ func decomposeUserStructInto(f *Func, name LocalSlot, slots []LocalSlot) []Local
} }
} }
makeOp := StructMakeOp(n)
// create named values for each struct field // create named values for each struct field
for _, v := range f.NamedValues[name] { for _, v := range f.NamedValues[name] {
if v.Op != makeOp {
continue
}
for i := 0; i < len(fnames); i++ { for i := 0; i < len(fnames); i++ {
x := v.Block.NewValue1I(v.Pos, OpStructSelect, t.FieldType(i), int64(i), v) f.NamedValues[fnames[i]] = append(f.NamedValues[fnames[i]], v.Args[i])
f.NamedValues[fnames[i]] = append(f.NamedValues[fnames[i]], x)
} }
} }
// remove the name of the struct as a whole // remove the name of the struct as a whole
......
...@@ -8,10 +8,3 @@ package ssa ...@@ -8,10 +8,3 @@ package ssa
func opt(f *Func) { func opt(f *Func) {
applyRewrite(f, rewriteBlockgeneric, rewriteValuegeneric) applyRewrite(f, rewriteBlockgeneric, rewriteValuegeneric)
} }
func dec(f *Func) {
applyRewrite(f, rewriteBlockdec, rewriteValuedec)
if f.Config.RegSize == 4 {
applyRewrite(f, rewriteBlockdec64, rewriteValuedec64)
}
}
...@@ -3,97 +3,97 @@ ...@@ -3,97 +3,97 @@
57: l := line{point{1 + zero, 2 + zero}, point{3 + zero, 4 + zero}} 57: l := line{point{1 + zero, 2 + zero}, point{3 + zero, 4 + zero}}
58: tinycall() // this forces l etc to stack 58: tinycall() // this forces l etc to stack
59: dx := l.end.x - l.begin.x //gdb-dbg=(l.begin.x,l.end.y) 59: dx := l.end.x - l.begin.x //gdb-dbg=(l.begin.x,l.end.y)
60: dy := l.end.y - l.begin.y 60: dy := l.end.y - l.begin.y //gdb-opt=(dx)
61: sink = dx + dy 61: sink = dx + dy
63: hist := make([]int, 7) 63: hist := make([]int, 7) //gdb-opt=(sink)
64: var reader io.Reader = strings.NewReader(cannedInput) //gdb-dbg=(hist/A,cannedInput/A) 64: var reader io.Reader = strings.NewReader(cannedInput) //gdb-dbg=(hist/A,cannedInput/A)
65: if len(os.Args) > 1 { 65: if len(os.Args) > 1 {
70: return 70: return
74: for scanner.Scan() { 74: for scanner.Scan() { //gdb-opt=(scanner/A)
75: s := scanner.Text() 75: s := scanner.Text()
76: i, err := strconv.ParseInt(s, 10, 64) 76: i, err := strconv.ParseInt(s, 10, 64)
77: if err != nil { //gdb-dbg=(i) 77: if err != nil { //gdb-dbg=(i) //gdb-opt=(err,hist,i)
81: hist = ensure(int(i), hist) 81: hist = ensure(int(i), hist)
82: hist[int(i)]++ 82: hist[int(i)]++
74: for scanner.Scan() { 74: for scanner.Scan() { //gdb-opt=(scanner/A)
75: s := scanner.Text() 75: s := scanner.Text()
76: i, err := strconv.ParseInt(s, 10, 64) 76: i, err := strconv.ParseInt(s, 10, 64)
77: if err != nil { //gdb-dbg=(i) 77: if err != nil { //gdb-dbg=(i) //gdb-opt=(err,hist,i)
81: hist = ensure(int(i), hist) 81: hist = ensure(int(i), hist)
82: hist[int(i)]++ 82: hist[int(i)]++
74: for scanner.Scan() { 74: for scanner.Scan() { //gdb-opt=(scanner/A)
75: s := scanner.Text() 75: s := scanner.Text()
76: i, err := strconv.ParseInt(s, 10, 64) 76: i, err := strconv.ParseInt(s, 10, 64)
77: if err != nil { //gdb-dbg=(i) 77: if err != nil { //gdb-dbg=(i) //gdb-opt=(err,hist,i)
81: hist = ensure(int(i), hist) 81: hist = ensure(int(i), hist)
82: hist[int(i)]++ 82: hist[int(i)]++
74: for scanner.Scan() { 74: for scanner.Scan() { //gdb-opt=(scanner/A)
75: s := scanner.Text() 75: s := scanner.Text()
76: i, err := strconv.ParseInt(s, 10, 64) 76: i, err := strconv.ParseInt(s, 10, 64)
77: if err != nil { //gdb-dbg=(i) 77: if err != nil { //gdb-dbg=(i) //gdb-opt=(err,hist,i)
81: hist = ensure(int(i), hist) 81: hist = ensure(int(i), hist)
82: hist[int(i)]++ 82: hist[int(i)]++
74: for scanner.Scan() { 74: for scanner.Scan() { //gdb-opt=(scanner/A)
75: s := scanner.Text() 75: s := scanner.Text()
76: i, err := strconv.ParseInt(s, 10, 64) 76: i, err := strconv.ParseInt(s, 10, 64)
77: if err != nil { //gdb-dbg=(i) 77: if err != nil { //gdb-dbg=(i) //gdb-opt=(err,hist,i)
81: hist = ensure(int(i), hist) 81: hist = ensure(int(i), hist)
82: hist[int(i)]++ 82: hist[int(i)]++
74: for scanner.Scan() { 74: for scanner.Scan() { //gdb-opt=(scanner/A)
75: s := scanner.Text() 75: s := scanner.Text()
76: i, err := strconv.ParseInt(s, 10, 64) 76: i, err := strconv.ParseInt(s, 10, 64)
77: if err != nil { //gdb-dbg=(i) 77: if err != nil { //gdb-dbg=(i) //gdb-opt=(err,hist,i)
81: hist = ensure(int(i), hist) 81: hist = ensure(int(i), hist)
82: hist[int(i)]++ 82: hist[int(i)]++
74: for scanner.Scan() { 74: for scanner.Scan() { //gdb-opt=(scanner/A)
75: s := scanner.Text() 75: s := scanner.Text()
76: i, err := strconv.ParseInt(s, 10, 64) 76: i, err := strconv.ParseInt(s, 10, 64)
77: if err != nil { //gdb-dbg=(i) 77: if err != nil { //gdb-dbg=(i) //gdb-opt=(err,hist,i)
81: hist = ensure(int(i), hist) 81: hist = ensure(int(i), hist)
82: hist[int(i)]++ 82: hist[int(i)]++
74: for scanner.Scan() { 74: for scanner.Scan() { //gdb-opt=(scanner/A)
75: s := scanner.Text() 75: s := scanner.Text()
76: i, err := strconv.ParseInt(s, 10, 64) 76: i, err := strconv.ParseInt(s, 10, 64)
77: if err != nil { //gdb-dbg=(i) 77: if err != nil { //gdb-dbg=(i) //gdb-opt=(err,hist,i)
81: hist = ensure(int(i), hist) 81: hist = ensure(int(i), hist)
82: hist[int(i)]++ 82: hist[int(i)]++
74: for scanner.Scan() { 74: for scanner.Scan() { //gdb-opt=(scanner/A)
75: s := scanner.Text() 75: s := scanner.Text()
76: i, err := strconv.ParseInt(s, 10, 64) 76: i, err := strconv.ParseInt(s, 10, 64)
77: if err != nil { //gdb-dbg=(i) 77: if err != nil { //gdb-dbg=(i) //gdb-opt=(err,hist,i)
81: hist = ensure(int(i), hist) 81: hist = ensure(int(i), hist)
82: hist[int(i)]++ 82: hist[int(i)]++
74: for scanner.Scan() { 74: for scanner.Scan() { //gdb-opt=(scanner/A)
84: t := 0 84: t := 0
85: n := 0 85: n := 0
86: for i, a := range hist { 86: for i, a := range hist {
87: if a == 0 { 87: if a == 0 { //gdb-opt=(a,n,t)
88: continue 88: continue
86: for i, a := range hist { 86: for i, a := range hist {
87: if a == 0 { 87: if a == 0 { //gdb-opt=(a,n,t)
90: t += i * a 90: t += i * a
91: n += a 91: n += a
92: fmt.Fprintf(os.Stderr, "%d\t%d\t%d\t%d\t%d\n", i, a, n, i*a, t) //gdb-dbg=(n,i,t) 92: fmt.Fprintf(os.Stderr, "%d\t%d\t%d\t%d\t%d\n", i, a, n, i*a, t) //gdb-dbg=(n,i,t)
86: for i, a := range hist { 86: for i, a := range hist {
87: if a == 0 { 87: if a == 0 { //gdb-opt=(a,n,t)
90: t += i * a 90: t += i * a
91: n += a 91: n += a
92: fmt.Fprintf(os.Stderr, "%d\t%d\t%d\t%d\t%d\n", i, a, n, i*a, t) //gdb-dbg=(n,i,t) 92: fmt.Fprintf(os.Stderr, "%d\t%d\t%d\t%d\t%d\n", i, a, n, i*a, t) //gdb-dbg=(n,i,t)
86: for i, a := range hist { 86: for i, a := range hist {
87: if a == 0 { 87: if a == 0 { //gdb-opt=(a,n,t)
88: continue 88: continue
86: for i, a := range hist { 86: for i, a := range hist {
87: if a == 0 { 87: if a == 0 { //gdb-opt=(a,n,t)
90: t += i * a 90: t += i * a
91: n += a 91: n += a
92: fmt.Fprintf(os.Stderr, "%d\t%d\t%d\t%d\t%d\n", i, a, n, i*a, t) //gdb-dbg=(n,i,t) 92: fmt.Fprintf(os.Stderr, "%d\t%d\t%d\t%d\t%d\n", i, a, n, i*a, t) //gdb-dbg=(n,i,t)
86: for i, a := range hist { 86: for i, a := range hist {
87: if a == 0 { 87: if a == 0 { //gdb-opt=(a,n,t)
90: t += i * a 90: t += i * a
91: n += a 91: n += a
92: fmt.Fprintf(os.Stderr, "%d\t%d\t%d\t%d\t%d\n", i, a, n, i*a, t) //gdb-dbg=(n,i,t) 92: fmt.Fprintf(os.Stderr, "%d\t%d\t%d\t%d\t%d\n", i, a, n, i*a, t) //gdb-dbg=(n,i,t)
86: for i, a := range hist { 86: for i, a := range hist {
87: if a == 0 { 87: if a == 0 { //gdb-opt=(a,n,t)
88: continue 88: continue
86: for i, a := range hist { 86: for i, a := range hist {
95: } 95: }
...@@ -5,85 +5,85 @@ ...@@ -5,85 +5,85 @@
59: dx := l.end.x - l.begin.x //gdb-dbg=(l.begin.x,l.end.y) 59: dx := l.end.x - l.begin.x //gdb-dbg=(l.begin.x,l.end.y)
$1 = 1 $1 = 1
$2 = 4 $2 = 4
60: dy := l.end.y - l.begin.y 60: dy := l.end.y - l.begin.y //gdb-opt=(dx)
61: sink = dx + dy 61: sink = dx + dy
63: hist := make([]int, 7) 63: hist := make([]int, 7) //gdb-opt=(sink)
64: var reader io.Reader = strings.NewReader(cannedInput) //gdb-dbg=(hist/A,cannedInput/A) 64: var reader io.Reader = strings.NewReader(cannedInput) //gdb-dbg=(hist/A,cannedInput/A)
$3 = []int = {0, 0, 0, 0, 0, 0, 0} $3 = []int = {0, 0, 0, 0, 0, 0, 0}
$4 = "1\n1\n1\n2\n2\n2\n4\n4\n5\n" $4 = "1\n1\n1\n2\n2\n2\n4\n4\n5\n"
65: if len(os.Args) > 1 { 65: if len(os.Args) > 1 {
70: return 70: return
74: for scanner.Scan() { 74: for scanner.Scan() { //gdb-opt=(scanner/A)
75: s := scanner.Text() 75: s := scanner.Text()
76: i, err := strconv.ParseInt(s, 10, 64) 76: i, err := strconv.ParseInt(s, 10, 64)
77: if err != nil { //gdb-dbg=(i) 77: if err != nil { //gdb-dbg=(i) //gdb-opt=(err,hist,i)
$5 = 1 $5 = 1
81: hist = ensure(int(i), hist) 81: hist = ensure(int(i), hist)
82: hist[int(i)]++ 82: hist[int(i)]++
74: for scanner.Scan() { 74: for scanner.Scan() { //gdb-opt=(scanner/A)
75: s := scanner.Text() 75: s := scanner.Text()
76: i, err := strconv.ParseInt(s, 10, 64) 76: i, err := strconv.ParseInt(s, 10, 64)
77: if err != nil { //gdb-dbg=(i) 77: if err != nil { //gdb-dbg=(i) //gdb-opt=(err,hist,i)
$6 = 1 $6 = 1
81: hist = ensure(int(i), hist) 81: hist = ensure(int(i), hist)
82: hist[int(i)]++ 82: hist[int(i)]++
74: for scanner.Scan() { 74: for scanner.Scan() { //gdb-opt=(scanner/A)
75: s := scanner.Text() 75: s := scanner.Text()
76: i, err := strconv.ParseInt(s, 10, 64) 76: i, err := strconv.ParseInt(s, 10, 64)
77: if err != nil { //gdb-dbg=(i) 77: if err != nil { //gdb-dbg=(i) //gdb-opt=(err,hist,i)
$7 = 1 $7 = 1
81: hist = ensure(int(i), hist) 81: hist = ensure(int(i), hist)
82: hist[int(i)]++ 82: hist[int(i)]++
74: for scanner.Scan() { 74: for scanner.Scan() { //gdb-opt=(scanner/A)
75: s := scanner.Text() 75: s := scanner.Text()
76: i, err := strconv.ParseInt(s, 10, 64) 76: i, err := strconv.ParseInt(s, 10, 64)
77: if err != nil { //gdb-dbg=(i) 77: if err != nil { //gdb-dbg=(i) //gdb-opt=(err,hist,i)
$8 = 2 $8 = 2
81: hist = ensure(int(i), hist) 81: hist = ensure(int(i), hist)
82: hist[int(i)]++ 82: hist[int(i)]++
74: for scanner.Scan() { 74: for scanner.Scan() { //gdb-opt=(scanner/A)
75: s := scanner.Text() 75: s := scanner.Text()
76: i, err := strconv.ParseInt(s, 10, 64) 76: i, err := strconv.ParseInt(s, 10, 64)
77: if err != nil { //gdb-dbg=(i) 77: if err != nil { //gdb-dbg=(i) //gdb-opt=(err,hist,i)
$9 = 2 $9 = 2
81: hist = ensure(int(i), hist) 81: hist = ensure(int(i), hist)
82: hist[int(i)]++ 82: hist[int(i)]++
74: for scanner.Scan() { 74: for scanner.Scan() { //gdb-opt=(scanner/A)
75: s := scanner.Text() 75: s := scanner.Text()
76: i, err := strconv.ParseInt(s, 10, 64) 76: i, err := strconv.ParseInt(s, 10, 64)
77: if err != nil { //gdb-dbg=(i) 77: if err != nil { //gdb-dbg=(i) //gdb-opt=(err,hist,i)
$10 = 2 $10 = 2
81: hist = ensure(int(i), hist) 81: hist = ensure(int(i), hist)
82: hist[int(i)]++ 82: hist[int(i)]++
74: for scanner.Scan() { 74: for scanner.Scan() { //gdb-opt=(scanner/A)
75: s := scanner.Text() 75: s := scanner.Text()
76: i, err := strconv.ParseInt(s, 10, 64) 76: i, err := strconv.ParseInt(s, 10, 64)
77: if err != nil { //gdb-dbg=(i) 77: if err != nil { //gdb-dbg=(i) //gdb-opt=(err,hist,i)
$11 = 4 $11 = 4
81: hist = ensure(int(i), hist) 81: hist = ensure(int(i), hist)
82: hist[int(i)]++ 82: hist[int(i)]++
74: for scanner.Scan() { 74: for scanner.Scan() { //gdb-opt=(scanner/A)
75: s := scanner.Text() 75: s := scanner.Text()
76: i, err := strconv.ParseInt(s, 10, 64) 76: i, err := strconv.ParseInt(s, 10, 64)
77: if err != nil { //gdb-dbg=(i) 77: if err != nil { //gdb-dbg=(i) //gdb-opt=(err,hist,i)
$12 = 4 $12 = 4
81: hist = ensure(int(i), hist) 81: hist = ensure(int(i), hist)
82: hist[int(i)]++ 82: hist[int(i)]++
74: for scanner.Scan() { 74: for scanner.Scan() { //gdb-opt=(scanner/A)
75: s := scanner.Text() 75: s := scanner.Text()
76: i, err := strconv.ParseInt(s, 10, 64) 76: i, err := strconv.ParseInt(s, 10, 64)
77: if err != nil { //gdb-dbg=(i) 77: if err != nil { //gdb-dbg=(i) //gdb-opt=(err,hist,i)
$13 = 5 $13 = 5
81: hist = ensure(int(i), hist) 81: hist = ensure(int(i), hist)
82: hist[int(i)]++ 82: hist[int(i)]++
74: for scanner.Scan() { 74: for scanner.Scan() { //gdb-opt=(scanner/A)
84: t := 0 84: t := 0
85: n := 0 85: n := 0
86: for i, a := range hist { 86: for i, a := range hist {
87: if a == 0 { 87: if a == 0 { //gdb-opt=(a,n,t)
88: continue 88: continue
86: for i, a := range hist { 86: for i, a := range hist {
87: if a == 0 { 87: if a == 0 { //gdb-opt=(a,n,t)
90: t += i * a 90: t += i * a
91: n += a 91: n += a
92: fmt.Fprintf(os.Stderr, "%d\t%d\t%d\t%d\t%d\n", i, a, n, i*a, t) //gdb-dbg=(n,i,t) 92: fmt.Fprintf(os.Stderr, "%d\t%d\t%d\t%d\t%d\n", i, a, n, i*a, t) //gdb-dbg=(n,i,t)
...@@ -91,7 +91,7 @@ $14 = 3 ...@@ -91,7 +91,7 @@ $14 = 3
$15 = 1 $15 = 1
$16 = 3 $16 = 3
86: for i, a := range hist { 86: for i, a := range hist {
87: if a == 0 { 87: if a == 0 { //gdb-opt=(a,n,t)
90: t += i * a 90: t += i * a
91: n += a 91: n += a
92: fmt.Fprintf(os.Stderr, "%d\t%d\t%d\t%d\t%d\n", i, a, n, i*a, t) //gdb-dbg=(n,i,t) 92: fmt.Fprintf(os.Stderr, "%d\t%d\t%d\t%d\t%d\n", i, a, n, i*a, t) //gdb-dbg=(n,i,t)
...@@ -99,10 +99,10 @@ $17 = 6 ...@@ -99,10 +99,10 @@ $17 = 6
$18 = 2 $18 = 2
$19 = 9 $19 = 9
86: for i, a := range hist { 86: for i, a := range hist {
87: if a == 0 { 87: if a == 0 { //gdb-opt=(a,n,t)
88: continue 88: continue
86: for i, a := range hist { 86: for i, a := range hist {
87: if a == 0 { 87: if a == 0 { //gdb-opt=(a,n,t)
90: t += i * a 90: t += i * a
91: n += a 91: n += a
92: fmt.Fprintf(os.Stderr, "%d\t%d\t%d\t%d\t%d\n", i, a, n, i*a, t) //gdb-dbg=(n,i,t) 92: fmt.Fprintf(os.Stderr, "%d\t%d\t%d\t%d\t%d\n", i, a, n, i*a, t) //gdb-dbg=(n,i,t)
...@@ -110,7 +110,7 @@ $20 = 8 ...@@ -110,7 +110,7 @@ $20 = 8
$21 = 4 $21 = 4
$22 = 17 $22 = 17
86: for i, a := range hist { 86: for i, a := range hist {
87: if a == 0 { 87: if a == 0 { //gdb-opt=(a,n,t)
90: t += i * a 90: t += i * a
91: n += a 91: n += a
92: fmt.Fprintf(os.Stderr, "%d\t%d\t%d\t%d\t%d\n", i, a, n, i*a, t) //gdb-dbg=(n,i,t) 92: fmt.Fprintf(os.Stderr, "%d\t%d\t%d\t%d\t%d\n", i, a, n, i*a, t) //gdb-dbg=(n,i,t)
...@@ -118,7 +118,7 @@ $23 = 9 ...@@ -118,7 +118,7 @@ $23 = 9
$24 = 5 $24 = 5
$25 = 22 $25 = 22
86: for i, a := range hist { 86: for i, a := range hist {
87: if a == 0 { 87: if a == 0 { //gdb-opt=(a,n,t)
88: continue 88: continue
86: for i, a := range hist { 86: for i, a := range hist {
95: } 95: }
...@@ -57,10 +57,10 @@ func main() { ...@@ -57,10 +57,10 @@ func main() {
l := line{point{1 + zero, 2 + zero}, point{3 + zero, 4 + zero}} l := line{point{1 + zero, 2 + zero}, point{3 + zero, 4 + zero}}
tinycall() // this forces l etc to stack tinycall() // this forces l etc to stack
dx := l.end.x - l.begin.x //gdb-dbg=(l.begin.x,l.end.y) dx := l.end.x - l.begin.x //gdb-dbg=(l.begin.x,l.end.y)
dy := l.end.y - l.begin.y dy := l.end.y - l.begin.y //gdb-opt=(dx)
sink = dx + dy sink = dx + dy
// For #21098 // For #21098
hist := make([]int, 7) hist := make([]int, 7) //gdb-opt=(sink)
var reader io.Reader = strings.NewReader(cannedInput) //gdb-dbg=(hist/A,cannedInput/A) var reader io.Reader = strings.NewReader(cannedInput) //gdb-dbg=(hist/A,cannedInput/A)
if len(os.Args) > 1 { if len(os.Args) > 1 {
var err error var err error
...@@ -71,10 +71,10 @@ func main() { ...@@ -71,10 +71,10 @@ func main() {
} }
} }
scanner := bufio.NewScanner(reader) scanner := bufio.NewScanner(reader)
for scanner.Scan() { for scanner.Scan() { //gdb-opt=(scanner/A)
s := scanner.Text() s := scanner.Text()
i, err := strconv.ParseInt(s, 10, 64) i, err := strconv.ParseInt(s, 10, 64)
if err != nil { //gdb-dbg=(i) if err != nil { //gdb-dbg=(i) //gdb-opt=(err,hist,i)
fmt.Fprintf(os.Stderr, "There was an error: %v\n", err) fmt.Fprintf(os.Stderr, "There was an error: %v\n", err)
return return
} }
...@@ -84,7 +84,7 @@ func main() { ...@@ -84,7 +84,7 @@ func main() {
t := 0 t := 0
n := 0 n := 0
for i, a := range hist { for i, a := range hist {
if a == 0 { if a == 0 { //gdb-opt=(a,n,t)
continue continue
} }
t += i * a t += i * a
......
...@@ -4,8 +4,8 @@ ...@@ -4,8 +4,8 @@
58: tinycall() // this forces l etc to stack 58: tinycall() // this forces l etc to stack
57: l := line{point{1 + zero, 2 + zero}, point{3 + zero, 4 + zero}} 57: l := line{point{1 + zero, 2 + zero}, point{3 + zero, 4 + zero}}
59: dx := l.end.x - l.begin.x //gdb-dbg=(l.begin.x,l.end.y) 59: dx := l.end.x - l.begin.x //gdb-dbg=(l.begin.x,l.end.y)
60: dy := l.end.y - l.begin.y 60: dy := l.end.y - l.begin.y //gdb-opt=(dx)
61: sink = dx + dy 61: sink = dx + dy
63: hist := make([]int, 7) 63: hist := make([]int, 7) //gdb-opt=(sink)
64: var reader io.Reader = strings.NewReader(cannedInput) //gdb-dbg=(hist/A,cannedInput/A) 64: var reader io.Reader = strings.NewReader(cannedInput) //gdb-dbg=(hist/A,cannedInput/A)
19: "strings" 19: "strings"
...@@ -4,71 +4,116 @@ ...@@ -4,71 +4,116 @@
58: tinycall() // this forces l etc to stack 58: tinycall() // this forces l etc to stack
57: l := line{point{1 + zero, 2 + zero}, point{3 + zero, 4 + zero}} 57: l := line{point{1 + zero, 2 + zero}, point{3 + zero, 4 + zero}}
59: dx := l.end.x - l.begin.x //gdb-dbg=(l.begin.x,l.end.y) 59: dx := l.end.x - l.begin.x //gdb-dbg=(l.begin.x,l.end.y)
60: dy := l.end.y - l.begin.y 60: dy := l.end.y - l.begin.y //gdb-opt=(dx)
$1 = 2
61: sink = dx + dy 61: sink = dx + dy
63: hist := make([]int, 7) 63: hist := make([]int, 7) //gdb-opt=(sink)
$2 = 4
64: var reader io.Reader = strings.NewReader(cannedInput) //gdb-dbg=(hist/A,cannedInput/A) 64: var reader io.Reader = strings.NewReader(cannedInput) //gdb-dbg=(hist/A,cannedInput/A)
65: if len(os.Args) > 1 { 65: if len(os.Args) > 1 {
73: scanner := bufio.NewScanner(reader) 73: scanner := bufio.NewScanner(reader)
74: for scanner.Scan() { 74: for scanner.Scan() { //gdb-opt=(scanner/A)
$3 = (struct bufio.Scanner *) <A>
75: s := scanner.Text() 75: s := scanner.Text()
76: i, err := strconv.ParseInt(s, 10, 64) 76: i, err := strconv.ParseInt(s, 10, 64)
77: if err != nil { //gdb-dbg=(i) 77: if err != nil { //gdb-dbg=(i) //gdb-opt=(err,hist,i)
$4 = {tab = 0x0, data = 0x0}
$5 = []int = {0, 0, 0, 0, 0, 0, 0}
$6 = 1
81: hist = ensure(int(i), hist) 81: hist = ensure(int(i), hist)
82: hist[int(i)]++ 82: hist[int(i)]++
74: for scanner.Scan() { 74: for scanner.Scan() { //gdb-opt=(scanner/A)
$7 = (struct bufio.Scanner *) <A>
75: s := scanner.Text() 75: s := scanner.Text()
76: i, err := strconv.ParseInt(s, 10, 64) 76: i, err := strconv.ParseInt(s, 10, 64)
77: if err != nil { //gdb-dbg=(i) 77: if err != nil { //gdb-dbg=(i) //gdb-opt=(err,hist,i)
$8 = {tab = 0x0, data = 0x0}
$9 = []int = {0, 1, 0, 0, 0, 0, 0}
$10 = 1
81: hist = ensure(int(i), hist) 81: hist = ensure(int(i), hist)
82: hist[int(i)]++ 82: hist[int(i)]++
74: for scanner.Scan() { 74: for scanner.Scan() { //gdb-opt=(scanner/A)
$11 = (struct bufio.Scanner *) <A>
75: s := scanner.Text() 75: s := scanner.Text()
76: i, err := strconv.ParseInt(s, 10, 64) 76: i, err := strconv.ParseInt(s, 10, 64)
77: if err != nil { //gdb-dbg=(i) 77: if err != nil { //gdb-dbg=(i) //gdb-opt=(err,hist,i)
$12 = {tab = 0x0, data = 0x0}
$13 = []int = {0, 2, 0, 0, 0, 0, 0}
$14 = 1
81: hist = ensure(int(i), hist) 81: hist = ensure(int(i), hist)
82: hist[int(i)]++ 82: hist[int(i)]++
74: for scanner.Scan() { 74: for scanner.Scan() { //gdb-opt=(scanner/A)
$15 = (struct bufio.Scanner *) <A>
75: s := scanner.Text() 75: s := scanner.Text()
76: i, err := strconv.ParseInt(s, 10, 64) 76: i, err := strconv.ParseInt(s, 10, 64)
77: if err != nil { //gdb-dbg=(i) 77: if err != nil { //gdb-dbg=(i) //gdb-opt=(err,hist,i)
$16 = {tab = 0x0, data = 0x0}
$17 = []int = {0, 3, 0, 0, 0, 0, 0}
$18 = 2
81: hist = ensure(int(i), hist) 81: hist = ensure(int(i), hist)
82: hist[int(i)]++ 82: hist[int(i)]++
74: for scanner.Scan() { 74: for scanner.Scan() { //gdb-opt=(scanner/A)
$19 = (struct bufio.Scanner *) <A>
75: s := scanner.Text() 75: s := scanner.Text()
76: i, err := strconv.ParseInt(s, 10, 64) 76: i, err := strconv.ParseInt(s, 10, 64)
77: if err != nil { //gdb-dbg=(i) 77: if err != nil { //gdb-dbg=(i) //gdb-opt=(err,hist,i)
$20 = {tab = 0x0, data = 0x0}
$21 = []int = {0, 3, 1, 0, 0, 0, 0}
$22 = 2
81: hist = ensure(int(i), hist) 81: hist = ensure(int(i), hist)
82: hist[int(i)]++ 82: hist[int(i)]++
74: for scanner.Scan() { 74: for scanner.Scan() { //gdb-opt=(scanner/A)
$23 = (struct bufio.Scanner *) <A>
75: s := scanner.Text() 75: s := scanner.Text()
76: i, err := strconv.ParseInt(s, 10, 64) 76: i, err := strconv.ParseInt(s, 10, 64)
77: if err != nil { //gdb-dbg=(i) 77: if err != nil { //gdb-dbg=(i) //gdb-opt=(err,hist,i)
$24 = {tab = 0x0, data = 0x0}
$25 = []int = {0, 3, 2, 0, 0, 0, 0}
$26 = 2
81: hist = ensure(int(i), hist) 81: hist = ensure(int(i), hist)
82: hist[int(i)]++ 82: hist[int(i)]++
74: for scanner.Scan() { 74: for scanner.Scan() { //gdb-opt=(scanner/A)
$27 = (struct bufio.Scanner *) <A>
75: s := scanner.Text() 75: s := scanner.Text()
76: i, err := strconv.ParseInt(s, 10, 64) 76: i, err := strconv.ParseInt(s, 10, 64)
77: if err != nil { //gdb-dbg=(i) 77: if err != nil { //gdb-dbg=(i) //gdb-opt=(err,hist,i)
$28 = {tab = 0x0, data = 0x0}
$29 = []int = {0, 3, 3, 0, 0, 0, 0}
$30 = 4
81: hist = ensure(int(i), hist) 81: hist = ensure(int(i), hist)
82: hist[int(i)]++ 82: hist[int(i)]++
74: for scanner.Scan() { 74: for scanner.Scan() { //gdb-opt=(scanner/A)
$31 = (struct bufio.Scanner *) <A>
75: s := scanner.Text() 75: s := scanner.Text()
76: i, err := strconv.ParseInt(s, 10, 64) 76: i, err := strconv.ParseInt(s, 10, 64)
77: if err != nil { //gdb-dbg=(i) 77: if err != nil { //gdb-dbg=(i) //gdb-opt=(err,hist,i)
$32 = {tab = 0x0, data = 0x0}
$33 = []int = {0, 3, 3, 0, 1, 0, 0}
$34 = 4
81: hist = ensure(int(i), hist) 81: hist = ensure(int(i), hist)
82: hist[int(i)]++ 82: hist[int(i)]++
74: for scanner.Scan() { 74: for scanner.Scan() { //gdb-opt=(scanner/A)
$35 = (struct bufio.Scanner *) <A>
75: s := scanner.Text() 75: s := scanner.Text()
76: i, err := strconv.ParseInt(s, 10, 64) 76: i, err := strconv.ParseInt(s, 10, 64)
77: if err != nil { //gdb-dbg=(i) 77: if err != nil { //gdb-dbg=(i) //gdb-opt=(err,hist,i)
$36 = {tab = 0x0, data = 0x0}
$37 = []int = {0, 3, 3, 0, 2, 0, 0}
$38 = 5
81: hist = ensure(int(i), hist) 81: hist = ensure(int(i), hist)
82: hist[int(i)]++ 82: hist[int(i)]++
74: for scanner.Scan() { 74: for scanner.Scan() { //gdb-opt=(scanner/A)
$39 = (struct bufio.Scanner *) <A>
86: for i, a := range hist { 86: for i, a := range hist {
87: if a == 0 { 87: if a == 0 { //gdb-opt=(a,n,t)
$40 = 0
$41 = 0
$42 = 0
88: continue 88: continue
87: if a == 0 { 87: if a == 0 { //gdb-opt=(a,n,t)
$43 = 3
$44 = 0
$45 = 0
92: fmt.Fprintf(os.Stderr, "%d\t%d\t%d\t%d\t%d\n", i, a, n, i*a, t) //gdb-dbg=(n,i,t) 92: fmt.Fprintf(os.Stderr, "%d\t%d\t%d\t%d\t%d\n", i, a, n, i*a, t) //gdb-dbg=(n,i,t)
91: n += a 91: n += a
92: fmt.Fprintf(os.Stderr, "%d\t%d\t%d\t%d\t%d\n", i, a, n, i*a, t) //gdb-dbg=(n,i,t) 92: fmt.Fprintf(os.Stderr, "%d\t%d\t%d\t%d\t%d\n", i, a, n, i*a, t) //gdb-dbg=(n,i,t)
...@@ -78,7 +123,10 @@ ...@@ -78,7 +123,10 @@
92: fmt.Fprintf(os.Stderr, "%d\t%d\t%d\t%d\t%d\n", i, a, n, i*a, t) //gdb-dbg=(n,i,t) 92: fmt.Fprintf(os.Stderr, "%d\t%d\t%d\t%d\t%d\n", i, a, n, i*a, t) //gdb-dbg=(n,i,t)
86: for i, a := range hist { 86: for i, a := range hist {
92: fmt.Fprintf(os.Stderr, "%d\t%d\t%d\t%d\t%d\n", i, a, n, i*a, t) //gdb-dbg=(n,i,t) 92: fmt.Fprintf(os.Stderr, "%d\t%d\t%d\t%d\t%d\n", i, a, n, i*a, t) //gdb-dbg=(n,i,t)
87: if a == 0 { 87: if a == 0 { //gdb-opt=(a,n,t)
$46 = 3
$47 = 3
$48 = 3
92: fmt.Fprintf(os.Stderr, "%d\t%d\t%d\t%d\t%d\n", i, a, n, i*a, t) //gdb-dbg=(n,i,t) 92: fmt.Fprintf(os.Stderr, "%d\t%d\t%d\t%d\t%d\n", i, a, n, i*a, t) //gdb-dbg=(n,i,t)
91: n += a 91: n += a
92: fmt.Fprintf(os.Stderr, "%d\t%d\t%d\t%d\t%d\n", i, a, n, i*a, t) //gdb-dbg=(n,i,t) 92: fmt.Fprintf(os.Stderr, "%d\t%d\t%d\t%d\t%d\n", i, a, n, i*a, t) //gdb-dbg=(n,i,t)
...@@ -88,9 +136,15 @@ ...@@ -88,9 +136,15 @@
92: fmt.Fprintf(os.Stderr, "%d\t%d\t%d\t%d\t%d\n", i, a, n, i*a, t) //gdb-dbg=(n,i,t) 92: fmt.Fprintf(os.Stderr, "%d\t%d\t%d\t%d\t%d\n", i, a, n, i*a, t) //gdb-dbg=(n,i,t)
86: for i, a := range hist { 86: for i, a := range hist {
92: fmt.Fprintf(os.Stderr, "%d\t%d\t%d\t%d\t%d\n", i, a, n, i*a, t) //gdb-dbg=(n,i,t) 92: fmt.Fprintf(os.Stderr, "%d\t%d\t%d\t%d\t%d\n", i, a, n, i*a, t) //gdb-dbg=(n,i,t)
87: if a == 0 { 87: if a == 0 { //gdb-opt=(a,n,t)
$49 = 0
$50 = 6
$51 = 9
88: continue 88: continue
87: if a == 0 { 87: if a == 0 { //gdb-opt=(a,n,t)
$52 = 2
$53 = 6
$54 = 9
92: fmt.Fprintf(os.Stderr, "%d\t%d\t%d\t%d\t%d\n", i, a, n, i*a, t) //gdb-dbg=(n,i,t) 92: fmt.Fprintf(os.Stderr, "%d\t%d\t%d\t%d\t%d\n", i, a, n, i*a, t) //gdb-dbg=(n,i,t)
91: n += a 91: n += a
92: fmt.Fprintf(os.Stderr, "%d\t%d\t%d\t%d\t%d\n", i, a, n, i*a, t) //gdb-dbg=(n,i,t) 92: fmt.Fprintf(os.Stderr, "%d\t%d\t%d\t%d\t%d\n", i, a, n, i*a, t) //gdb-dbg=(n,i,t)
...@@ -100,7 +154,10 @@ ...@@ -100,7 +154,10 @@
92: fmt.Fprintf(os.Stderr, "%d\t%d\t%d\t%d\t%d\n", i, a, n, i*a, t) //gdb-dbg=(n,i,t) 92: fmt.Fprintf(os.Stderr, "%d\t%d\t%d\t%d\t%d\n", i, a, n, i*a, t) //gdb-dbg=(n,i,t)
86: for i, a := range hist { 86: for i, a := range hist {
92: fmt.Fprintf(os.Stderr, "%d\t%d\t%d\t%d\t%d\n", i, a, n, i*a, t) //gdb-dbg=(n,i,t) 92: fmt.Fprintf(os.Stderr, "%d\t%d\t%d\t%d\t%d\n", i, a, n, i*a, t) //gdb-dbg=(n,i,t)
87: if a == 0 { 87: if a == 0 { //gdb-opt=(a,n,t)
$55 = 1
$56 = 8
$57 = 17
92: fmt.Fprintf(os.Stderr, "%d\t%d\t%d\t%d\t%d\n", i, a, n, i*a, t) //gdb-dbg=(n,i,t) 92: fmt.Fprintf(os.Stderr, "%d\t%d\t%d\t%d\t%d\n", i, a, n, i*a, t) //gdb-dbg=(n,i,t)
91: n += a 91: n += a
92: fmt.Fprintf(os.Stderr, "%d\t%d\t%d\t%d\t%d\n", i, a, n, i*a, t) //gdb-dbg=(n,i,t) 92: fmt.Fprintf(os.Stderr, "%d\t%d\t%d\t%d\t%d\n", i, a, n, i*a, t) //gdb-dbg=(n,i,t)
...@@ -110,6 +167,9 @@ ...@@ -110,6 +167,9 @@
92: fmt.Fprintf(os.Stderr, "%d\t%d\t%d\t%d\t%d\n", i, a, n, i*a, t) //gdb-dbg=(n,i,t) 92: fmt.Fprintf(os.Stderr, "%d\t%d\t%d\t%d\t%d\n", i, a, n, i*a, t) //gdb-dbg=(n,i,t)
86: for i, a := range hist { 86: for i, a := range hist {
92: fmt.Fprintf(os.Stderr, "%d\t%d\t%d\t%d\t%d\n", i, a, n, i*a, t) //gdb-dbg=(n,i,t) 92: fmt.Fprintf(os.Stderr, "%d\t%d\t%d\t%d\t%d\n", i, a, n, i*a, t) //gdb-dbg=(n,i,t)
87: if a == 0 { 87: if a == 0 { //gdb-opt=(a,n,t)
$58 = 0
$59 = 9
$60 = 22
88: continue 88: continue
95: } 95: }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment