From 9f5298ca6e7fc9c46c0a82bd7be39450ec48dcb5 Mon Sep 17 00:00:00 2001 From: David Chase Date: Sat, 6 Mar 2021 20:59:40 -0500 Subject: [PATCH] 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 --- src/cmd/compile/internal/ssa/expand_calls.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/cmd/compile/internal/ssa/expand_calls.go b/src/cmd/compile/internal/ssa/expand_calls.go index d4fa7f2b149..d7d7d3bc451 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)