summaryrefslogtreecommitdiff
path: root/test/torture.go
diff options
context:
space:
mode:
authorR?my Oudompheng <oudomphe@phare.normalesup.org>2012-11-02 07:50:59 +0100
committerR?my Oudompheng <oudomphe@phare.normalesup.org>2012-11-02 07:50:59 +0100
commit84e880119d69e2848e2f00595c12cfabd7b4f0b3 (patch)
tree1d87ff66dc92a1fa217ab1bf535522a85abcbc00 /test/torture.go
parent17bf5287df4a6df86eadf30afbcd2346f573bdba (diff)
downloadgo-84e880119d69e2848e2f00595c12cfabd7b4f0b3.tar.gz
cmd/5g, cmd/6g: fix out of registers with array indexing.
Compiling expressions like: s[s[s[s[s[s[s[s[s[s[s[s[i]]]]]]]]]]]] make 5g and 6g run out of registers. Such expressions can arise if a slice is used to represent a permutation and the user wants to iterate it. This is due to the usual problem of allocating registers before going down the expression tree, instead of allocating them in a postfix way. The functions cgenr and agenr (that generate a value to a newly allocated register instead of an existing location), are either introduced or modified when they already existed to allocate the new register as late as possible, and sudoaddable is disabled for OINDEX nodes so that igen/agenr is used instead. Update issue 4207. R=dave, daniel.morsing, rsc CC=golang-dev http://codereview.appspot.com/6733055
Diffstat (limited to 'test/torture.go')
-rw-r--r--test/torture.go17
1 files changed, 17 insertions, 0 deletions
diff --git a/test/torture.go b/test/torture.go
index 4bce3a179..c510bb923 100644
--- a/test/torture.go
+++ b/test/torture.go
@@ -116,6 +116,23 @@ func determinantByte(m [4][4]byte) byte {
m[0][3]*m[1][2]*m[2][1]*m[3][0]
}
+type A []A
+
+// A sequence of constant indexings.
+func IndexChain1(s A) A {
+ return s[0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0]
+}
+
+// A sequence of non-constant indexings.
+func IndexChain2(s A, i int) A {
+ return s[i][i][i][i][i][i][i][i][i][i][i][i][i][i][i][i]
+}
+
+// Another sequence of indexings.
+func IndexChain3(s []int) int {
+ return s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[0]]]]]]]]]]]]]]]]]]]]]
+}
+
// A right-leaning tree of byte multiplications.
func righttree(a, b, c, d uint8) uint8 {
return a * (b * (c * (d *