diff --git a/src/core/CompileReturn.go b/src/core/CompileReturn.go index 752669f..fb93354 100644 --- a/src/core/CompileReturn.go +++ b/src/core/CompileReturn.go @@ -18,7 +18,13 @@ func (f *Function) CompileReturn(node *ast.Return) error { } for i := len(node.Values) - 1; i >= 0; i-- { - f.SaveRegister(f.CPU.Output[i]) + for j := range i { + if f.UsesRegister(node.Values[j], f.CPU.Output[i]) { + f.SaveRegister(f.CPU.Output[i]) + break + } + } + typ, err := f.ExpressionToRegister(node.Values[i], f.CPU.Output[i]) if err != nil { diff --git a/src/core/UsesRegister.go b/src/core/UsesRegister.go index 0ad2d90..74519bd 100644 --- a/src/core/UsesRegister.go +++ b/src/core/UsesRegister.go @@ -4,12 +4,23 @@ import ( "git.akyoto.dev/cli/q/src/ast" "git.akyoto.dev/cli/q/src/cpu" "git.akyoto.dev/cli/q/src/expression" + "git.akyoto.dev/cli/q/src/token" ) // UsesRegister returns true if evaluating the expression would write or read the given register. func (f *Function) UsesRegister(expr *expression.Expression, register cpu.Register) bool { if expr.IsLeaf() { - return false + if expr.Token.Kind != token.Identifier { + return false + } + + variable := f.VariableByName(expr.Token.Text(f.File.Bytes)) + + if variable == nil || variable.Register != register { + return false + } + + return true } if ast.IsFunctionCall(expr) {