mirror of
https://github.com/golang/go
synced 2024-10-14 11:53:56 +00:00
cmd/6g, cmd/8g: mark used registers in indirect addressing.
Fixes #4094. Fixes #4353. R=golang-dev, dave, rsc CC=golang-dev https://golang.org/cl/6810090
This commit is contained in:
parent
f59a605645
commit
7c0cbbfa18
|
@ -247,6 +247,16 @@ regopt(Prog *firstp)
|
|||
}
|
||||
}
|
||||
|
||||
// Addressing makes some registers used.
|
||||
if(p->from.type >= D_INDIR)
|
||||
r->use1.b[0] |= RtoB(p->from.type-D_INDIR);
|
||||
if(p->from.index != D_NONE)
|
||||
r->use1.b[0] |= RtoB(p->from.index);
|
||||
if(p->to.type >= D_INDIR)
|
||||
r->use2.b[0] |= RtoB(p->to.type-D_INDIR);
|
||||
if(p->to.index != D_NONE)
|
||||
r->use2.b[0] |= RtoB(p->to.index);
|
||||
|
||||
bit = mkvar(r, &p->from);
|
||||
if(bany(&bit))
|
||||
switch(p->as) {
|
||||
|
|
|
@ -212,6 +212,16 @@ regopt(Prog *firstp)
|
|||
}
|
||||
}
|
||||
|
||||
// Addressing makes some registers used.
|
||||
if(p->from.type >= D_INDIR)
|
||||
r->use1.b[0] |= RtoB(p->from.type-D_INDIR);
|
||||
if(p->from.index != D_NONE)
|
||||
r->use1.b[0] |= RtoB(p->from.index);
|
||||
if(p->to.type >= D_INDIR)
|
||||
r->use2.b[0] |= RtoB(p->to.type-D_INDIR);
|
||||
if(p->to.index != D_NONE)
|
||||
r->use2.b[0] |= RtoB(p->to.index);
|
||||
|
||||
bit = mkvar(r, &p->from);
|
||||
if(bany(&bit))
|
||||
switch(p->as) {
|
||||
|
|
19
test/fixedbugs/issue4353.go
Normal file
19
test/fixedbugs/issue4353.go
Normal file
|
@ -0,0 +1,19 @@
|
|||
// run
|
||||
|
||||
// Copyright 2012 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// Issue 4353. An optimizer bug in 8g triggers a runtime fault
|
||||
// instead of an out of bounds panic.
|
||||
|
||||
package main
|
||||
|
||||
var aib [100000]int
|
||||
var paib *[100000]int = &aib
|
||||
var i64 int64 = 100023
|
||||
|
||||
func main() {
|
||||
defer func() { recover() }()
|
||||
_ = paib[i64]
|
||||
}
|
Loading…
Reference in a new issue