Commit 7c0cbbfa authored by Rémy Oudompheng's avatar Rémy Oudompheng

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
parent f59a6056
......@@ -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) {
......
// 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]
}
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