cmd/compile: establish regabi name/value mapping for small in-params

When the expand_calls phase in the SSA backend lowers prolog OpArg
values into OpArgIntReg/OpArgFloatReg values, we don't always record
the assocation between the new lowered value and the parameter name.

This patch handles the simple case where a given parameter fits into
exactly one register; in this scenario it makes sense to manufacture a
new pseudo-slot for the value that points to the param, and install
the slot/value mapping in the NamedValues table for the function. More
work will be needed to deal with params that span multiple registers;
that will need to be addressed in a subsequent patch.

This change improves the parameter error rate "optargorder" benchmark
by about 7-8% (when run on the optargorder binary).

Updates #45945.

Change-Id: Ic9adbe20b6f91145d49651348818f0f5cba92b18
Reviewed-on: https://go-review.googlesource.com/c/go/+/316890
Trust: Than McIntosh <thanm@google.com>
Run-TryBot: Than McIntosh <thanm@google.com>
Reviewed-by: David Chase <drchase@google.com>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
diff --git a/src/cmd/compile/internal/ssa/expand_calls.go b/src/cmd/compile/internal/ssa/expand_calls.go
index 39d0b61..2852753 100644
--- a/src/cmd/compile/internal/ssa/expand_calls.go
+++ b/src/cmd/compile/internal/ssa/expand_calls.go
@@ -1714,6 +1714,21 @@
 	} else {
 		w = baseArg.Block.NewValue0IA(pos, op, t, auxInt, aux)
 	}
+	// If we are creating an OpArgIntReg/OpArgFloatReg that
+	// corresponds to an in-param that fits entirely in a register,
+	// then enter it into the name/value table. The LocalSlot
+	// is somewhat fictitious, since there is no incoming live
+	// memory version of the parameter, but we need an entry in
+	// NamedValues in order for ssa debug tracking to include
+	// the value in the tracking analysis.
+	if len(pa.Registers) == 1 {
+		loc := LocalSlot{N: aux.Name, Type: t, Off: 0}
+		values, ok := x.f.NamedValues[loc]
+		if !ok {
+			x.f.Names = append(x.f.Names, loc)
+		}
+		x.f.NamedValues[loc] = append(values, w)
+	}
 	x.commonArgs[key] = w
 	if toReplace != nil {
 		toReplace.copyOf(w)