From 192c9d8f33c19cb2316bea911934c08f0d3691d1 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Mon, 19 May 2025 17:57:45 +0200 Subject: [PATCH] Fixed some nullable splat cases --- IDEHelper/Compiler/BfModule.cpp | 2 ++ IDEHelper/Compiler/BfStmtEvaluator.cpp | 7 ++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/IDEHelper/Compiler/BfModule.cpp b/IDEHelper/Compiler/BfModule.cpp index 3290988e..a732f66c 100644 --- a/IDEHelper/Compiler/BfModule.cpp +++ b/IDEHelper/Compiler/BfModule.cpp @@ -14159,6 +14159,8 @@ BfIRValue BfModule::ExtractValue(BfTypedValue typedValue, int dataIdx) auto addrVal = mBfIRBuilder->CreateInBoundsGEP(typedValue.mValue, 0, dataIdx); return mBfIRBuilder->CreateAlignedLoad(addrVal, typedValue.mType->mAlign); } + if (typedValue.IsSplat()) + typedValue = LoadOrAggregateValue(typedValue); return mBfIRBuilder->CreateExtractValue(typedValue.mValue, dataIdx); } diff --git a/IDEHelper/Compiler/BfStmtEvaluator.cpp b/IDEHelper/Compiler/BfStmtEvaluator.cpp index d18d015d..2e3342bf 100644 --- a/IDEHelper/Compiler/BfStmtEvaluator.cpp +++ b/IDEHelper/Compiler/BfStmtEvaluator.cpp @@ -1519,9 +1519,14 @@ BfLocalVariable* BfModule::HandleVariableDeclaration(BfVariableDeclaration* varD if (!resolvedType->IsNullable()) { if (initValue.IsAddr()) + { initValue = BfTypedValue(mBfIRBuilder->CreateInBoundsGEP(initValue.mValue, 0, 1), initValue.mType->GetUnderlyingType(), true); + } else + { + initValue = LoadOrAggregateValue(initValue); initValue = BfTypedValue(mBfIRBuilder->CreateExtractValue(initValue.mValue, 1), initValue.mType->GetUnderlyingType()); + } } if ((initValue) && (!initValue.mType->IsValuelessType())) @@ -1600,7 +1605,7 @@ BfLocalVariable* BfModule::HandleVariableDeclaration(BfVariableDeclaration* varD { auto nullableElementType = initValue.mType->GetUnderlyingType(); auto boolType = GetPrimitiveType(BfTypeCode_Boolean); - initValue = LoadValue(initValue); + initValue = LoadOrAggregateValue(initValue); exprEvaluator->mResult = BfTypedValue(mBfIRBuilder->CreateExtractValue(initValue.mValue, nullableElementType->IsValuelessType() ? 1 : 2), boolType); handledExprBoolResult = true; if (!nullableElementType->IsValuelessType())