diff --git a/External/FEXCore/Source/Interface/Core/Core.cpp b/External/FEXCore/Source/Interface/Core/Core.cpp index 7774f87cc..2923436f7 100644 --- a/External/FEXCore/Source/Interface/Core/Core.cpp +++ b/External/FEXCore/Source/Interface/Core/Core.cpp @@ -424,7 +424,7 @@ namespace FEXCore::Context { Thread->State.ThreadManager.TID = ++ThreadID; } - Thread->OpDispatcher = std::make_unique(); + Thread->OpDispatcher = std::make_unique(this); Thread->OpDispatcher->SetMultiblock(Config.Multiblock); Thread->BlockCache = std::make_unique(this); Thread->CTX = this; diff --git a/External/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp b/External/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp index b3ab6f009..2171c10cb 100644 --- a/External/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp +++ b/External/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp @@ -3383,8 +3383,9 @@ void OpDispatchBuilder::StoreResult(FEXCore::IR::RegisterClassType Class, FEXCor StoreResult(Class, Op, Op->Dest, Src, Align); } -OpDispatchBuilder::OpDispatchBuilder() - : Data {8 * 1024 * 1024} +OpDispatchBuilder::OpDispatchBuilder(FEXCore::Context::Context *ctx) + : CTX {ctx} + , Data {8 * 1024 * 1024} , ListData {8 * 1024 * 1024} { ResetWorkingList(); } @@ -5091,6 +5092,18 @@ void OpDispatchBuilder::ReplaceAllUsesWithInclusive(OrderedNode *Node, OrderedNo } } +void OpDispatchBuilder::ReplaceNodeArgument(OrderedNode *Node, uint8_t Arg, OrderedNode *NewArg) { + uintptr_t ListBegin = ListData.Begin(); + uintptr_t DataBegin = Data.Begin(); + + FEXCore::IR::IROp_Header *IROp = Node->Op(DataBegin); + OrderedNodeWrapper OldArgWrapper = IROp->Args[Arg]; + OrderedNode *OldArg = OldArgWrapper.GetNode(ListBegin); + OldArg->RemoveUse(); + NewArg->AddUse(); + IROp->Args[Arg].NodeOffset = NewArg->Wrapped(ListBegin).NodeOffset; +} + void OpDispatchBuilder::RemoveArgUses(OrderedNode *Node) { uintptr_t ListBegin = ListData.Begin(); uintptr_t DataBegin = Data.Begin(); diff --git a/External/FEXCore/Source/Interface/Core/OpcodeDispatcher.h b/External/FEXCore/Source/Interface/Core/OpcodeDispatcher.h index 70a502ea0..0cf253284 100644 --- a/External/FEXCore/Source/Interface/Core/OpcodeDispatcher.h +++ b/External/FEXCore/Source/Interface/Core/OpcodeDispatcher.h @@ -22,7 +22,7 @@ class OpDispatchBuilder final { friend class FEXCore::IR::Pass; friend class FEXCore::IR::PassManager; public: - + FEXCore::Context::Context *CTX{}; bool ShouldDump {false}; struct JumpTargetInfo { @@ -81,7 +81,7 @@ public: return false; } - OpDispatchBuilder(); + OpDispatchBuilder(FEXCore::Context::Context *ctx); IRListView ViewIR() { return IRListView(&Data, &ListData); } IRListView *CreateIRCopy() { return new IRListView(&Data, &ListData); } @@ -544,6 +544,10 @@ public: return _PhiValue(Value, Block, InvalidNode); } + OrderedNode *Invalid() { + return InvalidNode; + } + void AddPhiValue(IR::IROp_Phi *Phi, OrderedNode *Value) { // Got to do some bookkeeping first Value->AddUse(); @@ -640,10 +644,10 @@ public: } void ReplaceAllUsesWithInclusive(OrderedNode *Node, OrderedNode *NewNode, IR::NodeWrapperIterator After, IR::NodeWrapperIterator End); + void ReplaceNodeArgument(OrderedNode *Node, uint8_t Arg, OrderedNode *NewArg); void Remove(OrderedNode *Node); - void SetPackedRFLAG(bool Lower8, OrderedNode *Src); OrderedNode *GetPackedRFLAG(bool Lower8); diff --git a/External/FEXCore/Source/Interface/IR/Passes/IRCompaction.cpp b/External/FEXCore/Source/Interface/IR/Passes/IRCompaction.cpp index f1566f523..0b95bdc01 100644 --- a/External/FEXCore/Source/Interface/IR/Passes/IRCompaction.cpp +++ b/External/FEXCore/Source/Interface/IR/Passes/IRCompaction.cpp @@ -15,7 +15,8 @@ private: std::vector OldToNewRemap; }; -IRCompaction::IRCompaction() { +IRCompaction::IRCompaction() + : LocalBuilder {nullptr} { OldToNewRemap.resize(9000); }