From: David Chase Date: Sun, 7 Mar 2021 01:59:40 +0000 (-0500) Subject: cmd/compile: fix confusion in generating SelectN index X-Git-Tag: go1.17beta1~1219 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=9f5298ca6e;p=gostls13.git cmd/compile: fix confusion in generating SelectN index 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 Reviewed-by: Cherry Zhang --- diff --git a/src/cmd/compile/internal/ssa/expand_calls.go b/src/cmd/compile/internal/ssa/expand_calls.go index d4fa7f2b14..d7d7d3bc45 100644 --- a/src/cmd/compile/internal/ssa/expand_calls.go +++ b/src/cmd/compile/internal/ssa/expand_calls.go @@ -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)