]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: fix confusion in generating SelectN index
authorDavid Chase <drchase@google.com>
Sun, 7 Mar 2021 01:59:40 +0000 (20:59 -0500)
committerDavid Chase <drchase@google.com>
Tue, 9 Mar 2021 18:44:55 +0000 (18:44 +0000)
Old: return the ABI register index of the result (wrong!)
New: return the index w/in sequence of result registers (right!)

Fixed bug:
genCaller0/genCaller0.go:43:9: internal compiler error: 'Caller0':
   panic during schedule while compiling Caller0:
runtime error: index out of range [10] with length 9

Updates #44816.

Change-Id: I1111e283658a2d6422986ae3d61bd95d1b9bde5e
Reviewed-on: https://go-review.googlesource.com/c/go/+/299549
Trust: David Chase <drchase@google.com>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
src/cmd/compile/internal/ssa/expand_calls.go

index d4fa7f2b149c8ea2ec3d8e6d653e142476eb69b7..d7d7d3bc4514fb6e33dde58bb7c0d3f8b75fcc69 100644 (file)
@@ -424,7 +424,11 @@ func (x *expandState) rewriteSelect(leaf *Value, selector *Value, offset int64,
                                }
                                outParam := aux.abiInfo.OutParam(int(which))
                                if len(outParam.Registers) > 0 {
-                                       reg := int64(outParam.Registers[regOffset])
+                                       firstReg := uint32(0)
+                                       for i := 0; i < int(which); i++ {
+                                               firstReg += uint32(len(aux.abiInfo.OutParam(i).Registers))
+                                       }
+                                       reg := int64(regOffset + Abi1RO(firstReg))
                                        if leaf.Block == call.Block {
                                                leaf.reset(OpSelectN)
                                                leaf.SetArgs1(call0)