Hotfix: Disable ConstProp/RemoveUselessMasking, add a test for it

This commit is contained in:
Stefanos Kornilios Mitsis Poiitidis committed 2020-12-25 15:04:27 +02:00
1 parent ef75b8e4ec
commit 2fbf22a9de
2 files changed
+45 -17

No files matched your search

+21 -17
View File
@@ -115,26 +115,30 @@ std::tuple<MemOffsetType, uint8_t, OrderedNode*, OrderedNode*> MemExtendedAddres
}
OrderedNodeWrapper RemoveUselessMasking(IREmitter *IREmit, OrderedNodeWrapper src, uint64_t mask) {
auto IROp = IREmit->GetOpHeader(src);
if (IROp->Op == OP_AND) {
auto Op = IROp->C<IR::IROp_And>();
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<IR::IROp_Bfe>();
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<IR::IROp_And>();
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<IR::IROp_Bfe>();
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) {
+24
View File
@@ -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