mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
[dev.inline] cmd/compile/internal/ssa: rename various fields from Line to Pos
This is a mostly mechanical rename followed by manual fixes where necessary. Change-Id: Ie5c670b133db978f15dc03e50dc2da0c80fc8842 Reviewed-on: https://go-review.googlesource.com/34137 Reviewed-by: David Lazar <lazard@golang.org>
This commit is contained in:
parent
eab3707d6d
commit
cfd17f51c8
41 changed files with 4383 additions and 4383 deletions
|
|
@ -147,7 +147,7 @@ func duff(size int64) (int64, int64) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
|
func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
|
||||||
s.SetPos(v.Line)
|
s.SetPos(v.Pos)
|
||||||
switch v.Op {
|
switch v.Op {
|
||||||
case ssa.OpAMD64ADDQ, ssa.OpAMD64ADDL:
|
case ssa.OpAMD64ADDQ, ssa.OpAMD64ADDL:
|
||||||
r := v.Reg()
|
r := v.Reg()
|
||||||
|
|
@ -875,8 +875,8 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
|
||||||
p.To.Type = obj.TYPE_MEM
|
p.To.Type = obj.TYPE_MEM
|
||||||
p.To.Reg = v.Args[0].Reg()
|
p.To.Reg = v.Args[0].Reg()
|
||||||
gc.AddAux(&p.To, v)
|
gc.AddAux(&p.To, v)
|
||||||
if gc.Debug_checknil != 0 && v.Line.Line() > 1 { // v.Line.Line()==1 in generated wrappers
|
if gc.Debug_checknil != 0 && v.Pos.Line() > 1 { // v.Pos.Line()==1 in generated wrappers
|
||||||
gc.Warnl(v.Line, "generated nil check")
|
gc.Warnl(v.Pos, "generated nil check")
|
||||||
}
|
}
|
||||||
case ssa.OpAMD64MOVLatomicload, ssa.OpAMD64MOVQatomicload:
|
case ssa.OpAMD64MOVLatomicload, ssa.OpAMD64MOVQatomicload:
|
||||||
p := gc.Prog(v.Op.Asm())
|
p := gc.Prog(v.Op.Asm())
|
||||||
|
|
@ -962,7 +962,7 @@ var nefJumps = [2][2]gc.FloatingEQNEJump{
|
||||||
}
|
}
|
||||||
|
|
||||||
func ssaGenBlock(s *gc.SSAGenState, b, next *ssa.Block) {
|
func ssaGenBlock(s *gc.SSAGenState, b, next *ssa.Block) {
|
||||||
s.SetPos(b.Line)
|
s.SetPos(b.Pos)
|
||||||
|
|
||||||
switch b.Kind {
|
switch b.Kind {
|
||||||
case ssa.BlockPlain:
|
case ssa.BlockPlain:
|
||||||
|
|
|
||||||
|
|
@ -118,7 +118,7 @@ func genregshift(as obj.As, r0, r1, r2, r int16, typ int64) *obj.Prog {
|
||||||
}
|
}
|
||||||
|
|
||||||
func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
|
func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
|
||||||
s.SetPos(v.Line)
|
s.SetPos(v.Pos)
|
||||||
switch v.Op {
|
switch v.Op {
|
||||||
case ssa.OpInitMem:
|
case ssa.OpInitMem:
|
||||||
// memory arg needs no code
|
// memory arg needs no code
|
||||||
|
|
@ -705,8 +705,8 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
|
||||||
gc.AddAux(&p.From, v)
|
gc.AddAux(&p.From, v)
|
||||||
p.To.Type = obj.TYPE_REG
|
p.To.Type = obj.TYPE_REG
|
||||||
p.To.Reg = arm.REGTMP
|
p.To.Reg = arm.REGTMP
|
||||||
if gc.Debug_checknil != 0 && v.Line.Line() > 1 { // v.Line.Line()==1 in generated wrappers
|
if gc.Debug_checknil != 0 && v.Pos.Line() > 1 { // v.Pos.Line()==1 in generated wrappers
|
||||||
gc.Warnl(v.Line, "generated nil check")
|
gc.Warnl(v.Pos, "generated nil check")
|
||||||
}
|
}
|
||||||
case ssa.OpARMLoweredZero:
|
case ssa.OpARMLoweredZero:
|
||||||
// MOVW.P Rarg2, 4(R1)
|
// MOVW.P Rarg2, 4(R1)
|
||||||
|
|
@ -861,7 +861,7 @@ var blockJump = map[ssa.BlockKind]struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func ssaGenBlock(s *gc.SSAGenState, b, next *ssa.Block) {
|
func ssaGenBlock(s *gc.SSAGenState, b, next *ssa.Block) {
|
||||||
s.SetPos(b.Line)
|
s.SetPos(b.Pos)
|
||||||
|
|
||||||
switch b.Kind {
|
switch b.Kind {
|
||||||
case ssa.BlockPlain:
|
case ssa.BlockPlain:
|
||||||
|
|
|
||||||
|
|
@ -92,7 +92,7 @@ func genshift(as obj.As, r0, r1, r int16, typ int64, s int64) *obj.Prog {
|
||||||
}
|
}
|
||||||
|
|
||||||
func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
|
func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
|
||||||
s.SetPos(v.Line)
|
s.SetPos(v.Pos)
|
||||||
switch v.Op {
|
switch v.Op {
|
||||||
case ssa.OpInitMem:
|
case ssa.OpInitMem:
|
||||||
// memory arg needs no code
|
// memory arg needs no code
|
||||||
|
|
@ -690,8 +690,8 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
|
||||||
gc.AddAux(&p.From, v)
|
gc.AddAux(&p.From, v)
|
||||||
p.To.Type = obj.TYPE_REG
|
p.To.Type = obj.TYPE_REG
|
||||||
p.To.Reg = arm64.REGTMP
|
p.To.Reg = arm64.REGTMP
|
||||||
if gc.Debug_checknil != 0 && v.Line.Line() > 1 { // v.Line==1 in generated wrappers
|
if gc.Debug_checknil != 0 && v.Pos.Line() > 1 { // v.Line==1 in generated wrappers
|
||||||
gc.Warnl(v.Line, "generated nil check")
|
gc.Warnl(v.Pos, "generated nil check")
|
||||||
}
|
}
|
||||||
case ssa.OpVarDef:
|
case ssa.OpVarDef:
|
||||||
gc.Gvardef(v.Aux.(*gc.Node))
|
gc.Gvardef(v.Aux.(*gc.Node))
|
||||||
|
|
@ -768,7 +768,7 @@ var blockJump = map[ssa.BlockKind]struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func ssaGenBlock(s *gc.SSAGenState, b, next *ssa.Block) {
|
func ssaGenBlock(s *gc.SSAGenState, b, next *ssa.Block) {
|
||||||
s.SetPos(b.Line)
|
s.SetPos(b.Pos)
|
||||||
|
|
||||||
switch b.Kind {
|
switch b.Kind {
|
||||||
case ssa.BlockPlain:
|
case ssa.BlockPlain:
|
||||||
|
|
|
||||||
|
|
@ -234,7 +234,7 @@ func (s *phiState) insertVarPhis(n int, var_ *Node, defs []*ssa.Block, typ ssa.T
|
||||||
if !hasPhi.contains(c.ID) {
|
if !hasPhi.contains(c.ID) {
|
||||||
// Add a phi to block c for variable n.
|
// Add a phi to block c for variable n.
|
||||||
hasPhi.add(c.ID)
|
hasPhi.add(c.ID)
|
||||||
v := c.NewValue0I(currentRoot.Line, ssa.OpPhi, typ, int64(n)) // TODO: line number right?
|
v := c.NewValue0I(currentRoot.Pos, ssa.OpPhi, typ, int64(n)) // TODO: line number right?
|
||||||
// Note: we store the variable number in the phi's AuxInt field. Used temporarily by phi building.
|
// Note: we store the variable number in the phi's AuxInt field. Used temporarily by phi building.
|
||||||
s.s.addNamedValue(var_, v)
|
s.s.addNamedValue(var_, v)
|
||||||
for i := 0; i < len(c.Preds); i++ {
|
for i := 0; i < len(c.Preds); i++ {
|
||||||
|
|
@ -467,7 +467,7 @@ loop:
|
||||||
// Find variable value on each predecessor.
|
// Find variable value on each predecessor.
|
||||||
args = args[:0]
|
args = args[:0]
|
||||||
for _, e := range b.Preds {
|
for _, e := range b.Preds {
|
||||||
args = append(args, s.lookupVarOutgoing(e.Block(), v.Type, var_, v.Line))
|
args = append(args, s.lookupVarOutgoing(e.Block(), v.Type, var_, v.Pos))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Decide if we need a phi or not. We need a phi if there
|
// Decide if we need a phi or not. We need a phi if there
|
||||||
|
|
|
||||||
|
|
@ -281,7 +281,7 @@ func (s *state) label(sym *Sym) *ssaLabel {
|
||||||
|
|
||||||
func (s *state) Logf(msg string, args ...interface{}) { s.config.Logf(msg, args...) }
|
func (s *state) Logf(msg string, args ...interface{}) { s.config.Logf(msg, args...) }
|
||||||
func (s *state) Log() bool { return s.config.Log() }
|
func (s *state) Log() bool { return s.config.Log() }
|
||||||
func (s *state) Fatalf(msg string, args ...interface{}) { s.config.Fatalf(s.peekLine(), msg, args...) }
|
func (s *state) Fatalf(msg string, args ...interface{}) { s.config.Fatalf(s.peekPos(), msg, args...) }
|
||||||
func (s *state) Warnl(line src.Pos, msg string, args ...interface{}) {
|
func (s *state) Warnl(line src.Pos, msg string, args ...interface{}) {
|
||||||
s.config.Warnl(line, msg, args...)
|
s.config.Warnl(line, msg, args...)
|
||||||
}
|
}
|
||||||
|
|
@ -326,7 +326,7 @@ func (s *state) endBlock() *ssa.Block {
|
||||||
s.defvars[b.ID] = s.vars
|
s.defvars[b.ID] = s.vars
|
||||||
s.curBlock = nil
|
s.curBlock = nil
|
||||||
s.vars = nil
|
s.vars = nil
|
||||||
b.Line = s.peekLine()
|
b.Pos = s.peekPos()
|
||||||
return b
|
return b
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -335,7 +335,7 @@ func (s *state) pushLine(line src.Pos) {
|
||||||
if !line.IsKnown() {
|
if !line.IsKnown() {
|
||||||
// the frontend may emit node with line number missing,
|
// the frontend may emit node with line number missing,
|
||||||
// use the parent line number in this case.
|
// use the parent line number in this case.
|
||||||
line = s.peekLine()
|
line = s.peekPos()
|
||||||
if Debug['K'] != 0 {
|
if Debug['K'] != 0 {
|
||||||
Warn("buildssa: unknown position (line 0)")
|
Warn("buildssa: unknown position (line 0)")
|
||||||
}
|
}
|
||||||
|
|
@ -348,130 +348,130 @@ func (s *state) popLine() {
|
||||||
s.line = s.line[:len(s.line)-1]
|
s.line = s.line[:len(s.line)-1]
|
||||||
}
|
}
|
||||||
|
|
||||||
// peekLine peek the top of the line number stack.
|
// peekPos peeks the top of the line number stack.
|
||||||
func (s *state) peekLine() src.Pos {
|
func (s *state) peekPos() src.Pos {
|
||||||
return s.line[len(s.line)-1]
|
return s.line[len(s.line)-1]
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *state) Error(msg string, args ...interface{}) {
|
func (s *state) Error(msg string, args ...interface{}) {
|
||||||
yyerrorl(s.peekLine(), msg, args...)
|
yyerrorl(s.peekPos(), msg, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// newValue0 adds a new value with no arguments to the current block.
|
// newValue0 adds a new value with no arguments to the current block.
|
||||||
func (s *state) newValue0(op ssa.Op, t ssa.Type) *ssa.Value {
|
func (s *state) newValue0(op ssa.Op, t ssa.Type) *ssa.Value {
|
||||||
return s.curBlock.NewValue0(s.peekLine(), op, t)
|
return s.curBlock.NewValue0(s.peekPos(), op, t)
|
||||||
}
|
}
|
||||||
|
|
||||||
// newValue0A adds a new value with no arguments and an aux value to the current block.
|
// newValue0A adds a new value with no arguments and an aux value to the current block.
|
||||||
func (s *state) newValue0A(op ssa.Op, t ssa.Type, aux interface{}) *ssa.Value {
|
func (s *state) newValue0A(op ssa.Op, t ssa.Type, aux interface{}) *ssa.Value {
|
||||||
return s.curBlock.NewValue0A(s.peekLine(), op, t, aux)
|
return s.curBlock.NewValue0A(s.peekPos(), op, t, aux)
|
||||||
}
|
}
|
||||||
|
|
||||||
// newValue0I adds a new value with no arguments and an auxint value to the current block.
|
// newValue0I adds a new value with no arguments and an auxint value to the current block.
|
||||||
func (s *state) newValue0I(op ssa.Op, t ssa.Type, auxint int64) *ssa.Value {
|
func (s *state) newValue0I(op ssa.Op, t ssa.Type, auxint int64) *ssa.Value {
|
||||||
return s.curBlock.NewValue0I(s.peekLine(), op, t, auxint)
|
return s.curBlock.NewValue0I(s.peekPos(), op, t, auxint)
|
||||||
}
|
}
|
||||||
|
|
||||||
// newValue1 adds a new value with one argument to the current block.
|
// newValue1 adds a new value with one argument to the current block.
|
||||||
func (s *state) newValue1(op ssa.Op, t ssa.Type, arg *ssa.Value) *ssa.Value {
|
func (s *state) newValue1(op ssa.Op, t ssa.Type, arg *ssa.Value) *ssa.Value {
|
||||||
return s.curBlock.NewValue1(s.peekLine(), op, t, arg)
|
return s.curBlock.NewValue1(s.peekPos(), op, t, arg)
|
||||||
}
|
}
|
||||||
|
|
||||||
// newValue1A adds a new value with one argument and an aux value to the current block.
|
// newValue1A adds a new value with one argument and an aux value to the current block.
|
||||||
func (s *state) newValue1A(op ssa.Op, t ssa.Type, aux interface{}, arg *ssa.Value) *ssa.Value {
|
func (s *state) newValue1A(op ssa.Op, t ssa.Type, aux interface{}, arg *ssa.Value) *ssa.Value {
|
||||||
return s.curBlock.NewValue1A(s.peekLine(), op, t, aux, arg)
|
return s.curBlock.NewValue1A(s.peekPos(), op, t, aux, arg)
|
||||||
}
|
}
|
||||||
|
|
||||||
// newValue1I adds a new value with one argument and an auxint value to the current block.
|
// newValue1I adds a new value with one argument and an auxint value to the current block.
|
||||||
func (s *state) newValue1I(op ssa.Op, t ssa.Type, aux int64, arg *ssa.Value) *ssa.Value {
|
func (s *state) newValue1I(op ssa.Op, t ssa.Type, aux int64, arg *ssa.Value) *ssa.Value {
|
||||||
return s.curBlock.NewValue1I(s.peekLine(), op, t, aux, arg)
|
return s.curBlock.NewValue1I(s.peekPos(), op, t, aux, arg)
|
||||||
}
|
}
|
||||||
|
|
||||||
// newValue2 adds a new value with two arguments to the current block.
|
// newValue2 adds a new value with two arguments to the current block.
|
||||||
func (s *state) newValue2(op ssa.Op, t ssa.Type, arg0, arg1 *ssa.Value) *ssa.Value {
|
func (s *state) newValue2(op ssa.Op, t ssa.Type, arg0, arg1 *ssa.Value) *ssa.Value {
|
||||||
return s.curBlock.NewValue2(s.peekLine(), op, t, arg0, arg1)
|
return s.curBlock.NewValue2(s.peekPos(), op, t, arg0, arg1)
|
||||||
}
|
}
|
||||||
|
|
||||||
// newValue2I adds a new value with two arguments and an auxint value to the current block.
|
// newValue2I adds a new value with two arguments and an auxint value to the current block.
|
||||||
func (s *state) newValue2I(op ssa.Op, t ssa.Type, aux int64, arg0, arg1 *ssa.Value) *ssa.Value {
|
func (s *state) newValue2I(op ssa.Op, t ssa.Type, aux int64, arg0, arg1 *ssa.Value) *ssa.Value {
|
||||||
return s.curBlock.NewValue2I(s.peekLine(), op, t, aux, arg0, arg1)
|
return s.curBlock.NewValue2I(s.peekPos(), op, t, aux, arg0, arg1)
|
||||||
}
|
}
|
||||||
|
|
||||||
// newValue3 adds a new value with three arguments to the current block.
|
// newValue3 adds a new value with three arguments to the current block.
|
||||||
func (s *state) newValue3(op ssa.Op, t ssa.Type, arg0, arg1, arg2 *ssa.Value) *ssa.Value {
|
func (s *state) newValue3(op ssa.Op, t ssa.Type, arg0, arg1, arg2 *ssa.Value) *ssa.Value {
|
||||||
return s.curBlock.NewValue3(s.peekLine(), op, t, arg0, arg1, arg2)
|
return s.curBlock.NewValue3(s.peekPos(), op, t, arg0, arg1, arg2)
|
||||||
}
|
}
|
||||||
|
|
||||||
// newValue3I adds a new value with three arguments and an auxint value to the current block.
|
// newValue3I adds a new value with three arguments and an auxint value to the current block.
|
||||||
func (s *state) newValue3I(op ssa.Op, t ssa.Type, aux int64, arg0, arg1, arg2 *ssa.Value) *ssa.Value {
|
func (s *state) newValue3I(op ssa.Op, t ssa.Type, aux int64, arg0, arg1, arg2 *ssa.Value) *ssa.Value {
|
||||||
return s.curBlock.NewValue3I(s.peekLine(), op, t, aux, arg0, arg1, arg2)
|
return s.curBlock.NewValue3I(s.peekPos(), op, t, aux, arg0, arg1, arg2)
|
||||||
}
|
}
|
||||||
|
|
||||||
// newValue4 adds a new value with four arguments to the current block.
|
// newValue4 adds a new value with four arguments to the current block.
|
||||||
func (s *state) newValue4(op ssa.Op, t ssa.Type, arg0, arg1, arg2, arg3 *ssa.Value) *ssa.Value {
|
func (s *state) newValue4(op ssa.Op, t ssa.Type, arg0, arg1, arg2, arg3 *ssa.Value) *ssa.Value {
|
||||||
return s.curBlock.NewValue4(s.peekLine(), op, t, arg0, arg1, arg2, arg3)
|
return s.curBlock.NewValue4(s.peekPos(), op, t, arg0, arg1, arg2, arg3)
|
||||||
}
|
}
|
||||||
|
|
||||||
// entryNewValue0 adds a new value with no arguments to the entry block.
|
// entryNewValue0 adds a new value with no arguments to the entry block.
|
||||||
func (s *state) entryNewValue0(op ssa.Op, t ssa.Type) *ssa.Value {
|
func (s *state) entryNewValue0(op ssa.Op, t ssa.Type) *ssa.Value {
|
||||||
return s.f.Entry.NewValue0(s.peekLine(), op, t)
|
return s.f.Entry.NewValue0(s.peekPos(), op, t)
|
||||||
}
|
}
|
||||||
|
|
||||||
// entryNewValue0A adds a new value with no arguments and an aux value to the entry block.
|
// entryNewValue0A adds a new value with no arguments and an aux value to the entry block.
|
||||||
func (s *state) entryNewValue0A(op ssa.Op, t ssa.Type, aux interface{}) *ssa.Value {
|
func (s *state) entryNewValue0A(op ssa.Op, t ssa.Type, aux interface{}) *ssa.Value {
|
||||||
return s.f.Entry.NewValue0A(s.peekLine(), op, t, aux)
|
return s.f.Entry.NewValue0A(s.peekPos(), op, t, aux)
|
||||||
}
|
}
|
||||||
|
|
||||||
// entryNewValue0I adds a new value with no arguments and an auxint value to the entry block.
|
// entryNewValue0I adds a new value with no arguments and an auxint value to the entry block.
|
||||||
func (s *state) entryNewValue0I(op ssa.Op, t ssa.Type, auxint int64) *ssa.Value {
|
func (s *state) entryNewValue0I(op ssa.Op, t ssa.Type, auxint int64) *ssa.Value {
|
||||||
return s.f.Entry.NewValue0I(s.peekLine(), op, t, auxint)
|
return s.f.Entry.NewValue0I(s.peekPos(), op, t, auxint)
|
||||||
}
|
}
|
||||||
|
|
||||||
// entryNewValue1 adds a new value with one argument to the entry block.
|
// entryNewValue1 adds a new value with one argument to the entry block.
|
||||||
func (s *state) entryNewValue1(op ssa.Op, t ssa.Type, arg *ssa.Value) *ssa.Value {
|
func (s *state) entryNewValue1(op ssa.Op, t ssa.Type, arg *ssa.Value) *ssa.Value {
|
||||||
return s.f.Entry.NewValue1(s.peekLine(), op, t, arg)
|
return s.f.Entry.NewValue1(s.peekPos(), op, t, arg)
|
||||||
}
|
}
|
||||||
|
|
||||||
// entryNewValue1 adds a new value with one argument and an auxint value to the entry block.
|
// entryNewValue1 adds a new value with one argument and an auxint value to the entry block.
|
||||||
func (s *state) entryNewValue1I(op ssa.Op, t ssa.Type, auxint int64, arg *ssa.Value) *ssa.Value {
|
func (s *state) entryNewValue1I(op ssa.Op, t ssa.Type, auxint int64, arg *ssa.Value) *ssa.Value {
|
||||||
return s.f.Entry.NewValue1I(s.peekLine(), op, t, auxint, arg)
|
return s.f.Entry.NewValue1I(s.peekPos(), op, t, auxint, arg)
|
||||||
}
|
}
|
||||||
|
|
||||||
// entryNewValue1A adds a new value with one argument and an aux value to the entry block.
|
// entryNewValue1A adds a new value with one argument and an aux value to the entry block.
|
||||||
func (s *state) entryNewValue1A(op ssa.Op, t ssa.Type, aux interface{}, arg *ssa.Value) *ssa.Value {
|
func (s *state) entryNewValue1A(op ssa.Op, t ssa.Type, aux interface{}, arg *ssa.Value) *ssa.Value {
|
||||||
return s.f.Entry.NewValue1A(s.peekLine(), op, t, aux, arg)
|
return s.f.Entry.NewValue1A(s.peekPos(), op, t, aux, arg)
|
||||||
}
|
}
|
||||||
|
|
||||||
// entryNewValue2 adds a new value with two arguments to the entry block.
|
// entryNewValue2 adds a new value with two arguments to the entry block.
|
||||||
func (s *state) entryNewValue2(op ssa.Op, t ssa.Type, arg0, arg1 *ssa.Value) *ssa.Value {
|
func (s *state) entryNewValue2(op ssa.Op, t ssa.Type, arg0, arg1 *ssa.Value) *ssa.Value {
|
||||||
return s.f.Entry.NewValue2(s.peekLine(), op, t, arg0, arg1)
|
return s.f.Entry.NewValue2(s.peekPos(), op, t, arg0, arg1)
|
||||||
}
|
}
|
||||||
|
|
||||||
// const* routines add a new const value to the entry block.
|
// const* routines add a new const value to the entry block.
|
||||||
func (s *state) constSlice(t ssa.Type) *ssa.Value { return s.f.ConstSlice(s.peekLine(), t) }
|
func (s *state) constSlice(t ssa.Type) *ssa.Value { return s.f.ConstSlice(s.peekPos(), t) }
|
||||||
func (s *state) constInterface(t ssa.Type) *ssa.Value { return s.f.ConstInterface(s.peekLine(), t) }
|
func (s *state) constInterface(t ssa.Type) *ssa.Value { return s.f.ConstInterface(s.peekPos(), t) }
|
||||||
func (s *state) constNil(t ssa.Type) *ssa.Value { return s.f.ConstNil(s.peekLine(), t) }
|
func (s *state) constNil(t ssa.Type) *ssa.Value { return s.f.ConstNil(s.peekPos(), t) }
|
||||||
func (s *state) constEmptyString(t ssa.Type) *ssa.Value { return s.f.ConstEmptyString(s.peekLine(), t) }
|
func (s *state) constEmptyString(t ssa.Type) *ssa.Value { return s.f.ConstEmptyString(s.peekPos(), t) }
|
||||||
func (s *state) constBool(c bool) *ssa.Value {
|
func (s *state) constBool(c bool) *ssa.Value {
|
||||||
return s.f.ConstBool(s.peekLine(), Types[TBOOL], c)
|
return s.f.ConstBool(s.peekPos(), Types[TBOOL], c)
|
||||||
}
|
}
|
||||||
func (s *state) constInt8(t ssa.Type, c int8) *ssa.Value {
|
func (s *state) constInt8(t ssa.Type, c int8) *ssa.Value {
|
||||||
return s.f.ConstInt8(s.peekLine(), t, c)
|
return s.f.ConstInt8(s.peekPos(), t, c)
|
||||||
}
|
}
|
||||||
func (s *state) constInt16(t ssa.Type, c int16) *ssa.Value {
|
func (s *state) constInt16(t ssa.Type, c int16) *ssa.Value {
|
||||||
return s.f.ConstInt16(s.peekLine(), t, c)
|
return s.f.ConstInt16(s.peekPos(), t, c)
|
||||||
}
|
}
|
||||||
func (s *state) constInt32(t ssa.Type, c int32) *ssa.Value {
|
func (s *state) constInt32(t ssa.Type, c int32) *ssa.Value {
|
||||||
return s.f.ConstInt32(s.peekLine(), t, c)
|
return s.f.ConstInt32(s.peekPos(), t, c)
|
||||||
}
|
}
|
||||||
func (s *state) constInt64(t ssa.Type, c int64) *ssa.Value {
|
func (s *state) constInt64(t ssa.Type, c int64) *ssa.Value {
|
||||||
return s.f.ConstInt64(s.peekLine(), t, c)
|
return s.f.ConstInt64(s.peekPos(), t, c)
|
||||||
}
|
}
|
||||||
func (s *state) constFloat32(t ssa.Type, c float64) *ssa.Value {
|
func (s *state) constFloat32(t ssa.Type, c float64) *ssa.Value {
|
||||||
return s.f.ConstFloat32(s.peekLine(), t, c)
|
return s.f.ConstFloat32(s.peekPos(), t, c)
|
||||||
}
|
}
|
||||||
func (s *state) constFloat64(t ssa.Type, c float64) *ssa.Value {
|
func (s *state) constFloat64(t ssa.Type, c float64) *ssa.Value {
|
||||||
return s.f.ConstFloat64(s.peekLine(), t, c)
|
return s.f.ConstFloat64(s.peekPos(), t, c)
|
||||||
}
|
}
|
||||||
func (s *state) constInt(t ssa.Type, c int64) *ssa.Value {
|
func (s *state) constInt(t ssa.Type, c int64) *ssa.Value {
|
||||||
if s.config.IntSize == 8 {
|
if s.config.IntSize == 8 {
|
||||||
|
|
@ -3315,7 +3315,7 @@ func (s *state) check(cmp *ssa.Value, fn *Node) {
|
||||||
b.SetControl(cmp)
|
b.SetControl(cmp)
|
||||||
b.Likely = ssa.BranchLikely
|
b.Likely = ssa.BranchLikely
|
||||||
bNext := s.f.NewBlock(ssa.BlockPlain)
|
bNext := s.f.NewBlock(ssa.BlockPlain)
|
||||||
line := s.peekLine()
|
line := s.peekPos()
|
||||||
bPanic := s.panics[funcLine{fn, line}]
|
bPanic := s.panics[funcLine{fn, line}]
|
||||||
if bPanic == nil {
|
if bPanic == nil {
|
||||||
bPanic = s.f.NewBlock(ssa.BlockPlain)
|
bPanic = s.f.NewBlock(ssa.BlockPlain)
|
||||||
|
|
@ -3427,7 +3427,7 @@ func (s *state) insertWBmove(t *Type, left, right *ssa.Value, line src.Pos, righ
|
||||||
s.Error("write barrier prohibited")
|
s.Error("write barrier prohibited")
|
||||||
}
|
}
|
||||||
if !s.WBPos.IsKnown() {
|
if !s.WBPos.IsKnown() {
|
||||||
s.WBPos = left.Line
|
s.WBPos = left.Pos
|
||||||
}
|
}
|
||||||
|
|
||||||
var val *ssa.Value
|
var val *ssa.Value
|
||||||
|
|
@ -3468,7 +3468,7 @@ func (s *state) insertWBstore(t *Type, left, right *ssa.Value, line src.Pos, ski
|
||||||
s.Error("write barrier prohibited")
|
s.Error("write barrier prohibited")
|
||||||
}
|
}
|
||||||
if !s.WBPos.IsKnown() {
|
if !s.WBPos.IsKnown() {
|
||||||
s.WBPos = left.Line
|
s.WBPos = left.Pos
|
||||||
}
|
}
|
||||||
s.storeTypeScalars(t, left, right, skip)
|
s.storeTypeScalars(t, left, right, skip)
|
||||||
s.storeTypePtrsWB(t, left, right)
|
s.storeTypePtrsWB(t, left, right)
|
||||||
|
|
|
||||||
|
|
@ -74,7 +74,7 @@ func storeByType(t ssa.Type, r int16) obj.As {
|
||||||
}
|
}
|
||||||
|
|
||||||
func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
|
func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
|
||||||
s.SetPos(v.Line)
|
s.SetPos(v.Pos)
|
||||||
switch v.Op {
|
switch v.Op {
|
||||||
case ssa.OpInitMem:
|
case ssa.OpInitMem:
|
||||||
// memory arg needs no code
|
// memory arg needs no code
|
||||||
|
|
@ -796,8 +796,8 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
|
||||||
gc.AddAux(&p.From, v)
|
gc.AddAux(&p.From, v)
|
||||||
p.To.Type = obj.TYPE_REG
|
p.To.Type = obj.TYPE_REG
|
||||||
p.To.Reg = mips.REGTMP
|
p.To.Reg = mips.REGTMP
|
||||||
if gc.Debug_checknil != 0 && v.Line.Line() > 1 { // v.Line==1 in generated wrappers
|
if gc.Debug_checknil != 0 && v.Pos.Line() > 1 { // v.Pos.Line()==1 in generated wrappers
|
||||||
gc.Warnl(v.Line, "generated nil check")
|
gc.Warnl(v.Pos, "generated nil check")
|
||||||
}
|
}
|
||||||
case ssa.OpMIPSFPFlagTrue,
|
case ssa.OpMIPSFPFlagTrue,
|
||||||
ssa.OpMIPSFPFlagFalse:
|
ssa.OpMIPSFPFlagFalse:
|
||||||
|
|
@ -841,7 +841,7 @@ var blockJump = map[ssa.BlockKind]struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func ssaGenBlock(s *gc.SSAGenState, b, next *ssa.Block) {
|
func ssaGenBlock(s *gc.SSAGenState, b, next *ssa.Block) {
|
||||||
s.SetPos(b.Line)
|
s.SetPos(b.Pos)
|
||||||
|
|
||||||
switch b.Kind {
|
switch b.Kind {
|
||||||
case ssa.BlockPlain:
|
case ssa.BlockPlain:
|
||||||
|
|
|
||||||
|
|
@ -82,7 +82,7 @@ func storeByType(t ssa.Type, r int16) obj.As {
|
||||||
}
|
}
|
||||||
|
|
||||||
func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
|
func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
|
||||||
s.SetPos(v.Line)
|
s.SetPos(v.Pos)
|
||||||
switch v.Op {
|
switch v.Op {
|
||||||
case ssa.OpInitMem:
|
case ssa.OpInitMem:
|
||||||
// memory arg needs no code
|
// memory arg needs no code
|
||||||
|
|
@ -548,8 +548,8 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
|
||||||
gc.AddAux(&p.From, v)
|
gc.AddAux(&p.From, v)
|
||||||
p.To.Type = obj.TYPE_REG
|
p.To.Type = obj.TYPE_REG
|
||||||
p.To.Reg = mips.REGTMP
|
p.To.Reg = mips.REGTMP
|
||||||
if gc.Debug_checknil != 0 && v.Line.Line() > 1 { // v.Line==1 in generated wrappers
|
if gc.Debug_checknil != 0 && v.Pos.Line() > 1 { // v.Pos.Line()==1 in generated wrappers
|
||||||
gc.Warnl(v.Line, "generated nil check")
|
gc.Warnl(v.Pos, "generated nil check")
|
||||||
}
|
}
|
||||||
case ssa.OpVarDef:
|
case ssa.OpVarDef:
|
||||||
gc.Gvardef(v.Aux.(*gc.Node))
|
gc.Gvardef(v.Aux.(*gc.Node))
|
||||||
|
|
@ -606,7 +606,7 @@ var blockJump = map[ssa.BlockKind]struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func ssaGenBlock(s *gc.SSAGenState, b, next *ssa.Block) {
|
func ssaGenBlock(s *gc.SSAGenState, b, next *ssa.Block) {
|
||||||
s.SetPos(b.Line)
|
s.SetPos(b.Pos)
|
||||||
|
|
||||||
switch b.Kind {
|
switch b.Kind {
|
||||||
case ssa.BlockPlain:
|
case ssa.BlockPlain:
|
||||||
|
|
|
||||||
|
|
@ -143,7 +143,7 @@ func ssaGenISEL(v *ssa.Value, cr int64, r1, r2 int16) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
|
func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
|
||||||
s.SetPos(v.Line)
|
s.SetPos(v.Pos)
|
||||||
switch v.Op {
|
switch v.Op {
|
||||||
case ssa.OpInitMem:
|
case ssa.OpInitMem:
|
||||||
// memory arg needs no code
|
// memory arg needs no code
|
||||||
|
|
@ -803,8 +803,8 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
|
||||||
gc.AddAux(&p.From, v)
|
gc.AddAux(&p.From, v)
|
||||||
p.To.Type = obj.TYPE_REG
|
p.To.Type = obj.TYPE_REG
|
||||||
p.To.Reg = ppc64.REGTMP
|
p.To.Reg = ppc64.REGTMP
|
||||||
if gc.Debug_checknil != 0 && v.Line.Line() > 1 { // v.Line==1 in generated wrappers
|
if gc.Debug_checknil != 0 && v.Pos.Line() > 1 { // v.Pos.Line()==1 in generated wrappers
|
||||||
gc.Warnl(v.Line, "generated nil check")
|
gc.Warnl(v.Pos, "generated nil check")
|
||||||
}
|
}
|
||||||
|
|
||||||
case ssa.OpPPC64InvertFlags:
|
case ssa.OpPPC64InvertFlags:
|
||||||
|
|
@ -837,7 +837,7 @@ var blockJump = [...]struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func ssaGenBlock(s *gc.SSAGenState, b, next *ssa.Block) {
|
func ssaGenBlock(s *gc.SSAGenState, b, next *ssa.Block) {
|
||||||
s.SetPos(b.Line)
|
s.SetPos(b.Pos)
|
||||||
|
|
||||||
switch b.Kind {
|
switch b.Kind {
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -156,7 +156,7 @@ func opregregimm(op obj.As, dest, src int16, off int64) *obj.Prog {
|
||||||
}
|
}
|
||||||
|
|
||||||
func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
|
func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
|
||||||
s.SetPos(v.Line)
|
s.SetPos(v.Pos)
|
||||||
switch v.Op {
|
switch v.Op {
|
||||||
case ssa.OpS390XSLD, ssa.OpS390XSLW,
|
case ssa.OpS390XSLD, ssa.OpS390XSLW,
|
||||||
ssa.OpS390XSRD, ssa.OpS390XSRW,
|
ssa.OpS390XSRD, ssa.OpS390XSRW,
|
||||||
|
|
@ -570,8 +570,8 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
|
||||||
gc.AddAux(&p.From, v)
|
gc.AddAux(&p.From, v)
|
||||||
p.To.Type = obj.TYPE_REG
|
p.To.Type = obj.TYPE_REG
|
||||||
p.To.Reg = s390x.REGTMP
|
p.To.Reg = s390x.REGTMP
|
||||||
if gc.Debug_checknil != 0 && v.Line.Line() > 1 { // v.Line==1 in generated wrappers
|
if gc.Debug_checknil != 0 && v.Pos.Line() > 1 { // v.Pos.Line()==1 in generated wrappers
|
||||||
gc.Warnl(v.Line, "generated nil check")
|
gc.Warnl(v.Pos, "generated nil check")
|
||||||
}
|
}
|
||||||
case ssa.OpS390XMVC:
|
case ssa.OpS390XMVC:
|
||||||
vo := v.AuxValAndOff()
|
vo := v.AuxValAndOff()
|
||||||
|
|
@ -796,7 +796,7 @@ var blockJump = [...]struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func ssaGenBlock(s *gc.SSAGenState, b, next *ssa.Block) {
|
func ssaGenBlock(s *gc.SSAGenState, b, next *ssa.Block) {
|
||||||
s.SetPos(b.Line)
|
s.SetPos(b.Pos)
|
||||||
|
|
||||||
switch b.Kind {
|
switch b.Kind {
|
||||||
case ssa.BlockPlain:
|
case ssa.BlockPlain:
|
||||||
|
|
|
||||||
|
|
@ -15,8 +15,8 @@ type Block struct {
|
||||||
// these IDs densely, but no guarantees.
|
// these IDs densely, but no guarantees.
|
||||||
ID ID
|
ID ID
|
||||||
|
|
||||||
// Line number for block's control operation
|
// Source position for block's control operation
|
||||||
Line src.Pos
|
Pos src.Pos
|
||||||
|
|
||||||
// The kind of block this is.
|
// The kind of block this is.
|
||||||
Kind BlockKind
|
Kind BlockKind
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@ func checkbce(f *Func) {
|
||||||
for _, b := range f.Blocks {
|
for _, b := range f.Blocks {
|
||||||
for _, v := range b.Values {
|
for _, v := range b.Values {
|
||||||
if v.Op == OpIsInBounds || v.Op == OpIsSliceInBounds {
|
if v.Op == OpIsInBounds || v.Op == OpIsSliceInBounds {
|
||||||
f.Config.Warnl(v.Line, "Found %v", v.Op)
|
f.Config.Warnl(v.Pos, "Found %v", v.Op)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -60,10 +60,10 @@ func critical(f *Func) {
|
||||||
// since we're iterating over len(f.Blocks) above, this forces
|
// since we're iterating over len(f.Blocks) above, this forces
|
||||||
// the new blocks to be re-examined.
|
// the new blocks to be re-examined.
|
||||||
d = f.NewBlock(BlockPlain)
|
d = f.NewBlock(BlockPlain)
|
||||||
d.Line = p.Line
|
d.Pos = p.Pos
|
||||||
blocks[argID] = d
|
blocks[argID] = d
|
||||||
if f.pass.debug > 0 {
|
if f.pass.debug > 0 {
|
||||||
f.Config.Warnl(p.Line, "split critical edge")
|
f.Config.Warnl(p.Pos, "split critical edge")
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
reusedBlock = true
|
reusedBlock = true
|
||||||
|
|
@ -72,9 +72,9 @@ func critical(f *Func) {
|
||||||
// no existing block, so allocate a new block
|
// no existing block, so allocate a new block
|
||||||
// to place on the edge
|
// to place on the edge
|
||||||
d = f.NewBlock(BlockPlain)
|
d = f.NewBlock(BlockPlain)
|
||||||
d.Line = p.Line
|
d.Pos = p.Pos
|
||||||
if f.pass.debug > 0 {
|
if f.pass.debug > 0 {
|
||||||
f.Config.Warnl(p.Line, "split critical edge")
|
f.Config.Warnl(p.Pos, "split critical edge")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -35,8 +35,8 @@ func decomposeBuiltIn(f *Func) {
|
||||||
hiName, loName := f.Config.fe.SplitInt64(name)
|
hiName, loName := f.Config.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.Line, OpInt64Hi, elemType, v)
|
hi := v.Block.NewValue1(v.Pos, OpInt64Hi, elemType, v)
|
||||||
lo := v.Block.NewValue1(v.Line, OpInt64Lo, f.Config.fe.TypeUInt32(), v)
|
lo := v.Block.NewValue1(v.Pos, OpInt64Lo, f.Config.fe.TypeUInt32(), v)
|
||||||
f.NamedValues[hiName] = append(f.NamedValues[hiName], hi)
|
f.NamedValues[hiName] = append(f.NamedValues[hiName], hi)
|
||||||
f.NamedValues[loName] = append(f.NamedValues[loName], lo)
|
f.NamedValues[loName] = append(f.NamedValues[loName], lo)
|
||||||
}
|
}
|
||||||
|
|
@ -51,8 +51,8 @@ func decomposeBuiltIn(f *Func) {
|
||||||
rName, iName := f.Config.fe.SplitComplex(name)
|
rName, iName := f.Config.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.Line, OpComplexReal, elemType, v)
|
r := v.Block.NewValue1(v.Pos, OpComplexReal, elemType, v)
|
||||||
i := v.Block.NewValue1(v.Line, OpComplexImag, elemType, v)
|
i := v.Block.NewValue1(v.Pos, OpComplexImag, elemType, v)
|
||||||
f.NamedValues[rName] = append(f.NamedValues[rName], r)
|
f.NamedValues[rName] = append(f.NamedValues[rName], r)
|
||||||
f.NamedValues[iName] = append(f.NamedValues[iName], i)
|
f.NamedValues[iName] = append(f.NamedValues[iName], i)
|
||||||
}
|
}
|
||||||
|
|
@ -63,8 +63,8 @@ func decomposeBuiltIn(f *Func) {
|
||||||
ptrName, lenName := f.Config.fe.SplitString(name)
|
ptrName, lenName := f.Config.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.Line, OpStringPtr, ptrType, v)
|
ptr := v.Block.NewValue1(v.Pos, OpStringPtr, ptrType, v)
|
||||||
len := v.Block.NewValue1(v.Line, OpStringLen, lenType, v)
|
len := v.Block.NewValue1(v.Pos, OpStringLen, lenType, v)
|
||||||
f.NamedValues[ptrName] = append(f.NamedValues[ptrName], ptr)
|
f.NamedValues[ptrName] = append(f.NamedValues[ptrName], ptr)
|
||||||
f.NamedValues[lenName] = append(f.NamedValues[lenName], len)
|
f.NamedValues[lenName] = append(f.NamedValues[lenName], len)
|
||||||
}
|
}
|
||||||
|
|
@ -75,9 +75,9 @@ func decomposeBuiltIn(f *Func) {
|
||||||
ptrName, lenName, capName := f.Config.fe.SplitSlice(name)
|
ptrName, lenName, capName := f.Config.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.Line, OpSlicePtr, ptrType, v)
|
ptr := v.Block.NewValue1(v.Pos, OpSlicePtr, ptrType, v)
|
||||||
len := v.Block.NewValue1(v.Line, OpSliceLen, lenType, v)
|
len := v.Block.NewValue1(v.Pos, OpSliceLen, lenType, v)
|
||||||
cap := v.Block.NewValue1(v.Line, OpSliceCap, lenType, v)
|
cap := v.Block.NewValue1(v.Pos, OpSliceCap, lenType, v)
|
||||||
f.NamedValues[ptrName] = append(f.NamedValues[ptrName], ptr)
|
f.NamedValues[ptrName] = append(f.NamedValues[ptrName], ptr)
|
||||||
f.NamedValues[lenName] = append(f.NamedValues[lenName], len)
|
f.NamedValues[lenName] = append(f.NamedValues[lenName], len)
|
||||||
f.NamedValues[capName] = append(f.NamedValues[capName], cap)
|
f.NamedValues[capName] = append(f.NamedValues[capName], cap)
|
||||||
|
|
@ -88,8 +88,8 @@ func decomposeBuiltIn(f *Func) {
|
||||||
typeName, dataName := f.Config.fe.SplitInterface(name)
|
typeName, dataName := f.Config.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.Line, OpITab, ptrType, v)
|
typ := v.Block.NewValue1(v.Pos, OpITab, ptrType, v)
|
||||||
data := v.Block.NewValue1(v.Line, OpIData, ptrType, v)
|
data := v.Block.NewValue1(v.Pos, OpIData, ptrType, v)
|
||||||
f.NamedValues[typeName] = append(f.NamedValues[typeName], typ)
|
f.NamedValues[typeName] = append(f.NamedValues[typeName], typ)
|
||||||
f.NamedValues[dataName] = append(f.NamedValues[dataName], data)
|
f.NamedValues[dataName] = append(f.NamedValues[dataName], data)
|
||||||
}
|
}
|
||||||
|
|
@ -133,11 +133,11 @@ func decomposeStringPhi(v *Value) {
|
||||||
ptrType := fe.TypeBytePtr()
|
ptrType := fe.TypeBytePtr()
|
||||||
lenType := fe.TypeInt()
|
lenType := fe.TypeInt()
|
||||||
|
|
||||||
ptr := v.Block.NewValue0(v.Line, OpPhi, ptrType)
|
ptr := v.Block.NewValue0(v.Pos, OpPhi, ptrType)
|
||||||
len := v.Block.NewValue0(v.Line, OpPhi, lenType)
|
len := v.Block.NewValue0(v.Pos, OpPhi, lenType)
|
||||||
for _, a := range v.Args {
|
for _, a := range v.Args {
|
||||||
ptr.AddArg(a.Block.NewValue1(v.Line, OpStringPtr, ptrType, a))
|
ptr.AddArg(a.Block.NewValue1(v.Pos, OpStringPtr, ptrType, a))
|
||||||
len.AddArg(a.Block.NewValue1(v.Line, OpStringLen, lenType, a))
|
len.AddArg(a.Block.NewValue1(v.Pos, OpStringLen, lenType, a))
|
||||||
}
|
}
|
||||||
v.reset(OpStringMake)
|
v.reset(OpStringMake)
|
||||||
v.AddArg(ptr)
|
v.AddArg(ptr)
|
||||||
|
|
@ -149,13 +149,13 @@ func decomposeSlicePhi(v *Value) {
|
||||||
ptrType := fe.TypeBytePtr()
|
ptrType := fe.TypeBytePtr()
|
||||||
lenType := fe.TypeInt()
|
lenType := fe.TypeInt()
|
||||||
|
|
||||||
ptr := v.Block.NewValue0(v.Line, OpPhi, ptrType)
|
ptr := v.Block.NewValue0(v.Pos, OpPhi, ptrType)
|
||||||
len := v.Block.NewValue0(v.Line, OpPhi, lenType)
|
len := v.Block.NewValue0(v.Pos, OpPhi, lenType)
|
||||||
cap := v.Block.NewValue0(v.Line, OpPhi, lenType)
|
cap := v.Block.NewValue0(v.Pos, OpPhi, lenType)
|
||||||
for _, a := range v.Args {
|
for _, a := range v.Args {
|
||||||
ptr.AddArg(a.Block.NewValue1(v.Line, OpSlicePtr, ptrType, a))
|
ptr.AddArg(a.Block.NewValue1(v.Pos, OpSlicePtr, ptrType, a))
|
||||||
len.AddArg(a.Block.NewValue1(v.Line, OpSliceLen, lenType, a))
|
len.AddArg(a.Block.NewValue1(v.Pos, OpSliceLen, lenType, a))
|
||||||
cap.AddArg(a.Block.NewValue1(v.Line, OpSliceCap, lenType, a))
|
cap.AddArg(a.Block.NewValue1(v.Pos, OpSliceCap, lenType, a))
|
||||||
}
|
}
|
||||||
v.reset(OpSliceMake)
|
v.reset(OpSliceMake)
|
||||||
v.AddArg(ptr)
|
v.AddArg(ptr)
|
||||||
|
|
@ -172,11 +172,11 @@ func decomposeInt64Phi(v *Value) {
|
||||||
partType = fe.TypeUInt32()
|
partType = fe.TypeUInt32()
|
||||||
}
|
}
|
||||||
|
|
||||||
hi := v.Block.NewValue0(v.Line, OpPhi, partType)
|
hi := v.Block.NewValue0(v.Pos, OpPhi, partType)
|
||||||
lo := v.Block.NewValue0(v.Line, OpPhi, fe.TypeUInt32())
|
lo := v.Block.NewValue0(v.Pos, OpPhi, fe.TypeUInt32())
|
||||||
for _, a := range v.Args {
|
for _, a := range v.Args {
|
||||||
hi.AddArg(a.Block.NewValue1(v.Line, OpInt64Hi, partType, a))
|
hi.AddArg(a.Block.NewValue1(v.Pos, OpInt64Hi, partType, a))
|
||||||
lo.AddArg(a.Block.NewValue1(v.Line, OpInt64Lo, fe.TypeUInt32(), a))
|
lo.AddArg(a.Block.NewValue1(v.Pos, OpInt64Lo, fe.TypeUInt32(), a))
|
||||||
}
|
}
|
||||||
v.reset(OpInt64Make)
|
v.reset(OpInt64Make)
|
||||||
v.AddArg(hi)
|
v.AddArg(hi)
|
||||||
|
|
@ -195,11 +195,11 @@ func decomposeComplexPhi(v *Value) {
|
||||||
v.Fatalf("decomposeComplexPhi: bad complex size %d", z)
|
v.Fatalf("decomposeComplexPhi: bad complex size %d", z)
|
||||||
}
|
}
|
||||||
|
|
||||||
real := v.Block.NewValue0(v.Line, OpPhi, partType)
|
real := v.Block.NewValue0(v.Pos, OpPhi, partType)
|
||||||
imag := v.Block.NewValue0(v.Line, OpPhi, partType)
|
imag := v.Block.NewValue0(v.Pos, OpPhi, partType)
|
||||||
for _, a := range v.Args {
|
for _, a := range v.Args {
|
||||||
real.AddArg(a.Block.NewValue1(v.Line, OpComplexReal, partType, a))
|
real.AddArg(a.Block.NewValue1(v.Pos, OpComplexReal, partType, a))
|
||||||
imag.AddArg(a.Block.NewValue1(v.Line, OpComplexImag, partType, a))
|
imag.AddArg(a.Block.NewValue1(v.Pos, OpComplexImag, partType, a))
|
||||||
}
|
}
|
||||||
v.reset(OpComplexMake)
|
v.reset(OpComplexMake)
|
||||||
v.AddArg(real)
|
v.AddArg(real)
|
||||||
|
|
@ -209,11 +209,11 @@ func decomposeComplexPhi(v *Value) {
|
||||||
func decomposeInterfacePhi(v *Value) {
|
func decomposeInterfacePhi(v *Value) {
|
||||||
ptrType := v.Block.Func.Config.fe.TypeBytePtr()
|
ptrType := v.Block.Func.Config.fe.TypeBytePtr()
|
||||||
|
|
||||||
itab := v.Block.NewValue0(v.Line, OpPhi, ptrType)
|
itab := v.Block.NewValue0(v.Pos, OpPhi, ptrType)
|
||||||
data := v.Block.NewValue0(v.Line, OpPhi, ptrType)
|
data := v.Block.NewValue0(v.Pos, OpPhi, ptrType)
|
||||||
for _, a := range v.Args {
|
for _, a := range v.Args {
|
||||||
itab.AddArg(a.Block.NewValue1(v.Line, OpITab, ptrType, a))
|
itab.AddArg(a.Block.NewValue1(v.Pos, OpITab, ptrType, a))
|
||||||
data.AddArg(a.Block.NewValue1(v.Line, OpIData, ptrType, a))
|
data.AddArg(a.Block.NewValue1(v.Pos, OpIData, ptrType, a))
|
||||||
}
|
}
|
||||||
v.reset(OpIMake)
|
v.reset(OpIMake)
|
||||||
v.AddArg(itab)
|
v.AddArg(itab)
|
||||||
|
|
@ -247,7 +247,7 @@ func decomposeUser(f *Func) {
|
||||||
}
|
}
|
||||||
for _, v := range f.NamedValues[name] {
|
for _, v := range f.NamedValues[name] {
|
||||||
for i := 0; i < n; i++ {
|
for i := 0; i < n; i++ {
|
||||||
x := v.Block.NewValue1I(v.Line, OpStructSelect, t.FieldType(i), int64(i), v)
|
x := v.Block.NewValue1I(v.Pos, OpStructSelect, t.FieldType(i), int64(i), v)
|
||||||
f.NamedValues[fnames[i]] = append(f.NamedValues[fnames[i]], x)
|
f.NamedValues[fnames[i]] = append(f.NamedValues[fnames[i]], x)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -264,7 +264,7 @@ func decomposeUser(f *Func) {
|
||||||
}
|
}
|
||||||
elemName := f.Config.fe.SplitArray(name)
|
elemName := f.Config.fe.SplitArray(name)
|
||||||
for _, v := range f.NamedValues[name] {
|
for _, v := range f.NamedValues[name] {
|
||||||
e := v.Block.NewValue1I(v.Line, OpArraySelect, t.ElemType(), 0, v)
|
e := v.Block.NewValue1I(v.Pos, OpArraySelect, t.ElemType(), 0, v)
|
||||||
f.NamedValues[elemName] = append(f.NamedValues[elemName], e)
|
f.NamedValues[elemName] = append(f.NamedValues[elemName], e)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -293,11 +293,11 @@ func decomposeStructPhi(v *Value) {
|
||||||
n := t.NumFields()
|
n := t.NumFields()
|
||||||
var fields [MaxStruct]*Value
|
var fields [MaxStruct]*Value
|
||||||
for i := 0; i < n; i++ {
|
for i := 0; i < n; i++ {
|
||||||
fields[i] = v.Block.NewValue0(v.Line, OpPhi, t.FieldType(i))
|
fields[i] = v.Block.NewValue0(v.Pos, OpPhi, t.FieldType(i))
|
||||||
}
|
}
|
||||||
for _, a := range v.Args {
|
for _, a := range v.Args {
|
||||||
for i := 0; i < n; i++ {
|
for i := 0; i < n; i++ {
|
||||||
fields[i].AddArg(a.Block.NewValue1I(v.Line, OpStructSelect, t.FieldType(i), int64(i), a))
|
fields[i].AddArg(a.Block.NewValue1I(v.Pos, OpStructSelect, t.FieldType(i), int64(i), a))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
v.reset(StructMakeOp(n))
|
v.reset(StructMakeOp(n))
|
||||||
|
|
@ -320,9 +320,9 @@ func decomposeArrayPhi(v *Value) {
|
||||||
if t.NumElem() != 1 {
|
if t.NumElem() != 1 {
|
||||||
v.Fatalf("SSAable array must have no more than 1 element")
|
v.Fatalf("SSAable array must have no more than 1 element")
|
||||||
}
|
}
|
||||||
elem := v.Block.NewValue0(v.Line, OpPhi, t.ElemType())
|
elem := v.Block.NewValue0(v.Pos, OpPhi, t.ElemType())
|
||||||
for _, a := range v.Args {
|
for _, a := range v.Args {
|
||||||
elem.AddArg(a.Block.NewValue1I(v.Line, OpArraySelect, t.ElemType(), 0, a))
|
elem.AddArg(a.Block.NewValue1I(v.Pos, OpArraySelect, t.ElemType(), 0, a))
|
||||||
}
|
}
|
||||||
v.reset(OpArrayMake1)
|
v.reset(OpArrayMake1)
|
||||||
v.AddArg(elem)
|
v.AddArg(elem)
|
||||||
|
|
|
||||||
|
|
@ -80,7 +80,7 @@ func (f *Func) retSparseSet(ss *sparseSet) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// newValue allocates a new Value with the given fields and places it at the end of b.Values.
|
// newValue allocates a new Value with the given fields and places it at the end of b.Values.
|
||||||
func (f *Func) newValue(op Op, t Type, b *Block, line src.Pos) *Value {
|
func (f *Func) newValue(op Op, t Type, b *Block, pos src.Pos) *Value {
|
||||||
var v *Value
|
var v *Value
|
||||||
if f.freeValues != nil {
|
if f.freeValues != nil {
|
||||||
v = f.freeValues
|
v = f.freeValues
|
||||||
|
|
@ -97,7 +97,7 @@ func (f *Func) newValue(op Op, t Type, b *Block, line src.Pos) *Value {
|
||||||
v.Op = op
|
v.Op = op
|
||||||
v.Type = t
|
v.Type = t
|
||||||
v.Block = b
|
v.Block = b
|
||||||
v.Line = line
|
v.Pos = pos
|
||||||
b.Values = append(b.Values, v)
|
b.Values = append(b.Values, v)
|
||||||
return v
|
return v
|
||||||
}
|
}
|
||||||
|
|
@ -117,7 +117,7 @@ func (f *Func) LogStat(key string, args ...interface{}) {
|
||||||
if f.pass != nil {
|
if f.pass != nil {
|
||||||
n = strings.Replace(f.pass.name, " ", "_", -1)
|
n = strings.Replace(f.pass.name, " ", "_", -1)
|
||||||
}
|
}
|
||||||
f.Config.Warnl(f.Entry.Line, "\t%s\t%s%s\t%s", n, key, value, f.Name)
|
f.Config.Warnl(f.Entry.Pos, "\t%s\t%s%s\t%s", n, key, value, f.Name)
|
||||||
}
|
}
|
||||||
|
|
||||||
// freeValue frees a value. It must no longer be referenced.
|
// freeValue frees a value. It must no longer be referenced.
|
||||||
|
|
@ -411,7 +411,7 @@ func (f *Func) ConstEmptyString(line src.Pos, t Type) *Value {
|
||||||
|
|
||||||
func (f *Func) Logf(msg string, args ...interface{}) { f.Config.Logf(msg, args...) }
|
func (f *Func) Logf(msg string, args ...interface{}) { f.Config.Logf(msg, args...) }
|
||||||
func (f *Func) Log() bool { return f.Config.Log() }
|
func (f *Func) Log() bool { return f.Config.Log() }
|
||||||
func (f *Func) Fatalf(msg string, args ...interface{}) { f.Config.Fatalf(f.Entry.Line, msg, args...) }
|
func (f *Func) Fatalf(msg string, args ...interface{}) { f.Config.Fatalf(f.Entry.Pos, msg, args...) }
|
||||||
|
|
||||||
func (f *Func) Free() {
|
func (f *Func) Free() {
|
||||||
// Clear cached CFG info.
|
// Clear cached CFG info.
|
||||||
|
|
|
||||||
|
|
@ -1009,11 +1009,11 @@
|
||||||
&& mem.Op == OpStaticCall
|
&& mem.Op == OpStaticCall
|
||||||
&& isSameSym(mem.Aux, "runtime.newobject")
|
&& isSameSym(mem.Aux, "runtime.newobject")
|
||||||
&& c == config.ctxt.FixedFrameSize() + config.RegSize // offset of return value
|
&& c == config.ctxt.FixedFrameSize() + config.RegSize // offset of return value
|
||||||
&& warnRule(config.Debug_checknil() && int(v.Line) > 1, v, "removed nil check")
|
&& warnRule(config.Debug_checknil() && int(v.Pos) > 1, v, "removed nil check")
|
||||||
-> (Invalid)
|
-> (Invalid)
|
||||||
(NilCheck (OffPtr (Load (OffPtr [c] (SP)) mem)) mem)
|
(NilCheck (OffPtr (Load (OffPtr [c] (SP)) mem)) mem)
|
||||||
&& mem.Op == OpStaticCall
|
&& mem.Op == OpStaticCall
|
||||||
&& isSameSym(mem.Aux, "runtime.newobject")
|
&& isSameSym(mem.Aux, "runtime.newobject")
|
||||||
&& c == config.ctxt.FixedFrameSize() + config.RegSize // offset of return value
|
&& c == config.ctxt.FixedFrameSize() + config.RegSize // offset of return value
|
||||||
&& warnRule(config.Debug_checknil() && int(v.Line) > 1, v, "removed nil check")
|
&& warnRule(config.Debug_checknil() && int(v.Pos) > 1, v, "removed nil check")
|
||||||
-> (Invalid)
|
-> (Invalid)
|
||||||
|
|
|
||||||
|
|
@ -491,7 +491,7 @@ func genResult0(w io.Writer, arch arch, result string, alloc *int, top, move boo
|
||||||
}
|
}
|
||||||
v = fmt.Sprintf("v%d", *alloc)
|
v = fmt.Sprintf("v%d", *alloc)
|
||||||
*alloc++
|
*alloc++
|
||||||
fmt.Fprintf(w, "%s := b.NewValue0(v.Line, Op%s%s, %s)\n", v, oparch, op.name, typ)
|
fmt.Fprintf(w, "%s := b.NewValue0(v.Pos, Op%s%s, %s)\n", v, oparch, op.name, typ)
|
||||||
if move && top {
|
if move && top {
|
||||||
// Rewrite original into a copy
|
// Rewrite original into a copy
|
||||||
fmt.Fprintf(w, "v.reset(OpCopy)\n")
|
fmt.Fprintf(w, "v.reset(OpCopy)\n")
|
||||||
|
|
|
||||||
|
|
@ -108,7 +108,7 @@ func describePredictionAgrees(b *Block, prediction BranchPrediction) string {
|
||||||
}
|
}
|
||||||
|
|
||||||
func describeBranchPrediction(f *Func, b *Block, likely, not int8, prediction BranchPrediction) {
|
func describeBranchPrediction(f *Func, b *Block, likely, not int8, prediction BranchPrediction) {
|
||||||
f.Config.Warnl(b.Line, "Branch prediction rule %s < %s%s",
|
f.Config.Warnl(b.Pos, "Branch prediction rule %s < %s%s",
|
||||||
bllikelies[likely-blMin], bllikelies[not-blMin], describePredictionAgrees(b, prediction))
|
bllikelies[likely-blMin], bllikelies[not-blMin], describePredictionAgrees(b, prediction))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -183,7 +183,7 @@ func likelyadjust(f *Func) {
|
||||||
noprediction = true
|
noprediction = true
|
||||||
}
|
}
|
||||||
if f.pass.debug > 0 && !noprediction {
|
if f.pass.debug > 0 && !noprediction {
|
||||||
f.Config.Warnl(b.Line, "Branch prediction rule stay in loop%s",
|
f.Config.Warnl(b.Pos, "Branch prediction rule stay in loop%s",
|
||||||
describePredictionAgrees(b, prediction))
|
describePredictionAgrees(b, prediction))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -226,7 +226,7 @@ func likelyadjust(f *Func) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if f.pass.debug > 2 {
|
if f.pass.debug > 2 {
|
||||||
f.Config.Warnl(b.Line, "BP: Block %s, local=%s, certain=%s", b, bllikelies[local[b.ID]-blMin], bllikelies[certain[b.ID]-blMin])
|
f.Config.Warnl(b.Pos, "BP: Block %s, local=%s, certain=%s", b, bllikelies[local[b.ID]-blMin], bllikelies[certain[b.ID]-blMin])
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -139,9 +139,9 @@ nextb:
|
||||||
|
|
||||||
if f.pass.debug > 1 {
|
if f.pass.debug > 1 {
|
||||||
if min.Op == OpConst64 {
|
if min.Op == OpConst64 {
|
||||||
b.Func.Config.Warnl(b.Line, "Induction variable with minimum %d and increment %d", min.AuxInt, inc.AuxInt)
|
b.Func.Config.Warnl(b.Pos, "Induction variable with minimum %d and increment %d", min.AuxInt, inc.AuxInt)
|
||||||
} else {
|
} else {
|
||||||
b.Func.Config.Warnl(b.Line, "Induction variable with non-const minimum and increment %d", inc.AuxInt)
|
b.Func.Config.Warnl(b.Pos, "Induction variable with non-const minimum and increment %d", inc.AuxInt)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -205,7 +205,7 @@ func removeBoundsChecks(f *Func, m map[*Value]indVar) {
|
||||||
if iv, has := m[ind]; has && sdom.isAncestorEq(iv.entry, b) && isNonNegative(iv.min) {
|
if iv, has := m[ind]; has && sdom.isAncestorEq(iv.entry, b) && isNonNegative(iv.min) {
|
||||||
if v.Args[1] == iv.max {
|
if v.Args[1] == iv.max {
|
||||||
if f.pass.debug > 0 {
|
if f.pass.debug > 0 {
|
||||||
f.Config.Warnl(b.Line, "Found redundant %s", v.Op)
|
f.Config.Warnl(b.Pos, "Found redundant %s", v.Op)
|
||||||
}
|
}
|
||||||
goto simplify
|
goto simplify
|
||||||
}
|
}
|
||||||
|
|
@ -232,7 +232,7 @@ func removeBoundsChecks(f *Func, m map[*Value]indVar) {
|
||||||
if iv, has := m[ind]; has && sdom.isAncestorEq(iv.entry, b) && isNonNegative(iv.min) {
|
if iv, has := m[ind]; has && sdom.isAncestorEq(iv.entry, b) && isNonNegative(iv.min) {
|
||||||
if v.Args[1].Op == OpSliceCap && iv.max.Op == OpSliceLen && v.Args[1].Args[0] == iv.max.Args[0] {
|
if v.Args[1].Op == OpSliceCap && iv.max.Op == OpSliceLen && v.Args[1].Args[0] == iv.max.Args[0] {
|
||||||
if f.pass.debug > 0 {
|
if f.pass.debug > 0 {
|
||||||
f.Config.Warnl(b.Line, "Found redundant %s (len promoted to cap)", v.Op)
|
f.Config.Warnl(b.Pos, "Found redundant %s (len promoted to cap)", v.Op)
|
||||||
}
|
}
|
||||||
goto simplify
|
goto simplify
|
||||||
}
|
}
|
||||||
|
|
@ -263,7 +263,7 @@ func removeBoundsChecks(f *Func, m map[*Value]indVar) {
|
||||||
|
|
||||||
if max := iv.max.AuxInt + add; 0 <= max && max <= limit { // handle overflow
|
if max := iv.max.AuxInt + add; 0 <= max && max <= limit { // handle overflow
|
||||||
if f.pass.debug > 0 {
|
if f.pass.debug > 0 {
|
||||||
f.Config.Warnl(b.Line, "Found redundant (%s ind %d), ind < %d", v.Op, v.Args[1].AuxInt, iv.max.AuxInt+add)
|
f.Config.Warnl(b.Pos, "Found redundant (%s ind %d), ind < %d", v.Op, v.Args[1].AuxInt, iv.max.AuxInt+add)
|
||||||
}
|
}
|
||||||
goto simplify
|
goto simplify
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -101,8 +101,8 @@ func nilcheckelim(f *Func) {
|
||||||
// This is a redundant implicit nil check.
|
// This is a redundant implicit nil check.
|
||||||
// Logging in the style of the former compiler -- and omit line 1,
|
// Logging in the style of the former compiler -- and omit line 1,
|
||||||
// which is usually in generated code.
|
// which is usually in generated code.
|
||||||
if f.Config.Debug_checknil() && v.Line.Line() > 1 {
|
if f.Config.Debug_checknil() && v.Pos.Line() > 1 {
|
||||||
f.Config.Warnl(v.Line, "removed nil check")
|
f.Config.Warnl(v.Pos, "removed nil check")
|
||||||
}
|
}
|
||||||
v.reset(OpUnknown)
|
v.reset(OpUnknown)
|
||||||
i--
|
i--
|
||||||
|
|
@ -147,8 +147,8 @@ func nilcheckelim2(f *Func) {
|
||||||
for i := len(b.Values) - 1; i >= 0; i-- {
|
for i := len(b.Values) - 1; i >= 0; i-- {
|
||||||
v := b.Values[i]
|
v := b.Values[i]
|
||||||
if opcodeTable[v.Op].nilCheck && unnecessary.contains(v.Args[0].ID) {
|
if opcodeTable[v.Op].nilCheck && unnecessary.contains(v.Args[0].ID) {
|
||||||
if f.Config.Debug_checknil() && v.Line.Line() > 1 {
|
if f.Config.Debug_checknil() && v.Pos.Line() > 1 {
|
||||||
f.Config.Warnl(v.Line, "removed nil check")
|
f.Config.Warnl(v.Pos, "removed nil check")
|
||||||
}
|
}
|
||||||
v.reset(OpUnknown)
|
v.reset(OpUnknown)
|
||||||
continue
|
continue
|
||||||
|
|
|
||||||
|
|
@ -63,7 +63,7 @@ func phielimValue(v *Value) bool {
|
||||||
v.SetArgs1(w)
|
v.SetArgs1(w)
|
||||||
f := v.Block.Func
|
f := v.Block.Func
|
||||||
if f.pass.debug > 0 {
|
if f.pass.debug > 0 {
|
||||||
f.Config.Warnl(v.Line, "eliminated phi")
|
f.Config.Warnl(v.Pos, "eliminated phi")
|
||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -81,7 +81,7 @@ func phiopt(f *Func) {
|
||||||
v.reset(ops[v.Args[reverse].AuxInt])
|
v.reset(ops[v.Args[reverse].AuxInt])
|
||||||
v.AddArg(b0.Control)
|
v.AddArg(b0.Control)
|
||||||
if f.pass.debug > 0 {
|
if f.pass.debug > 0 {
|
||||||
f.Config.Warnl(b.Line, "converted OpPhi to %v", v.Op)
|
f.Config.Warnl(b.Pos, "converted OpPhi to %v", v.Op)
|
||||||
}
|
}
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
@ -97,7 +97,7 @@ func phiopt(f *Func) {
|
||||||
v.reset(OpOrB)
|
v.reset(OpOrB)
|
||||||
v.SetArgs2(b0.Control, tmp)
|
v.SetArgs2(b0.Control, tmp)
|
||||||
if f.pass.debug > 0 {
|
if f.pass.debug > 0 {
|
||||||
f.Config.Warnl(b.Line, "converted OpPhi to %v", v.Op)
|
f.Config.Warnl(b.Pos, "converted OpPhi to %v", v.Op)
|
||||||
}
|
}
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
@ -113,7 +113,7 @@ func phiopt(f *Func) {
|
||||||
v.reset(OpAndB)
|
v.reset(OpAndB)
|
||||||
v.SetArgs2(b0.Control, tmp)
|
v.SetArgs2(b0.Control, tmp)
|
||||||
if f.pass.debug > 0 {
|
if f.pass.debug > 0 {
|
||||||
f.Config.Warnl(b.Line, "converted OpPhi to %v", v.Op)
|
f.Config.Warnl(b.Pos, "converted OpPhi to %v", v.Op)
|
||||||
}
|
}
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
@ -163,12 +163,12 @@ func phioptint(v *Value, b0 *Block, reverse int) {
|
||||||
|
|
||||||
a := b0.Control
|
a := b0.Control
|
||||||
if negate {
|
if negate {
|
||||||
a = v.Block.NewValue1(v.Line, OpNot, a.Type, a)
|
a = v.Block.NewValue1(v.Pos, OpNot, a.Type, a)
|
||||||
}
|
}
|
||||||
v.AddArg(a)
|
v.AddArg(a)
|
||||||
|
|
||||||
f := b0.Func
|
f := b0.Func
|
||||||
if f.pass.debug > 0 {
|
if f.pass.debug > 0 {
|
||||||
f.Config.Warnl(v.Block.Line, "converted OpPhi bool -> int%d", v.Type.Size()*8)
|
f.Config.Warnl(v.Block.Pos, "converted OpPhi bool -> int%d", v.Type.Size()*8)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -62,7 +62,7 @@ func (p stringFuncPrinter) endBlock(b *Block) {
|
||||||
|
|
||||||
func (p stringFuncPrinter) value(v *Value, live bool) {
|
func (p stringFuncPrinter) value(v *Value, live bool) {
|
||||||
fmt.Fprint(p.w, " ")
|
fmt.Fprint(p.w, " ")
|
||||||
//fmt.Fprint(p.w, v.Block.Func.Config.fe.Line(v.Line))
|
//fmt.Fprint(p.w, v.Block.Func.Config.fe.Pos(v.Pos))
|
||||||
//fmt.Fprint(p.w, ": ")
|
//fmt.Fprint(p.w, ": ")
|
||||||
fmt.Fprint(p.w, v.LongString())
|
fmt.Fprint(p.w, v.LongString())
|
||||||
if !live {
|
if !live {
|
||||||
|
|
|
||||||
|
|
@ -301,7 +301,7 @@ func (ft *factsTable) update(parent *Block, v, w *Value, d domain, r relation) {
|
||||||
ft.limitStack = append(ft.limitStack, limitFact{v.ID, old})
|
ft.limitStack = append(ft.limitStack, limitFact{v.ID, old})
|
||||||
ft.limits[v.ID] = lim
|
ft.limits[v.ID] = lim
|
||||||
if v.Block.Func.pass.debug > 2 {
|
if v.Block.Func.pass.debug > 2 {
|
||||||
v.Block.Func.Config.Warnl(parent.Line, "parent=%s, new limits %s %s %s", parent, v, w, lim.String())
|
v.Block.Func.Config.Warnl(parent.Pos, "parent=%s, new limits %s %s %s", parent, v, w, lim.String())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -600,7 +600,7 @@ func simplifyBlock(ft *factsTable, b *Block) branch {
|
||||||
v.reset(OpConst32)
|
v.reset(OpConst32)
|
||||||
}
|
}
|
||||||
if b.Func.pass.debug > 0 {
|
if b.Func.pass.debug > 0 {
|
||||||
b.Func.Config.Warnl(v.Line, "Proved slicemask not needed")
|
b.Func.Config.Warnl(v.Pos, "Proved slicemask not needed")
|
||||||
}
|
}
|
||||||
v.AuxInt = -1
|
v.AuxInt = -1
|
||||||
}
|
}
|
||||||
|
|
@ -615,9 +615,9 @@ func simplifyBlock(ft *factsTable, b *Block) branch {
|
||||||
if m == lt|gt {
|
if m == lt|gt {
|
||||||
if b.Func.pass.debug > 0 {
|
if b.Func.pass.debug > 0 {
|
||||||
if b.Func.pass.debug > 1 {
|
if b.Func.pass.debug > 1 {
|
||||||
b.Func.Config.Warnl(b.Line, "Proved boolean %s (%s)", b.Control.Op, b.Control)
|
b.Func.Config.Warnl(b.Pos, "Proved boolean %s (%s)", b.Control.Op, b.Control)
|
||||||
} else {
|
} else {
|
||||||
b.Func.Config.Warnl(b.Line, "Proved boolean %s", b.Control.Op)
|
b.Func.Config.Warnl(b.Pos, "Proved boolean %s", b.Control.Op)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return positive
|
return positive
|
||||||
|
|
@ -625,9 +625,9 @@ func simplifyBlock(ft *factsTable, b *Block) branch {
|
||||||
if m == eq {
|
if m == eq {
|
||||||
if b.Func.pass.debug > 0 {
|
if b.Func.pass.debug > 0 {
|
||||||
if b.Func.pass.debug > 1 {
|
if b.Func.pass.debug > 1 {
|
||||||
b.Func.Config.Warnl(b.Line, "Disproved boolean %s (%s)", b.Control.Op, b.Control)
|
b.Func.Config.Warnl(b.Pos, "Disproved boolean %s (%s)", b.Control.Op, b.Control)
|
||||||
} else {
|
} else {
|
||||||
b.Func.Config.Warnl(b.Line, "Disproved boolean %s", b.Control.Op)
|
b.Func.Config.Warnl(b.Pos, "Disproved boolean %s", b.Control.Op)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return negative
|
return negative
|
||||||
|
|
@ -656,9 +656,9 @@ func simplifyBlock(ft *factsTable, b *Block) branch {
|
||||||
if m != 0 && tr.r&m == m {
|
if m != 0 && tr.r&m == m {
|
||||||
if b.Func.pass.debug > 0 {
|
if b.Func.pass.debug > 0 {
|
||||||
if b.Func.pass.debug > 1 {
|
if b.Func.pass.debug > 1 {
|
||||||
b.Func.Config.Warnl(b.Line, "Proved %s (%s)", c.Op, c)
|
b.Func.Config.Warnl(b.Pos, "Proved %s (%s)", c.Op, c)
|
||||||
} else {
|
} else {
|
||||||
b.Func.Config.Warnl(b.Line, "Proved %s", c.Op)
|
b.Func.Config.Warnl(b.Pos, "Proved %s", c.Op)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return positive
|
return positive
|
||||||
|
|
@ -666,9 +666,9 @@ func simplifyBlock(ft *factsTable, b *Block) branch {
|
||||||
if m != 0 && ((lt|eq|gt)^tr.r)&m == m {
|
if m != 0 && ((lt|eq|gt)^tr.r)&m == m {
|
||||||
if b.Func.pass.debug > 0 {
|
if b.Func.pass.debug > 0 {
|
||||||
if b.Func.pass.debug > 1 {
|
if b.Func.pass.debug > 1 {
|
||||||
b.Func.Config.Warnl(b.Line, "Disproved %s (%s)", c.Op, c)
|
b.Func.Config.Warnl(b.Pos, "Disproved %s (%s)", c.Op, c)
|
||||||
} else {
|
} else {
|
||||||
b.Func.Config.Warnl(b.Line, "Disproved %s", c.Op)
|
b.Func.Config.Warnl(b.Pos, "Disproved %s", c.Op)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return negative
|
return negative
|
||||||
|
|
@ -685,9 +685,9 @@ func simplifyBlock(ft *factsTable, b *Block) branch {
|
||||||
if m != 0 && tr.r&m == m {
|
if m != 0 && tr.r&m == m {
|
||||||
if b.Func.pass.debug > 0 {
|
if b.Func.pass.debug > 0 {
|
||||||
if b.Func.pass.debug > 1 {
|
if b.Func.pass.debug > 1 {
|
||||||
b.Func.Config.Warnl(b.Line, "Proved non-negative bounds %s (%s)", c.Op, c)
|
b.Func.Config.Warnl(b.Pos, "Proved non-negative bounds %s (%s)", c.Op, c)
|
||||||
} else {
|
} else {
|
||||||
b.Func.Config.Warnl(b.Line, "Proved non-negative bounds %s", c.Op)
|
b.Func.Config.Warnl(b.Pos, "Proved non-negative bounds %s", c.Op)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return positive
|
return positive
|
||||||
|
|
|
||||||
|
|
@ -393,7 +393,7 @@ func (s *regAllocState) allocReg(mask regMask, v *Value) register {
|
||||||
m := s.compatRegs(v2.Type) &^ s.used &^ s.tmpused &^ (regMask(1) << r)
|
m := s.compatRegs(v2.Type) &^ s.used &^ s.tmpused &^ (regMask(1) << r)
|
||||||
if m != 0 && !s.values[v2.ID].rematerializeable && countRegs(s.values[v2.ID].regs) == 1 {
|
if m != 0 && !s.values[v2.ID].rematerializeable && countRegs(s.values[v2.ID].regs) == 1 {
|
||||||
r2 := pickReg(m)
|
r2 := pickReg(m)
|
||||||
c := s.curBlock.NewValue1(v2.Line, OpCopy, v2.Type, s.regs[r].c)
|
c := s.curBlock.NewValue1(v2.Pos, OpCopy, v2.Type, s.regs[r].c)
|
||||||
s.copies[c] = false
|
s.copies[c] = false
|
||||||
if s.f.pass.debug > regDebug {
|
if s.f.pass.debug > regDebug {
|
||||||
fmt.Printf("copy %s to %s : %s\n", v2, c, s.registers[r2].Name())
|
fmt.Printf("copy %s to %s : %s\n", v2, c, s.registers[r2].Name())
|
||||||
|
|
@ -446,7 +446,7 @@ func (s *regAllocState) allocValToReg(v *Value, mask regMask, nospill bool, line
|
||||||
// Load v from its spill location.
|
// Load v from its spill location.
|
||||||
case vi.spill != nil:
|
case vi.spill != nil:
|
||||||
if s.f.pass.debug > logSpills {
|
if s.f.pass.debug > logSpills {
|
||||||
s.f.Config.Warnl(vi.spill.Line, "load spill for %v from %v", v, vi.spill)
|
s.f.Config.Warnl(vi.spill.Pos, "load spill for %v from %v", v, vi.spill)
|
||||||
}
|
}
|
||||||
c = s.curBlock.NewValue1(line, OpLoadReg, v.Type, vi.spill)
|
c = s.curBlock.NewValue1(line, OpLoadReg, v.Type, vi.spill)
|
||||||
vi.spillUsed = true
|
vi.spillUsed = true
|
||||||
|
|
@ -760,7 +760,7 @@ func (s *regAllocState) regalloc(f *Func) {
|
||||||
liveSet.add(e.ID)
|
liveSet.add(e.ID)
|
||||||
}
|
}
|
||||||
if v := b.Control; v != nil && s.values[v.ID].needReg {
|
if v := b.Control; v != nil && s.values[v.ID].needReg {
|
||||||
s.addUse(v.ID, int32(len(b.Values)), b.Line) // psuedo-use by control value
|
s.addUse(v.ID, int32(len(b.Values)), b.Pos) // psuedo-use by control value
|
||||||
liveSet.add(v.ID)
|
liveSet.add(v.ID)
|
||||||
}
|
}
|
||||||
for i := len(b.Values) - 1; i >= 0; i-- {
|
for i := len(b.Values) - 1; i >= 0; i-- {
|
||||||
|
|
@ -776,7 +776,7 @@ func (s *regAllocState) regalloc(f *Func) {
|
||||||
if !s.values[a.ID].needReg {
|
if !s.values[a.ID].needReg {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
s.addUse(a.ID, int32(i), v.Line)
|
s.addUse(a.ID, int32(i), v.Pos)
|
||||||
liveSet.add(a.ID)
|
liveSet.add(a.ID)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -902,7 +902,7 @@ func (s *regAllocState) regalloc(f *Func) {
|
||||||
m := s.compatRegs(a.Type) &^ s.used &^ phiUsed
|
m := s.compatRegs(a.Type) &^ s.used &^ phiUsed
|
||||||
if m != 0 && !s.values[a.ID].rematerializeable && countRegs(s.values[a.ID].regs) == 1 {
|
if m != 0 && !s.values[a.ID].rematerializeable && countRegs(s.values[a.ID].regs) == 1 {
|
||||||
r2 := pickReg(m)
|
r2 := pickReg(m)
|
||||||
c := p.NewValue1(a.Line, OpCopy, a.Type, s.regs[r].c)
|
c := p.NewValue1(a.Pos, OpCopy, a.Type, s.regs[r].c)
|
||||||
s.copies[c] = false
|
s.copies[c] = false
|
||||||
if s.f.pass.debug > regDebug {
|
if s.f.pass.debug > regDebug {
|
||||||
fmt.Printf("copy %s to %s : %s\n", a, c, s.registers[r2].Name())
|
fmt.Printf("copy %s to %s : %s\n", a, c, s.registers[r2].Name())
|
||||||
|
|
@ -951,7 +951,7 @@ func (s *regAllocState) regalloc(f *Func) {
|
||||||
// register-based phi
|
// register-based phi
|
||||||
s.assignReg(r, v, v)
|
s.assignReg(r, v, v)
|
||||||
// Spill the phi in case we need to restore it later.
|
// Spill the phi in case we need to restore it later.
|
||||||
spill := b.NewValue1(v.Line, OpStoreReg, v.Type, v)
|
spill := b.NewValue1(v.Pos, OpStoreReg, v.Type, v)
|
||||||
s.setOrig(spill, v)
|
s.setOrig(spill, v)
|
||||||
s.values[v.ID].spill = spill
|
s.values[v.ID].spill = spill
|
||||||
s.values[v.ID].spillUsed = false
|
s.values[v.ID].spillUsed = false
|
||||||
|
|
@ -1184,7 +1184,7 @@ func (s *regAllocState) regalloc(f *Func) {
|
||||||
mask &^= desired.avoid
|
mask &^= desired.avoid
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
args[i.idx] = s.allocValToReg(args[i.idx], mask, true, v.Line)
|
args[i.idx] = s.allocValToReg(args[i.idx], mask, true, v.Pos)
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the output clobbers the input register, make sure we have
|
// If the output clobbers the input register, make sure we have
|
||||||
|
|
@ -1236,7 +1236,7 @@ func (s *regAllocState) regalloc(f *Func) {
|
||||||
for _, r := range dinfo[idx].out {
|
for _, r := range dinfo[idx].out {
|
||||||
if r != noRegister && m>>r&1 != 0 {
|
if r != noRegister && m>>r&1 != 0 {
|
||||||
m = regMask(1) << r
|
m = regMask(1) << r
|
||||||
args[0] = s.allocValToReg(v.Args[0], m, true, v.Line)
|
args[0] = s.allocValToReg(v.Args[0], m, true, v.Pos)
|
||||||
// Note: we update args[0] so the instruction will
|
// Note: we update args[0] so the instruction will
|
||||||
// use the register copy we just made.
|
// use the register copy we just made.
|
||||||
goto ok
|
goto ok
|
||||||
|
|
@ -1247,7 +1247,7 @@ func (s *regAllocState) regalloc(f *Func) {
|
||||||
for _, r := range dinfo[idx].in[0] {
|
for _, r := range dinfo[idx].in[0] {
|
||||||
if r != noRegister && m>>r&1 != 0 {
|
if r != noRegister && m>>r&1 != 0 {
|
||||||
m = regMask(1) << r
|
m = regMask(1) << r
|
||||||
c := s.allocValToReg(v.Args[0], m, true, v.Line)
|
c := s.allocValToReg(v.Args[0], m, true, v.Pos)
|
||||||
s.copies[c] = false
|
s.copies[c] = false
|
||||||
// Note: no update to args[0] so the instruction will
|
// Note: no update to args[0] so the instruction will
|
||||||
// use the original copy.
|
// use the original copy.
|
||||||
|
|
@ -1258,7 +1258,7 @@ func (s *regAllocState) regalloc(f *Func) {
|
||||||
for _, r := range dinfo[idx].in[1] {
|
for _, r := range dinfo[idx].in[1] {
|
||||||
if r != noRegister && m>>r&1 != 0 {
|
if r != noRegister && m>>r&1 != 0 {
|
||||||
m = regMask(1) << r
|
m = regMask(1) << r
|
||||||
c := s.allocValToReg(v.Args[1], m, true, v.Line)
|
c := s.allocValToReg(v.Args[1], m, true, v.Pos)
|
||||||
s.copies[c] = false
|
s.copies[c] = false
|
||||||
args[0], args[1] = args[1], args[0]
|
args[0], args[1] = args[1], args[0]
|
||||||
goto ok
|
goto ok
|
||||||
|
|
@ -1270,7 +1270,7 @@ func (s *regAllocState) regalloc(f *Func) {
|
||||||
m &^= desired.avoid
|
m &^= desired.avoid
|
||||||
}
|
}
|
||||||
// Save input 0 to a new register so we can clobber it.
|
// Save input 0 to a new register so we can clobber it.
|
||||||
c := s.allocValToReg(v.Args[0], m, true, v.Line)
|
c := s.allocValToReg(v.Args[0], m, true, v.Pos)
|
||||||
s.copies[c] = false
|
s.copies[c] = false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1384,7 +1384,7 @@ func (s *regAllocState) regalloc(f *Func) {
|
||||||
// It would be good to have both spill and restore inside the IF.
|
// It would be good to have both spill and restore inside the IF.
|
||||||
issueSpill:
|
issueSpill:
|
||||||
if s.values[v.ID].needReg {
|
if s.values[v.ID].needReg {
|
||||||
spill := b.NewValue1(v.Line, OpStoreReg, v.Type, v)
|
spill := b.NewValue1(v.Pos, OpStoreReg, v.Type, v)
|
||||||
s.setOrig(spill, v)
|
s.setOrig(spill, v)
|
||||||
s.values[v.ID].spill = spill
|
s.values[v.ID].spill = spill
|
||||||
s.values[v.ID].spillUsed = false
|
s.values[v.ID].spillUsed = false
|
||||||
|
|
@ -1404,7 +1404,7 @@ func (s *regAllocState) regalloc(f *Func) {
|
||||||
// We assume that a control input can be passed in any
|
// We assume that a control input can be passed in any
|
||||||
// type-compatible register. If this turns out not to be true,
|
// type-compatible register. If this turns out not to be true,
|
||||||
// we'll need to introduce a regspec for a block's control value.
|
// we'll need to introduce a regspec for a block's control value.
|
||||||
b.Control = s.allocValToReg(v, s.compatRegs(v.Type), false, b.Line)
|
b.Control = s.allocValToReg(v, s.compatRegs(v.Type), false, b.Pos)
|
||||||
if b.Control != v {
|
if b.Control != v {
|
||||||
v.Uses--
|
v.Uses--
|
||||||
b.Control.Uses++
|
b.Control.Uses++
|
||||||
|
|
@ -1459,7 +1459,7 @@ func (s *regAllocState) regalloc(f *Func) {
|
||||||
m &^= desired.avoid
|
m &^= desired.avoid
|
||||||
}
|
}
|
||||||
if m != 0 {
|
if m != 0 {
|
||||||
s.allocValToReg(v, m, false, b.Line)
|
s.allocValToReg(v, m, false, b.Pos)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1610,7 +1610,7 @@ func (s *regAllocState) regalloc(f *Func) {
|
||||||
vi := s.values[i]
|
vi := s.values[i]
|
||||||
if vi.spillUsed {
|
if vi.spillUsed {
|
||||||
if s.f.pass.debug > logSpills && vi.spill.Op != OpArg {
|
if s.f.pass.debug > logSpills && vi.spill.Op != OpArg {
|
||||||
s.f.Config.Warnl(vi.spill.Line, "spilled value at %v remains", vi.spill)
|
s.f.Config.Warnl(vi.spill.Pos, "spilled value at %v remains", vi.spill)
|
||||||
}
|
}
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
@ -1708,7 +1708,7 @@ sinking:
|
||||||
}
|
}
|
||||||
// If here, the register assignment was lost down at least one exit and it can't be sunk
|
// If here, the register assignment was lost down at least one exit and it can't be sunk
|
||||||
if s.f.pass.debug > moveSpills {
|
if s.f.pass.debug > moveSpills {
|
||||||
s.f.Config.Warnl(e.Line, "lost register assignment for spill %v in %v at exit %v to %v",
|
s.f.Config.Warnl(e.Pos, "lost register assignment for spill %v in %v at exit %v to %v",
|
||||||
vsp, b, p, d)
|
vsp, b, p, d)
|
||||||
}
|
}
|
||||||
nSpillsChanged++
|
nSpillsChanged++
|
||||||
|
|
@ -1744,10 +1744,10 @@ sinking:
|
||||||
d := loop.exits[i]
|
d := loop.exits[i]
|
||||||
vspnew := vsp // reuse original for first sunk spill, saves tracking down and renaming uses
|
vspnew := vsp // reuse original for first sunk spill, saves tracking down and renaming uses
|
||||||
if !first { // any sunk spills after first must make a copy
|
if !first { // any sunk spills after first must make a copy
|
||||||
vspnew = d.NewValue1(e.Line, OpStoreReg, e.Type, e)
|
vspnew = d.NewValue1(e.Pos, OpStoreReg, e.Type, e)
|
||||||
f.setHome(vspnew, f.getHome(vsp.ID)) // copy stack home
|
f.setHome(vspnew, f.getHome(vsp.ID)) // copy stack home
|
||||||
if s.f.pass.debug > moveSpills {
|
if s.f.pass.debug > moveSpills {
|
||||||
s.f.Config.Warnl(e.Line, "copied spill %v in %v for %v to %v in %v",
|
s.f.Config.Warnl(e.Pos, "copied spill %v in %v for %v to %v in %v",
|
||||||
vsp, b, e, vspnew, d)
|
vsp, b, e, vspnew, d)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -1755,7 +1755,7 @@ sinking:
|
||||||
vspnew.Block = d
|
vspnew.Block = d
|
||||||
d.Values = append(d.Values, vspnew)
|
d.Values = append(d.Values, vspnew)
|
||||||
if s.f.pass.debug > moveSpills {
|
if s.f.pass.debug > moveSpills {
|
||||||
s.f.Config.Warnl(e.Line, "moved spill %v in %v for %v to %v in %v",
|
s.f.Config.Warnl(e.Pos, "moved spill %v in %v for %v to %v in %v",
|
||||||
vsp, b, e, vspnew, d)
|
vsp, b, e, vspnew, d)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1935,7 +1935,7 @@ func (e *edgeState) setup(idx int, srcReg []endReg, dstReg []startReg, stacklive
|
||||||
if loc == nil {
|
if loc == nil {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
dsts = append(dsts, dstRecord{loc, v.Args[idx].ID, &v.Args[idx], v.Line})
|
dsts = append(dsts, dstRecord{loc, v.Args[idx].ID, &v.Args[idx], v.Pos})
|
||||||
}
|
}
|
||||||
e.destinations = dsts
|
e.destinations = dsts
|
||||||
|
|
||||||
|
|
@ -2251,8 +2251,8 @@ func (e *edgeState) findRegFor(typ Type) Location {
|
||||||
a := e.cache[vid]
|
a := e.cache[vid]
|
||||||
for _, c := range a {
|
for _, c := range a {
|
||||||
if r, ok := e.s.f.getHome(c.ID).(*Register); ok && m>>uint(r.num)&1 != 0 {
|
if r, ok := e.s.f.getHome(c.ID).(*Register); ok && m>>uint(r.num)&1 != 0 {
|
||||||
x := e.p.NewValue1(c.Line, OpStoreReg, c.Type, c)
|
x := e.p.NewValue1(c.Pos, OpStoreReg, c.Type, c)
|
||||||
e.set(t, vid, x, false, c.Line)
|
e.set(t, vid, x, false, c.Pos)
|
||||||
if e.s.f.pass.debug > regDebug {
|
if e.s.f.pass.debug > regDebug {
|
||||||
fmt.Printf(" SPILL %s->%s %s\n", r.Name(), t.Name(), x.LongString())
|
fmt.Printf(" SPILL %s->%s %s\n", r.Name(), t.Name(), x.LongString())
|
||||||
}
|
}
|
||||||
|
|
@ -2347,7 +2347,7 @@ func (s *regAllocState) computeLive() {
|
||||||
|
|
||||||
// Mark control value as live
|
// Mark control value as live
|
||||||
if b.Control != nil && s.values[b.Control.ID].needReg {
|
if b.Control != nil && s.values[b.Control.ID].needReg {
|
||||||
live.set(b.Control.ID, int32(len(b.Values)), b.Line)
|
live.set(b.Control.ID, int32(len(b.Values)), b.Pos)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Propagate backwards to the start of the block
|
// Propagate backwards to the start of the block
|
||||||
|
|
@ -2369,7 +2369,7 @@ func (s *regAllocState) computeLive() {
|
||||||
}
|
}
|
||||||
for _, a := range v.Args {
|
for _, a := range v.Args {
|
||||||
if s.values[a.ID].needReg {
|
if s.values[a.ID].needReg {
|
||||||
live.set(a.ID, int32(i), v.Line)
|
live.set(a.ID, int32(i), v.Pos)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -2447,7 +2447,7 @@ func (s *regAllocState) computeLive() {
|
||||||
id := v.Args[i].ID
|
id := v.Args[i].ID
|
||||||
if s.values[id].needReg && (!t.contains(id) || delta < t.get(id)) {
|
if s.values[id].needReg && (!t.contains(id) || delta < t.get(id)) {
|
||||||
update = true
|
update = true
|
||||||
t.set(id, delta, v.Line)
|
t.set(id, delta, v.Pos)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -489,7 +489,7 @@ func noteRule(s string) bool {
|
||||||
// cond is true and the rule is fired.
|
// cond is true and the rule is fired.
|
||||||
func warnRule(cond bool, v *Value, s string) bool {
|
func warnRule(cond bool, v *Value, s string) bool {
|
||||||
if cond {
|
if cond {
|
||||||
v.Block.Func.Config.Warnl(v.Line, s)
|
v.Block.Func.Config.Warnl(v.Pos, s)
|
||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
|
@ -123,12 +123,12 @@ func rewriteValuedec_OpLoad(v *Value, config *Config) bool {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
v.reset(OpComplexMake)
|
v.reset(OpComplexMake)
|
||||||
v0 := b.NewValue0(v.Line, OpLoad, config.fe.TypeFloat32())
|
v0 := b.NewValue0(v.Pos, OpLoad, config.fe.TypeFloat32())
|
||||||
v0.AddArg(ptr)
|
v0.AddArg(ptr)
|
||||||
v0.AddArg(mem)
|
v0.AddArg(mem)
|
||||||
v.AddArg(v0)
|
v.AddArg(v0)
|
||||||
v1 := b.NewValue0(v.Line, OpLoad, config.fe.TypeFloat32())
|
v1 := b.NewValue0(v.Pos, OpLoad, config.fe.TypeFloat32())
|
||||||
v2 := b.NewValue0(v.Line, OpOffPtr, config.fe.TypeFloat32().PtrTo())
|
v2 := b.NewValue0(v.Pos, OpOffPtr, config.fe.TypeFloat32().PtrTo())
|
||||||
v2.AuxInt = 4
|
v2.AuxInt = 4
|
||||||
v2.AddArg(ptr)
|
v2.AddArg(ptr)
|
||||||
v1.AddArg(v2)
|
v1.AddArg(v2)
|
||||||
|
|
@ -147,12 +147,12 @@ func rewriteValuedec_OpLoad(v *Value, config *Config) bool {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
v.reset(OpComplexMake)
|
v.reset(OpComplexMake)
|
||||||
v0 := b.NewValue0(v.Line, OpLoad, config.fe.TypeFloat64())
|
v0 := b.NewValue0(v.Pos, OpLoad, config.fe.TypeFloat64())
|
||||||
v0.AddArg(ptr)
|
v0.AddArg(ptr)
|
||||||
v0.AddArg(mem)
|
v0.AddArg(mem)
|
||||||
v.AddArg(v0)
|
v.AddArg(v0)
|
||||||
v1 := b.NewValue0(v.Line, OpLoad, config.fe.TypeFloat64())
|
v1 := b.NewValue0(v.Pos, OpLoad, config.fe.TypeFloat64())
|
||||||
v2 := b.NewValue0(v.Line, OpOffPtr, config.fe.TypeFloat64().PtrTo())
|
v2 := b.NewValue0(v.Pos, OpOffPtr, config.fe.TypeFloat64().PtrTo())
|
||||||
v2.AuxInt = 8
|
v2.AuxInt = 8
|
||||||
v2.AddArg(ptr)
|
v2.AddArg(ptr)
|
||||||
v1.AddArg(v2)
|
v1.AddArg(v2)
|
||||||
|
|
@ -171,12 +171,12 @@ func rewriteValuedec_OpLoad(v *Value, config *Config) bool {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
v.reset(OpStringMake)
|
v.reset(OpStringMake)
|
||||||
v0 := b.NewValue0(v.Line, OpLoad, config.fe.TypeBytePtr())
|
v0 := b.NewValue0(v.Pos, OpLoad, config.fe.TypeBytePtr())
|
||||||
v0.AddArg(ptr)
|
v0.AddArg(ptr)
|
||||||
v0.AddArg(mem)
|
v0.AddArg(mem)
|
||||||
v.AddArg(v0)
|
v.AddArg(v0)
|
||||||
v1 := b.NewValue0(v.Line, OpLoad, config.fe.TypeInt())
|
v1 := b.NewValue0(v.Pos, OpLoad, config.fe.TypeInt())
|
||||||
v2 := b.NewValue0(v.Line, OpOffPtr, config.fe.TypeInt().PtrTo())
|
v2 := b.NewValue0(v.Pos, OpOffPtr, config.fe.TypeInt().PtrTo())
|
||||||
v2.AuxInt = config.PtrSize
|
v2.AuxInt = config.PtrSize
|
||||||
v2.AddArg(ptr)
|
v2.AddArg(ptr)
|
||||||
v1.AddArg(v2)
|
v1.AddArg(v2)
|
||||||
|
|
@ -195,19 +195,19 @@ func rewriteValuedec_OpLoad(v *Value, config *Config) bool {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
v.reset(OpSliceMake)
|
v.reset(OpSliceMake)
|
||||||
v0 := b.NewValue0(v.Line, OpLoad, t.ElemType().PtrTo())
|
v0 := b.NewValue0(v.Pos, OpLoad, t.ElemType().PtrTo())
|
||||||
v0.AddArg(ptr)
|
v0.AddArg(ptr)
|
||||||
v0.AddArg(mem)
|
v0.AddArg(mem)
|
||||||
v.AddArg(v0)
|
v.AddArg(v0)
|
||||||
v1 := b.NewValue0(v.Line, OpLoad, config.fe.TypeInt())
|
v1 := b.NewValue0(v.Pos, OpLoad, config.fe.TypeInt())
|
||||||
v2 := b.NewValue0(v.Line, OpOffPtr, config.fe.TypeInt().PtrTo())
|
v2 := b.NewValue0(v.Pos, OpOffPtr, config.fe.TypeInt().PtrTo())
|
||||||
v2.AuxInt = config.PtrSize
|
v2.AuxInt = config.PtrSize
|
||||||
v2.AddArg(ptr)
|
v2.AddArg(ptr)
|
||||||
v1.AddArg(v2)
|
v1.AddArg(v2)
|
||||||
v1.AddArg(mem)
|
v1.AddArg(mem)
|
||||||
v.AddArg(v1)
|
v.AddArg(v1)
|
||||||
v3 := b.NewValue0(v.Line, OpLoad, config.fe.TypeInt())
|
v3 := b.NewValue0(v.Pos, OpLoad, config.fe.TypeInt())
|
||||||
v4 := b.NewValue0(v.Line, OpOffPtr, config.fe.TypeInt().PtrTo())
|
v4 := b.NewValue0(v.Pos, OpOffPtr, config.fe.TypeInt().PtrTo())
|
||||||
v4.AuxInt = 2 * config.PtrSize
|
v4.AuxInt = 2 * config.PtrSize
|
||||||
v4.AddArg(ptr)
|
v4.AddArg(ptr)
|
||||||
v3.AddArg(v4)
|
v3.AddArg(v4)
|
||||||
|
|
@ -226,12 +226,12 @@ func rewriteValuedec_OpLoad(v *Value, config *Config) bool {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
v.reset(OpIMake)
|
v.reset(OpIMake)
|
||||||
v0 := b.NewValue0(v.Line, OpLoad, config.fe.TypeBytePtr())
|
v0 := b.NewValue0(v.Pos, OpLoad, config.fe.TypeBytePtr())
|
||||||
v0.AddArg(ptr)
|
v0.AddArg(ptr)
|
||||||
v0.AddArg(mem)
|
v0.AddArg(mem)
|
||||||
v.AddArg(v0)
|
v.AddArg(v0)
|
||||||
v1 := b.NewValue0(v.Line, OpLoad, config.fe.TypeBytePtr())
|
v1 := b.NewValue0(v.Pos, OpLoad, config.fe.TypeBytePtr())
|
||||||
v2 := b.NewValue0(v.Line, OpOffPtr, config.fe.TypeBytePtr().PtrTo())
|
v2 := b.NewValue0(v.Pos, OpOffPtr, config.fe.TypeBytePtr().PtrTo())
|
||||||
v2.AuxInt = config.PtrSize
|
v2.AuxInt = config.PtrSize
|
||||||
v2.AddArg(ptr)
|
v2.AddArg(ptr)
|
||||||
v1.AddArg(v2)
|
v1.AddArg(v2)
|
||||||
|
|
@ -318,12 +318,12 @@ func rewriteValuedec_OpStore(v *Value, config *Config) bool {
|
||||||
mem := v.Args[2]
|
mem := v.Args[2]
|
||||||
v.reset(OpStore)
|
v.reset(OpStore)
|
||||||
v.AuxInt = 4
|
v.AuxInt = 4
|
||||||
v0 := b.NewValue0(v.Line, OpOffPtr, config.fe.TypeFloat32().PtrTo())
|
v0 := b.NewValue0(v.Pos, OpOffPtr, config.fe.TypeFloat32().PtrTo())
|
||||||
v0.AuxInt = 4
|
v0.AuxInt = 4
|
||||||
v0.AddArg(dst)
|
v0.AddArg(dst)
|
||||||
v.AddArg(v0)
|
v.AddArg(v0)
|
||||||
v.AddArg(imag)
|
v.AddArg(imag)
|
||||||
v1 := b.NewValue0(v.Line, OpStore, TypeMem)
|
v1 := b.NewValue0(v.Pos, OpStore, TypeMem)
|
||||||
v1.AuxInt = 4
|
v1.AuxInt = 4
|
||||||
v1.AddArg(dst)
|
v1.AddArg(dst)
|
||||||
v1.AddArg(real)
|
v1.AddArg(real)
|
||||||
|
|
@ -348,12 +348,12 @@ func rewriteValuedec_OpStore(v *Value, config *Config) bool {
|
||||||
mem := v.Args[2]
|
mem := v.Args[2]
|
||||||
v.reset(OpStore)
|
v.reset(OpStore)
|
||||||
v.AuxInt = 8
|
v.AuxInt = 8
|
||||||
v0 := b.NewValue0(v.Line, OpOffPtr, config.fe.TypeFloat64().PtrTo())
|
v0 := b.NewValue0(v.Pos, OpOffPtr, config.fe.TypeFloat64().PtrTo())
|
||||||
v0.AuxInt = 8
|
v0.AuxInt = 8
|
||||||
v0.AddArg(dst)
|
v0.AddArg(dst)
|
||||||
v.AddArg(v0)
|
v.AddArg(v0)
|
||||||
v.AddArg(imag)
|
v.AddArg(imag)
|
||||||
v1 := b.NewValue0(v.Line, OpStore, TypeMem)
|
v1 := b.NewValue0(v.Pos, OpStore, TypeMem)
|
||||||
v1.AuxInt = 8
|
v1.AuxInt = 8
|
||||||
v1.AddArg(dst)
|
v1.AddArg(dst)
|
||||||
v1.AddArg(real)
|
v1.AddArg(real)
|
||||||
|
|
@ -378,12 +378,12 @@ func rewriteValuedec_OpStore(v *Value, config *Config) bool {
|
||||||
mem := v.Args[2]
|
mem := v.Args[2]
|
||||||
v.reset(OpStore)
|
v.reset(OpStore)
|
||||||
v.AuxInt = config.PtrSize
|
v.AuxInt = config.PtrSize
|
||||||
v0 := b.NewValue0(v.Line, OpOffPtr, config.fe.TypeInt().PtrTo())
|
v0 := b.NewValue0(v.Pos, OpOffPtr, config.fe.TypeInt().PtrTo())
|
||||||
v0.AuxInt = config.PtrSize
|
v0.AuxInt = config.PtrSize
|
||||||
v0.AddArg(dst)
|
v0.AddArg(dst)
|
||||||
v.AddArg(v0)
|
v.AddArg(v0)
|
||||||
v.AddArg(len)
|
v.AddArg(len)
|
||||||
v1 := b.NewValue0(v.Line, OpStore, TypeMem)
|
v1 := b.NewValue0(v.Pos, OpStore, TypeMem)
|
||||||
v1.AuxInt = config.PtrSize
|
v1.AuxInt = config.PtrSize
|
||||||
v1.AddArg(dst)
|
v1.AddArg(dst)
|
||||||
v1.AddArg(ptr)
|
v1.AddArg(ptr)
|
||||||
|
|
@ -409,19 +409,19 @@ func rewriteValuedec_OpStore(v *Value, config *Config) bool {
|
||||||
mem := v.Args[2]
|
mem := v.Args[2]
|
||||||
v.reset(OpStore)
|
v.reset(OpStore)
|
||||||
v.AuxInt = config.PtrSize
|
v.AuxInt = config.PtrSize
|
||||||
v0 := b.NewValue0(v.Line, OpOffPtr, config.fe.TypeInt().PtrTo())
|
v0 := b.NewValue0(v.Pos, OpOffPtr, config.fe.TypeInt().PtrTo())
|
||||||
v0.AuxInt = 2 * config.PtrSize
|
v0.AuxInt = 2 * config.PtrSize
|
||||||
v0.AddArg(dst)
|
v0.AddArg(dst)
|
||||||
v.AddArg(v0)
|
v.AddArg(v0)
|
||||||
v.AddArg(cap)
|
v.AddArg(cap)
|
||||||
v1 := b.NewValue0(v.Line, OpStore, TypeMem)
|
v1 := b.NewValue0(v.Pos, OpStore, TypeMem)
|
||||||
v1.AuxInt = config.PtrSize
|
v1.AuxInt = config.PtrSize
|
||||||
v2 := b.NewValue0(v.Line, OpOffPtr, config.fe.TypeInt().PtrTo())
|
v2 := b.NewValue0(v.Pos, OpOffPtr, config.fe.TypeInt().PtrTo())
|
||||||
v2.AuxInt = config.PtrSize
|
v2.AuxInt = config.PtrSize
|
||||||
v2.AddArg(dst)
|
v2.AddArg(dst)
|
||||||
v1.AddArg(v2)
|
v1.AddArg(v2)
|
||||||
v1.AddArg(len)
|
v1.AddArg(len)
|
||||||
v3 := b.NewValue0(v.Line, OpStore, TypeMem)
|
v3 := b.NewValue0(v.Pos, OpStore, TypeMem)
|
||||||
v3.AuxInt = config.PtrSize
|
v3.AuxInt = config.PtrSize
|
||||||
v3.AddArg(dst)
|
v3.AddArg(dst)
|
||||||
v3.AddArg(ptr)
|
v3.AddArg(ptr)
|
||||||
|
|
@ -447,12 +447,12 @@ func rewriteValuedec_OpStore(v *Value, config *Config) bool {
|
||||||
mem := v.Args[2]
|
mem := v.Args[2]
|
||||||
v.reset(OpStore)
|
v.reset(OpStore)
|
||||||
v.AuxInt = config.PtrSize
|
v.AuxInt = config.PtrSize
|
||||||
v0 := b.NewValue0(v.Line, OpOffPtr, config.fe.TypeBytePtr().PtrTo())
|
v0 := b.NewValue0(v.Pos, OpOffPtr, config.fe.TypeBytePtr().PtrTo())
|
||||||
v0.AuxInt = config.PtrSize
|
v0.AuxInt = config.PtrSize
|
||||||
v0.AddArg(dst)
|
v0.AddArg(dst)
|
||||||
v.AddArg(v0)
|
v.AddArg(v0)
|
||||||
v.AddArg(data)
|
v.AddArg(data)
|
||||||
v1 := b.NewValue0(v.Line, OpStore, TypeMem)
|
v1 := b.NewValue0(v.Pos, OpStore, TypeMem)
|
||||||
v1.AuxInt = config.PtrSize
|
v1.AuxInt = config.PtrSize
|
||||||
v1.AddArg(dst)
|
v1.AddArg(dst)
|
||||||
v1.AddArg(itab)
|
v1.AddArg(itab)
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
|
@ -46,8 +46,8 @@ func (h ValHeap) Less(i, j int) bool {
|
||||||
if c := sx - sy; c != 0 {
|
if c := sx - sy; c != 0 {
|
||||||
return c > 0 // higher score comes later.
|
return c > 0 // higher score comes later.
|
||||||
}
|
}
|
||||||
if x.Line != y.Line { // Favor in-order line stepping
|
if x.Pos != y.Pos { // Favor in-order line stepping
|
||||||
return x.Line.After(y.Line)
|
return x.Pos.After(y.Pos)
|
||||||
}
|
}
|
||||||
if x.Op != OpPhi {
|
if x.Op != OpPhi {
|
||||||
if c := len(x.Args) - len(y.Args); c != 0 {
|
if c := len(x.Args) - len(y.Args); c != 0 {
|
||||||
|
|
|
||||||
|
|
@ -17,8 +17,8 @@ func shortcircuit(f *Func) {
|
||||||
// x = phi(a, ...)
|
// x = phi(a, ...)
|
||||||
//
|
//
|
||||||
// We can replace the "a" in the phi with the constant true.
|
// We can replace the "a" in the phi with the constant true.
|
||||||
ct := f.ConstBool(f.Entry.Line, f.Config.fe.TypeBool(), true)
|
ct := f.ConstBool(f.Entry.Pos, f.Config.fe.TypeBool(), true)
|
||||||
cf := f.ConstBool(f.Entry.Line, f.Config.fe.TypeBool(), false)
|
cf := f.ConstBool(f.Entry.Pos, f.Config.fe.TypeBool(), false)
|
||||||
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 {
|
||||||
|
|
|
||||||
|
|
@ -37,8 +37,8 @@ type Value struct {
|
||||||
// Containing basic block
|
// Containing basic block
|
||||||
Block *Block
|
Block *Block
|
||||||
|
|
||||||
// Source line number
|
// Source position
|
||||||
Line src.Pos
|
Pos src.Pos
|
||||||
|
|
||||||
// Use count. Each appearance in Value.Args and Block.Control counts once.
|
// Use count. Each appearance in Value.Args and Block.Control counts once.
|
||||||
Uses int32
|
Uses int32
|
||||||
|
|
@ -218,7 +218,7 @@ func (v *Value) reset(op Op) {
|
||||||
|
|
||||||
// copyInto makes a new value identical to v and adds it to the end of b.
|
// copyInto makes a new value identical to v and adds it to the end of b.
|
||||||
func (v *Value) copyInto(b *Block) *Value {
|
func (v *Value) copyInto(b *Block) *Value {
|
||||||
c := b.NewValue0(v.Line, v.Op, v.Type)
|
c := b.NewValue0(v.Pos, v.Op, v.Type)
|
||||||
c.Aux = v.Aux
|
c.Aux = v.Aux
|
||||||
c.AuxInt = v.AuxInt
|
c.AuxInt = v.AuxInt
|
||||||
c.AddArgs(v.Args...)
|
c.AddArgs(v.Args...)
|
||||||
|
|
@ -233,7 +233,7 @@ func (v *Value) copyInto(b *Block) *Value {
|
||||||
func (v *Value) Logf(msg string, args ...interface{}) { v.Block.Logf(msg, args...) }
|
func (v *Value) Logf(msg string, args ...interface{}) { v.Block.Logf(msg, args...) }
|
||||||
func (v *Value) Log() bool { return v.Block.Log() }
|
func (v *Value) Log() bool { return v.Block.Log() }
|
||||||
func (v *Value) Fatalf(msg string, args ...interface{}) {
|
func (v *Value) Fatalf(msg string, args ...interface{}) {
|
||||||
v.Block.Func.Config.Fatalf(v.Line, msg, args...)
|
v.Block.Func.Config.Fatalf(v.Pos, msg, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// isGenericIntConst returns whether v is a generic integer constant.
|
// isGenericIntConst returns whether v is a generic integer constant.
|
||||||
|
|
|
||||||
|
|
@ -56,7 +56,7 @@ func writebarrier(f *Func) {
|
||||||
if wbaddr == nil {
|
if wbaddr == nil {
|
||||||
// initalize global values for write barrier test and calls
|
// initalize global values for write barrier test and calls
|
||||||
// find SB and SP values in entry block
|
// find SB and SP values in entry block
|
||||||
initln := f.Entry.Line
|
initln := f.Entry.Pos
|
||||||
for _, v := range f.Entry.Values {
|
for _, v := range f.Entry.Values {
|
||||||
if v.Op == OpSB {
|
if v.Op == OpSB {
|
||||||
sb = v
|
sb = v
|
||||||
|
|
@ -81,7 +81,7 @@ func writebarrier(f *Func) {
|
||||||
defer f.retSparseSet(wbs)
|
defer f.retSparseSet(wbs)
|
||||||
}
|
}
|
||||||
|
|
||||||
line := v.Line
|
line := v.Pos
|
||||||
|
|
||||||
// there may be a sequence of WB stores in the current block. find them.
|
// there may be a sequence of WB stores in the current block. find them.
|
||||||
storeWBs = storeWBs[:0]
|
storeWBs = storeWBs[:0]
|
||||||
|
|
@ -127,9 +127,9 @@ func writebarrier(f *Func) {
|
||||||
bThen := f.NewBlock(BlockPlain)
|
bThen := f.NewBlock(BlockPlain)
|
||||||
bElse := f.NewBlock(BlockPlain)
|
bElse := f.NewBlock(BlockPlain)
|
||||||
bEnd := f.NewBlock(b.Kind)
|
bEnd := f.NewBlock(b.Kind)
|
||||||
bThen.Line = line
|
bThen.Pos = line
|
||||||
bElse.Line = line
|
bElse.Pos = line
|
||||||
bEnd.Line = line
|
bEnd.Pos = line
|
||||||
|
|
||||||
// set up control flow for end block
|
// set up control flow for end block
|
||||||
bEnd.SetControl(b.Control)
|
bEnd.SetControl(b.Control)
|
||||||
|
|
|
||||||
|
|
@ -114,7 +114,7 @@ func opregreg(op obj.As, dest, src int16) *obj.Prog {
|
||||||
}
|
}
|
||||||
|
|
||||||
func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
|
func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
|
||||||
s.SetPos(v.Line)
|
s.SetPos(v.Pos)
|
||||||
|
|
||||||
if gc.Thearch.Use387 {
|
if gc.Thearch.Use387 {
|
||||||
if ssaGenValue387(s, v) {
|
if ssaGenValue387(s, v) {
|
||||||
|
|
@ -788,8 +788,8 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
|
||||||
p.To.Type = obj.TYPE_MEM
|
p.To.Type = obj.TYPE_MEM
|
||||||
p.To.Reg = v.Args[0].Reg()
|
p.To.Reg = v.Args[0].Reg()
|
||||||
gc.AddAux(&p.To, v)
|
gc.AddAux(&p.To, v)
|
||||||
if gc.Debug_checknil != 0 && v.Line.Line() > 1 { // v.Line==1 in generated wrappers
|
if gc.Debug_checknil != 0 && v.Pos.Line() > 1 { // v.Pos.Line()==1 in generated wrappers
|
||||||
gc.Warnl(v.Line, "generated nil check")
|
gc.Warnl(v.Pos, "generated nil check")
|
||||||
}
|
}
|
||||||
case ssa.Op386FCHS:
|
case ssa.Op386FCHS:
|
||||||
v.Fatalf("FCHS in non-387 mode")
|
v.Fatalf("FCHS in non-387 mode")
|
||||||
|
|
@ -825,7 +825,7 @@ var nefJumps = [2][2]gc.FloatingEQNEJump{
|
||||||
}
|
}
|
||||||
|
|
||||||
func ssaGenBlock(s *gc.SSAGenState, b, next *ssa.Block) {
|
func ssaGenBlock(s *gc.SSAGenState, b, next *ssa.Block) {
|
||||||
s.SetPos(b.Line)
|
s.SetPos(b.Pos)
|
||||||
|
|
||||||
if gc.Thearch.Use387 {
|
if gc.Thearch.Use387 {
|
||||||
// Empty the 387's FP stack before the block ends.
|
// Empty the 387's FP stack before the block ends.
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue