Skip to content

Commit 3c3ce8e

Browse files
committed
cmd/6g, cmd/8g: prevent constant propagation of non-constant LEA.
Fixes #5809. R=golang-dev, dave, rsc, nigeltao CC=golang-dev https://golang.org/cl/10785043
1 parent daf81ae commit 3c3ce8e

File tree

3 files changed

+29
-0
lines changed

3 files changed

+29
-0
lines changed

src/cmd/6g/peep.c

+1
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@ peep(void)
154154
case ALEAQ:
155155
if(regtyp(&p->to))
156156
if(p->from.sym != S)
157+
if(p->from.index == D_NONE || p->from.index == D_CONST)
157158
conprop(r);
158159
break;
159160

src/cmd/8g/peep.c

+1
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@ peep(void)
147147
case ALEAL:
148148
if(regtyp(&p->to))
149149
if(p->from.sym != S)
150+
if(p->from.index == D_NONE || p->from.index == D_CONST)
150151
conprop(r);
151152
break;
152153

test/fixedbugs/issue5809.go

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// run
2+
3+
// Copyright 2013 The Go Authors. All rights reserved.
4+
// Use of this source code is governed by a BSD-style
5+
// license that can be found in the LICENSE file.
6+
7+
// issue 5809: 6g and 8g attempted to constant propagate indexed LEA
8+
9+
package main
10+
11+
import "fmt"
12+
13+
func main() {
14+
const d16 = "0123456789ABCDEF"
15+
k := 0x1234
16+
var x [4]byte
17+
18+
x[0] = d16[k>>12&0xf]
19+
x[1] = d16[k>>8&0xf]
20+
x[2] = d16[k>>4&0xf]
21+
x[3] = d16[k&0xf]
22+
23+
if x != [4]byte{'1','2','3','4'} {
24+
fmt.Println(x)
25+
panic("x != [4]byte{'1','2','3','4'}")
26+
}
27+
}

0 commit comments

Comments
 (0)