From 34fe56dfb24cec11bc5337e9f6f1aed9b45ddabb Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Mon, 6 May 2024 16:14:17 -0400 Subject: [PATCH] DeadStoreElimination: CSE block info Signed-off-by: Alyssa Rosenzweig --- .../IR/Passes/DeadStoreElimination.cpp | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/FEXCore/Source/Interface/IR/Passes/DeadStoreElimination.cpp b/FEXCore/Source/Interface/IR/Passes/DeadStoreElimination.cpp index 531de0062..a3f921f5a 100644 --- a/FEXCore/Source/Interface/IR/Passes/DeadStoreElimination.cpp +++ b/FEXCore/Source/Interface/IR/Passes/DeadStoreElimination.cpp @@ -88,38 +88,30 @@ bool DeadStoreElimination::Run(IREmitter* IREmit) { // This is conservative and doesn't try to be smart about loads after writes { for (auto [BlockNode, BlockIROp] : CurrentIR.GetBlocks()) { + auto& BlockInfo = InfoMap[BlockNode]; + for (auto [CodeNode, IROp] : CurrentIR.GetCode(BlockNode)) { if (IROp->Op == OP_STOREFLAG) { auto Op = IROp->C(); - auto& BlockInfo = InfoMap[BlockNode]; - BlockInfo.flag.writes |= 1UL << Op->Flag; } else if (IROp->Op == OP_INVALIDATEFLAGS) { auto Op = IROp->C(); - auto& BlockInfo = InfoMap[BlockNode]; - BlockInfo.flag.writes |= Op->Flags; } else if (IROp->Op == OP_LOADFLAG) { auto Op = IROp->C(); - auto& BlockInfo = InfoMap[BlockNode]; - BlockInfo.flag.reads |= 1UL << Op->Flag; } else if (IROp->Op == OP_LOADDF) { - auto& BlockInfo = InfoMap[BlockNode]; - BlockInfo.flag.reads |= 1UL << X86State::RFLAG_DF_RAW_LOC; } else if (IROp->Op == OP_STOREREGISTER) { auto Op = IROp->C(); - auto& BlockInfo = InfoMap[BlockNode]; BlockInfo.gpr.writes |= GPRBit(Op->Class, Op->Reg); BlockInfo.fpr.writes |= FPRBit(Op->Class, Op->Reg); } else if (IROp->Op == OP_LOADREGISTER) { auto Op = IROp->C(); - auto& BlockInfo = InfoMap[BlockNode]; BlockInfo.gpr.reads |= GPRBit(Op->Class, Op->Reg); BlockInfo.fpr.reads |= FPRBit(Op->Class, Op->Reg); @@ -184,12 +176,12 @@ bool DeadStoreElimination::Run(IREmitter* IREmit) { // Remove the dead stores { for (auto [BlockNode, BlockIROp] : CurrentIR.GetBlocks()) { + auto& BlockInfo = InfoMap[BlockNode]; + for (auto [CodeNode, IROp] : CurrentIR.GetCode(BlockNode)) { if (IROp->Op == OP_STOREFLAG) { auto Op = IROp->C(); - auto& BlockInfo = InfoMap[BlockNode]; - // If this StoreFlag is never read, remove it if (BlockInfo.flag.kill & (1UL << Op->Flag)) { IREmit->Remove(CodeNode); @@ -197,7 +189,6 @@ bool DeadStoreElimination::Run(IREmitter* IREmit) { } } else if (IROp->Op == OP_STOREREGISTER) { auto Op = IROp->C(); - auto& BlockInfo = InfoMap[BlockNode]; // If this OP_STOREREGISTER is never read, remove it if ((BlockInfo.gpr.kill & GPRBit(Op->Class, Op->Reg)) || (BlockInfo.fpr.kill & FPRBit(Op->Class, Op->Reg))) {