From 983064c6941466187b3e0361cf2c8500650f2bc1 Mon Sep 17 00:00:00 2001 From: drmortalwombat <90205530+drmortalwombat@users.noreply.github.com> Date: Tue, 6 May 2025 17:00:36 +0200 Subject: [PATCH] Fix removal of reference returns when struct member used --- oscar64/GlobalOptimizer.cpp | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/oscar64/GlobalOptimizer.cpp b/oscar64/GlobalOptimizer.cpp index ea09cc8..e23e8a8 100644 --- a/oscar64/GlobalOptimizer.cpp +++ b/oscar64/GlobalOptimizer.cpp @@ -606,8 +606,9 @@ void GlobalOptimizer::RegisterProc(Declaration* to) } } -static const uint32 ANAFL_LHS = (1U << 0); -static const uint32 ANAFL_RHS = (1U << 1); +static const uint32 ANAFL_LHS = (1U << 0); +static const uint32 ANAFL_RHS = (1U << 1); +static const uint32 ANAFL_ASSIGN = (1U << 2); Declaration* GlobalOptimizer::Analyze(Expression* exp, Declaration* procDec, uint32 flags) { @@ -654,6 +655,8 @@ Declaration* GlobalOptimizer::Analyze(Expression* exp, Declaration* procDec, uin exp->mDecValue->mOptFlags |= OPTF_VAR_USED; if (flags & ANAFL_LHS) exp->mDecValue->mOptFlags |= OPTF_VAR_ADDRESS; + if (exp->mDecValue->mBase->IsReference() && (flags & ANAFL_ASSIGN)) + exp->mDecValue->mOptFlags |= OPTF_VAR_USED; if (exp->mDecValue->mType == DT_ARGUMENT && (flags & ANAFL_LHS)) { @@ -665,7 +668,12 @@ Declaration* GlobalOptimizer::Analyze(Expression* exp, Declaration* procDec, uin case EX_INITIALIZATION: case EX_ASSIGNMENT: if (exp->mToken == TK_ASSIGN) - ldec = Analyze(exp->mLeft, procDec, ANAFL_LHS | flags); + { + if (exp->mType == EX_ASSIGNMENT) + ldec = Analyze(exp->mLeft, procDec, ANAFL_LHS | ANAFL_ASSIGN | flags); + else + ldec = Analyze(exp->mLeft, procDec, ANAFL_LHS | flags); + } else ldec = Analyze(exp->mLeft, procDec, ANAFL_LHS | ANAFL_RHS | flags);