]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/6g, cmd/8g: prevent constant propagation of non-constant LEA.
authorDaniel Morsing <daniel.morsing@gmail.com>
Fri, 5 Jul 2013 14:11:22 +0000 (16:11 +0200)
committerDaniel Morsing <daniel.morsing@gmail.com>
Fri, 5 Jul 2013 14:11:22 +0000 (16:11 +0200)
Fixes #5809.

R=golang-dev, dave, rsc, nigeltao
CC=golang-dev
https://golang.org/cl/10785043

src/cmd/6g/peep.c
src/cmd/8g/peep.c
test/fixedbugs/issue5809.go [new file with mode: 0644]

index e77d65e873473c6f2c564dfe2ef797a61e9a843b..5db9f4cf16cdcde1e9fb6f2e33160c5face3e1d8 100644 (file)
@@ -154,6 +154,7 @@ peep(void)
                case ALEAQ:
                        if(regtyp(&p->to))
                        if(p->from.sym != S)
+                       if(p->from.index == D_NONE || p->from.index == D_CONST)
                                conprop(r);
                        break;
 
index 6b7e4363d87eb9da8be47f036cd43d6e047c9686..e4c8afa372d663981bbbf420e88093286b0eb324 100644 (file)
@@ -147,6 +147,7 @@ peep(void)
                case ALEAL:
                        if(regtyp(&p->to))
                        if(p->from.sym != S)
+                       if(p->from.index == D_NONE || p->from.index == D_CONST)
                                conprop(r);
                        break;
 
diff --git a/test/fixedbugs/issue5809.go b/test/fixedbugs/issue5809.go
new file mode 100644 (file)
index 0000000..ca060b5
--- /dev/null
@@ -0,0 +1,27 @@
+// run
+
+// Copyright 2013 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 5809: 6g and 8g attempted to constant propagate indexed LEA
+
+package main
+
+import "fmt"
+
+func main() {
+       const d16 = "0123456789ABCDEF"
+       k := 0x1234
+       var x [4]byte
+       
+       x[0] = d16[k>>12&0xf]
+       x[1] = d16[k>>8&0xf]
+       x[2] = d16[k>>4&0xf]
+       x[3] = d16[k&0xf]
+       
+       if x != [4]byte{'1','2','3','4'} {
+               fmt.Println(x)
+               panic("x != [4]byte{'1','2','3','4'}")
+       }
+}