From 4efa88376c186e662673a5066bea724582b77ff7 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Sat, 22 Feb 2020 06:49:56 -0800 Subject: [PATCH] Fixed extension issue, fixed false dep from conversion operator --- IDEHelper/Backend/BeMCContext.cpp | 67 +++++++++++------------- IDEHelper/Compiler/BfModule.cpp | 2 +- IDEHelper/Compiler/BfModuleTypeUtils.cpp | 65 +++++++++++++---------- 3 files changed, 69 insertions(+), 65 deletions(-) diff --git a/IDEHelper/Backend/BeMCContext.cpp b/IDEHelper/Backend/BeMCContext.cpp index 63c42468..a62201e5 100644 --- a/IDEHelper/Backend/BeMCContext.cpp +++ b/IDEHelper/Backend/BeMCContext.cpp @@ -4208,7 +4208,7 @@ void BeMCContext::GenerateLiveness(BeMCBlock* block, BeVTrackingGenContext* genC genLivenessIdx++; auto inst = block->mInstructions[instIdx]; auto prevLiveness = inst->mLiveness; - + genCtx->mInstructions++; SizedArray removeVec; @@ -4463,21 +4463,14 @@ void BeMCContext::GenerateLiveness(BeMCBlock* block, BeVTrackingGenContext* genC if (newSuccLiveness == pred->mSuccLiveness) continue; pred->mSuccLiveness = newSuccLiveness; - - /*if (mVRegInitializedContext.HasExtraBitsSet(pred->mSuccVRegsInitialized.mBits, vregsInitialized.mBits)) - { - mVRegInitializedContext.MergeInplace(pred->mSuccVRegsInitialized.mBits, vregsInitialized.mBits); - }*/ - //if (mVRegInitializedContext.HasExtraEntries(pred->mSuccVRegsInitialized.mList, vregsInitialized.mList)) pred->mSuccVRegsInitialized = mVRegInitializedContext.Merge(pred->mSuccVRegsInitialized, vregsInitialized); if (pred->mBlockIdx > block->mBlockIdx) modifiedBlockAfter = true; else modifiedBlockBefore = true; - entry.mGenerateQueued = true; - //GenerateLiveness(pred, liveRegs, vregsInitialized, mcColorizer, livenessStats); + entry.mGenerateQueued = true; } } @@ -6169,14 +6162,14 @@ void BeMCContext::InitializedPassHelper(BeMCBlock* mcBlock, BeVTrackingGenContex genCtx->mInstructions++; mInsertInstIdxRef = &instIdx; - - auto inst = mcBlock->mInstructions[instIdx]; + auto inst = mcBlock->mInstructions[instIdx]; + inst->mVRegsInitialized = vregsInitialized; bool deepSet = false; if (inst->mKind == BeMCInstKind_LifetimeStart) - continue; + continue; SizedArray removeVec; SizedArray addVec; @@ -6608,19 +6601,21 @@ bool BeMCContext::DoInitializedPass() // If mPredVRegsInitialized is NULL, this blocks is unreachable. It could still be in some other block's preds so we don't // completely erase it, just empty it if (genCtx.mBlocks[mcBlock->mBlockIdx].mGenerateCount == 0) - { - //BF_ASSERT((blockIdx != 0) && (mcBlock->mPreds.size() == 0)); - mcBlock->mInstructions.Clear(); + { + // Unused block - clear almost all instructions + int newIdx = 0; +// for (int instIdx = 0; instIdx < (int)mcBlock->mInstructions.size(); instIdx++) +// { +// auto inst = mcBlock->mInstructions[instIdx]; +// if (inst->mKind == BeMCInstKind_ValueScopeHardEnd) +// { +// mcBlock->mInstructions[newIdx++] = inst; +// } +// } + mcBlock->mInstructions.mSize = newIdx; continue; } - - /*int vregIdx = -1; - while (true) - { - vregIdx = mVRegInitializedContext.GetNextSetIdx(mcBlock->mPredVRegsInitialized, vregIdx); - if (vregIdx == -1) - break;*/ - + for (int vregIdx : *mcBlock->mPredVRegsInitialized) { if (vregIdx >= mVRegInitializedContext.mNumItems) @@ -6637,8 +6632,6 @@ bool BeMCContext::DoInitializedPass() vregInfo->mHasAmbiguousInitialization = true; } } - - // } bool needsReRun = false; @@ -6762,21 +6755,15 @@ void BeMCContext::DoChainedBlockMerge() auto lastInst = mcBlock->mInstructions.back(); // Last instruction of current block is an unconditional branch to the next block if ((lastInst->mKind == BeMCInstKind_Br) && (lastInst->mArg0.mBlock == nextMcBlock)) - { - //auto itr = std::find(mcBlock->mSuccs.begin(), mcBlock->mSuccs.end(), nextMcBlock); - //mcBlock->mSuccs.erase(itr); + { mcBlock->mSuccs.Remove(nextMcBlock); for (auto succ : nextMcBlock->mSuccs) - { - //auto itr = std::find(mcBlock->mSuccs.begin(), mcBlock->mSuccs.end(), succ); - //if (itr == mcBlock->mSuccs.end()) + { if (!mcBlock->mSuccs.Contains(succ)) { mcBlock->mSuccs.push_back(succ); succ->mPreds.push_back(mcBlock); - } - /*itr = std::find(succ->mPreds.begin(), succ->mPreds.end(), nextMcBlock); - succ->mPreds.erase(itr);*/ + } succ->mPreds.Remove(nextMcBlock); } @@ -6869,6 +6856,7 @@ bool BeMCContext::CheckVRegEqualityRange(BeMCBlock* mcBlock, int instIdx, const for (int checkInstIdx = instIdx + 1; checkInstIdx < (int)mcBlock->mInstructions.size(); checkInstIdx++) { auto checkInst = mcBlock->mInstructions[checkInstIdx]; + if ((!IsLive(checkInst->mLiveness, vreg0.mVRegIdx, regRemaps)) || ((!onlyCheckFirstLifetime) && (!IsLive(checkInst->mLiveness, vreg1.mVRegIdx, regRemaps)))) { @@ -14705,7 +14693,7 @@ void BeMCContext::Generate(BeFunction* function) mDbgPreferredRegs[32] = X64Reg_R8;*/ //mDbgPreferredRegs[8] = X64Reg_RAX; - //mDebugging = function->mName == "?Hey@Blurg@bf@@SAXXZ"; + //mDebugging = function->mName == "?Unwrap@?$Result@Tint@@@System@bf@@AEAATint@@XZ"; //"?ColorizeCodeString@IDEUtils@IDE@bf@@SAXPEAVString@System@3@W4CodeKind@123@@Z"; //"?Main@Program@bf@@CAHPEAV?$Array1@PEAVString@System@bf@@@System@2@@Z"; @@ -14831,6 +14819,15 @@ void BeMCContext::Generate(BeFunction* function) { auto mcInst = AllocInst(); mcInst->mKind = BeMCInstKind_Unreachable; + +// if (instIdx == beBlock->mInstructions.size() - 1) +// { +// // Fake branch to exit +// mcInst = AllocInst(); +// mcInst->mKind = BeMCInstKind_Br; +// mcInst->mArg0 = BeMCOperand::FromBlock(mBlocks.back()); +// mcInst->mArg0.mBlock->AddPred(mcBlock); +// } } break; case BeEnsureInstructionAtInst::TypeId: diff --git a/IDEHelper/Compiler/BfModule.cpp b/IDEHelper/Compiler/BfModule.cpp index 9e180512..2440e03e 100644 --- a/IDEHelper/Compiler/BfModule.cpp +++ b/IDEHelper/Compiler/BfModule.cpp @@ -10884,7 +10884,7 @@ void BfModule::AddMethodReference(const BfMethodRef& methodRef, BfGetMethodInsta BfMethodRef methodRef = methodInstance; BfSpecializedMethodRefInfo* specializedMethodRefInfo = NULL; bool isNew = mCurTypeInstance->mSpecializedMethodReferences.TryAdd(methodRef, NULL, &specializedMethodRefInfo); - + if (((flags & BfGetMethodInstanceFlag_Unreified) == 0) && ((flags & BfGetMethodInstanceFlag_NoForceReification) == 0) && (mIsReified)) diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index 4296cee3..dba68d35 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -1579,10 +1579,15 @@ bool BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy (!typeInstance->mTypeFailed)) { for (auto baseTypeRef : typeDef->mBaseTypes) - { + { + auto declTypeDef = typeDef; + if (typeDef->mIsCombinedPartial) + declTypeDef = typeDef->mPartials.front(); + SetAndRestoreValue prevTypeDef(mContext->mCurTypeState->mCurTypeDef, declTypeDef); + SetAndRestoreValue prevTypeRef(mContext->mCurTypeState->mCurBaseTypeRef, baseTypeRef); // We ignore errors here to avoid double-errors for type lookups, but this is where data cycles are detected - // but that type of error supercedes the mIgnorErrors setting + // but that type of error supersedes the mIgnoreErrors setting SetAndRestoreValue prevIgnoreError(mIgnoreErrors, true); // Temporarily allow us to derive from private classes, to avoid infinite loop from TypeIsSubTypeOf SetAndRestoreValue prevSkipTypeProtectionChecks(typeInstance->mSkipTypeProtectionChecks, true); @@ -1966,8 +1971,21 @@ bool BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy if ((baseTypeInst != NULL) && (typeInstance->mBaseType == NULL)) { //curFieldDataIdx = 1; - if (!typeInstance->mTypeFailed) - PopulateType(baseTypeInst, BfPopulateType_Data); +// if (!typeInstance->mTypeFailed) +// PopulateType(baseTypeInst, BfPopulateType_Data); + + if (typeInstance->mTypeFailed) + { + if (baseTypeInst->IsDataIncomplete()) + { + if (baseTypeInst->IsStruct()) + baseTypeInst = ResolveTypeDef(mCompiler->mValueTypeTypeDef)->ToTypeInstance(); + else if (baseTypeInst->IsObject()) + baseTypeInst = ResolveTypeDef(mCompiler->mBfObjectTypeDef)->ToTypeInstance(); + } + } + PopulateType(baseTypeInst, BfPopulateType_Data); + typeInstance->mBaseTypeMayBeIncomplete = false; typeInstance->mMergedFieldDataCount = baseTypeInst->mMergedFieldDataCount; @@ -2846,7 +2864,14 @@ bool BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy BfHotTypeVersion* hotTypeVersion = new BfHotTypeVersion(); hotTypeVersion->mTypeId = typeInstance->mTypeId; if (typeInstance->mBaseType != NULL) - hotTypeVersion->mBaseType = typeInstance->mBaseType->mHotTypeData->GetLatestVersion(); + { + if (typeInstance->mBaseType->mHotTypeData != NULL) + hotTypeVersion->mBaseType = typeInstance->mBaseType->mHotTypeData->GetLatestVersion(); + else + { + AssertErrorState(); + } + } hotTypeVersion->mDeclHotCompileIdx = mCompiler->mOptions.mHotCompileIdx; if (mCompiler->IsHotCompile()) hotTypeVersion->mCommittedHotCompileIdx = -1; @@ -2855,7 +2880,7 @@ bool BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy hotTypeVersion->mRefCount++; typeInstance->mHotTypeData->mTypeVersions.Add(hotTypeVersion); - if (typeInstance->mBaseType != NULL) + if ((typeInstance->mBaseType != NULL) && (typeInstance->mBaseType->mHotTypeData != NULL)) { hotTypeVersion->mMembers.Add(typeInstance->mBaseType->mHotTypeData->GetLatestVersion()); } @@ -3442,12 +3467,7 @@ void BfModule::DoTypeInstanceMethodProcessing(BfTypeInstance* typeInstance) // Generate all methods. Pass 1 for (auto methodDef : typeDef->mMethods) - { - if (methodDef->mMethodType == BfMethodType_CtorClear) - { - NOP; - } - + { auto methodInstanceGroup = &typeInstance->mMethodInstanceGroups[methodDef->mIdx]; if (methodInstanceGroup->mOnDemandKind == BfMethodOnDemandKind_AlwaysInclude) @@ -4247,11 +4267,6 @@ void BfModule::AddMethodToWorkList(BfMethodInstance* methodInstance) BF_ASSERT(mBfIRBuilder != NULL); - if (methodInstance->mMethodDef->mName == "Hey") - { - NOP; - } - BfLogSysM("Adding to mMethodWorkList Module: %p IncompleteMethodCount: %d Type %p MethodInstance: %p Name:%s TypeRevision: %d ModuleRevision: %d ReqId:%d\n", this, mIncompleteMethodCount, typeInstance, methodInstance, methodInstance->mMethodDef->mName.c_str(), methodProcessRequest->mRevision, methodProcessRequest->mFromModuleRevision, methodProcessRequest->mReqId); if (mAwaitingFinish) @@ -6086,11 +6101,6 @@ BfTypeDef* BfModule::FindTypeDefRaw(const BfAtomComposite& findName, int numGene if (checkTypeInst == skipCheckBaseType) break; - if (checkTypeInst->mTypeDef == mCompiler->mNullableTypeDef) - { - NOP; - } - checkTypeInst = GetBaseType(checkTypeInst); allowPrivate = false; } @@ -7134,11 +7144,6 @@ BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType popula } } - if (typeRef->ToString() == "Issue.I?") - { - NOP; - } - BfResolvedTypeSet::LookupContext lookupCtx; lookupCtx.mRootTypeRef = typeRef; lookupCtx.mRootTypeDef = typeDef; @@ -9068,9 +9073,9 @@ BfIRValue BfModule::CastToValue(BfAstNode* srcNode, BfTypedValue typedVal, BfTyp mCompiler->mPassInstance->MoreInfo("See conversion operator", opMethodInstance->mMethodDef->GetRefNode()); } - BfModuleMethodInstance moduleMethodInstance = GetMethodInstance(opMethodInstance->GetOwner(), opMethodInstance->mMethodDef, BfTypeVector()); + BfMethodInstance* methodInstance = GetRawMethodInstance(opMethodInstance->GetOwner(), opMethodInstance->mMethodDef); - auto methodDeclaration = moduleMethodInstance.mMethodInstance->mMethodDef->GetMethodDeclaration(); + auto methodDeclaration = methodInstance->mMethodDef->GetMethodDeclaration(); if (methodDeclaration->mBody == NULL) { // Handle the typedPrim<->underlying part implicitly @@ -9098,6 +9103,8 @@ BfIRValue BfModule::CastToValue(BfAstNode* srcNode, BfTypedValue typedVal, BfTyp if (ignoreWrites) return mBfIRBuilder->GetFakeVal(); + BfModuleMethodInstance moduleMethodInstance = GetMethodInstance(opMethodInstance->GetOwner(), opMethodInstance->mMethodDef, BfTypeVector()); + SizedArray args; exprEvaluator.PushArg(castedFromValue, args); auto operatorOut = exprEvaluator.CreateCall(moduleMethodInstance.mMethodInstance, mCompiler->IsSkippingExtraResolveChecks() ? BfIRValue() : moduleMethodInstance.mFunc, false, args);