From 2fbf22a9de361dcd604be465046cf56207828256 Mon Sep 17 00:00:00 2001 From: Stefanos Kornilios Mitsis Poiitidis Date: Fri, 25 Dec 2020 15:03:15 +0200 Subject: [PATCH] Hotfix: Disable ConstProp/RemoveUselessMasking, add a test for it --- .../Source/Interface/IR/Passes/ConstProp.cpp | 38 ++++++++++--------- unittests/ASM/Primary/Primary_84_2.asm | 24 ++++++++++++ 2 files changed, 45 insertions(+), 17 deletions(-) create mode 100644 unittests/ASM/Primary/Primary_84_2.asm diff --git a/External/FEXCore/Source/Interface/IR/Passes/ConstProp.cpp b/External/FEXCore/Source/Interface/IR/Passes/ConstProp.cpp index 3b5a537d5..7a6582c32 100644 --- a/External/FEXCore/Source/Interface/IR/Passes/ConstProp.cpp +++ b/External/FEXCore/Source/Interface/IR/Passes/ConstProp.cpp @@ -115,26 +115,30 @@ std::tuple MemExtendedAddres } OrderedNodeWrapper RemoveUselessMasking(IREmitter *IREmit, OrderedNodeWrapper src, uint64_t mask) { - auto IROp = IREmit->GetOpHeader(src); - if (IROp->Op == OP_AND) { - auto Op = IROp->C(); - uint64_t imm; - if (IREmit->IsValueConstant(IROp->Args[1], &imm) && ((imm & mask) == mask)) { - return RemoveUselessMasking(IREmit, IROp->Args[0], mask); - } - } else if (IROp->Op == OP_BFE) { - auto Op = IROp->C(); - if (Op->lsb == 0) { - uint64_t imm = 1ULL << (Op->Width-1); - imm = (imm-1) *2 + 1; - - if ((imm & mask) == mask) { + #if 1 // HOTFIX: We need to clear up the meaning of opsize and dest size. See #594 + return src; + #else + auto IROp = IREmit->GetOpHeader(src); + if (IROp->Op == OP_AND) { + auto Op = IROp->C(); + uint64_t imm; + if (IREmit->IsValueConstant(IROp->Args[1], &imm) && ((imm & mask) == mask)) { return RemoveUselessMasking(IREmit, IROp->Args[0], mask); } - } - } + } else if (IROp->Op == OP_BFE) { + auto Op = IROp->C(); + if (Op->lsb == 0) { + uint64_t imm = 1ULL << (Op->Width-1); + imm = (imm-1) *2 + 1; - return src; + if ((imm & mask) == mask) { + return RemoveUselessMasking(IREmit, IROp->Args[0], mask); + } + } + } + + return src; + #endif } bool IsBfeAlreadyDone(IREmitter *IREmit, OrderedNodeWrapper src, uint64_t Width) { diff --git a/unittests/ASM/Primary/Primary_84_2.asm b/unittests/ASM/Primary/Primary_84_2.asm new file mode 100644 index 000000000..3dfaee501 --- /dev/null +++ b/unittests/ASM/Primary/Primary_84_2.asm @@ -0,0 +1,24 @@ +%ifdef CONFIG +{ + "RegData": { + "RAX": "0x0" + }, + "MemoryRegions": { + "0x100000000": "4096" + } +} +%endif + +mov rdx, 0xe0000000 +mov dword [rdx], 0xFFFFFF00 + +mov r11d, dword[rdx] +test r11b, r11b +jnz notzero + +mov rax, 0x0 +hlt + +notzero: +mov rax, 0x1 +hlt \ No newline at end of file