From 2f12fd6ee472349987b3edd7d2fb79b47ca988bf Mon Sep 17 00:00:00 2001 From: Stefanos Kornilios Mitsis Poiitidis Date: Thu, 3 Dec 2020 19:39:56 +0200 Subject: [PATCH] ConstProp: LoadMem/StoreMem imm pooling If imms used in memops are close enough, generate them with address gen instead of allocating a new const --- .../Source/Interface/IR/Passes/ConstProp.cpp | 29 ++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/External/FEXCore/Source/Interface/IR/Passes/ConstProp.cpp b/External/FEXCore/Source/Interface/IR/Passes/ConstProp.cpp index fce4a4e77..dd9cf9f52 100644 --- a/External/FEXCore/Source/Interface/IR/Passes/ConstProp.cpp +++ b/External/FEXCore/Source/Interface/IR/Passes/ConstProp.cpp @@ -197,8 +197,35 @@ bool ConstProp::Run(IREmitter *IREmit) { } } - for (auto [CodeNode, IROp] : CurrentIR.GetAllCode()) { + + // LoadMem / StoreMem imm pooling + // If imms are close by, use address gen to generate the values instead of using a new imm + std::map Consts; + for (auto [BlockNode, BlockIROp] : CurrentIR.GetBlocks()) { + for (auto [CodeNode, IROp] : CurrentIR.GetCode(BlockNode)) { + if (IROp->Op == OP_LOADMEM || IROp->Op == OP_STOREMEM) { + uint64_t Addr; + if (IREmit->IsValueConstant(IROp->Args[0], &Addr) && IROp->Args[1].IsInvalid()) { + for (auto& Const: Consts) { + if ((Addr - Const.second) < 65536) { + IREmit->ReplaceNodeArgument(CodeNode, 0, Const.first); + IREmit->ReplaceNodeArgument(CodeNode, 1, IREmit->_Constant(Addr - Const.second)); + goto doneOp; + } + } + + Consts[IREmit->UnwrapNode(IROp->Args[0])] = Addr; + } + doneOp: + ; + } + IREmit->SetWriteCursor(CodeNode); + } + Consts.clear(); + } + + for (auto [CodeNode, IROp] : CurrentIR.GetAllCode()) { switch (IROp->Op) { /* case OP_UMUL: