From 63e51ec4d8af17596df8dee04c20474d3dc16d68 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Mon, 4 May 2020 09:11:36 -0700 Subject: [PATCH] Reworking some lowering logic --- IDEHelper/Compiler/BfExprEvaluator.cpp | 4 +- IDEHelper/Compiler/BfResolvedTypeUtils.cpp | 44 +++++++++++++++------- 2 files changed, 32 insertions(+), 16 deletions(-) diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index 12550169..764b32a6 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -4955,7 +4955,7 @@ void BfExprEvaluator::PushThis(BfAstNode* targetSrc, BfTypedValue argVal, BfMeth if (argVal.mType->IsValuelessType()) return; - if ((argVal.mType->IsTypedPrimitive()) && (!methodInstance->AllowsThisSplatting())) + if (!methodInstance->AllowsThisSplatting()) { argVal = mModule->MakeAddressable(argVal); irArgs.push_back(argVal.mValue); @@ -5010,7 +5010,7 @@ BfTypedValue BfExprEvaluator::CreateCall(BfAstNode* targetSrc, const BfTypedValu if (!mModule->mCompiler->mIsResolveOnly) sCallIdx++; int callIdx = sCallIdx; - if (callIdx == 7462) + if (callIdx == 44) { NOP; } diff --git a/IDEHelper/Compiler/BfResolvedTypeUtils.cpp b/IDEHelper/Compiler/BfResolvedTypeUtils.cpp index 7214add6..f3cba8a8 100644 --- a/IDEHelper/Compiler/BfResolvedTypeUtils.cpp +++ b/IDEHelper/Compiler/BfResolvedTypeUtils.cpp @@ -940,7 +940,33 @@ void BfMethodInstance::GetIRFunctionInfo(BfModule* module, BfIRType& returnType, checkType = GetParamType(paramIdx); } - if ((paramIdx != -1) || (!mMethodDef->mNoSplat && !mMethodDef->mIsMutating)) + + bool checkLowered = false; + bool doSplat = false; + if (paramIdx == -1) + { + if ((checkType->IsSplattable()) && (AllowsThisSplatting())) + { + doSplat = true; + } + else if (!mMethodDef->mIsMutating) + checkLowered = true; + } + else + { + if (checkType->IsMethodRef()) + { + doSplat = true; + } + else if ((checkType->IsSplattable()) && (AllowsSplatting())) + { + doSplat = true; + } + else + checkLowered = true; + } + + if (checkLowered) { auto loweredTypeCode = checkType->GetLoweredType(); if (loweredTypeCode != BfTypeCode_None) @@ -960,20 +986,10 @@ void BfMethodInstance::GetIRFunctionInfo(BfModule* module, BfIRType& returnType, module->PopulateType(checkType, BfPopulateType_Data); if ((checkType->IsValuelessType()) && (!checkType->IsMethodRef())) continue; - - bool doSplat = false; - if (checkType->IsMethodRef()) + + if (doSplat) { - doSplat = true; - } - else if (mMethodDef->mNoSplat) - { - doSplat = false; - } - else if ((paramIdx == -1) ? AllowsThisSplatting() : AllowsSplatting()) - { - int splatCount = checkType->GetSplatCount(); - doSplat = ((checkType->IsSplattable()) && ((paramIdx != -1) || (!mMethodDef->mIsMutating))); + int splatCount = checkType->GetSplatCount(); if ((int)paramTypes.size() + splatCount > module->mCompiler->mOptions.mMaxSplatRegs) { auto checkTypeInst = checkType->ToTypeInstance();