constant_propagation_pass: Fold OR operations
This commit is contained in:
parent
898d096e39
commit
8013548bbb
1 changed files with 32 additions and 0 deletions
|
@ -76,6 +76,34 @@ void FoldEOR(IR::Inst& inst, bool is_32_bit) {
|
||||||
inst.ReplaceUsesWith(lhs);
|
inst.ReplaceUsesWith(lhs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Folds OR operations based on the following:
|
||||||
|
//
|
||||||
|
// 1. imm_x | imm_y -> result
|
||||||
|
// 2. x | 0 -> x
|
||||||
|
// 3. 0 | y -> y
|
||||||
|
//
|
||||||
|
void FoldOR(IR::Inst& inst, bool is_32_bit) {
|
||||||
|
const auto lhs = inst.GetArg(0);
|
||||||
|
const auto rhs = inst.GetArg(1);
|
||||||
|
|
||||||
|
const bool is_lhs_immediate = lhs.IsImmediate();
|
||||||
|
const bool is_rhs_immediate = rhs.IsImmediate();
|
||||||
|
|
||||||
|
if (is_lhs_immediate && is_rhs_immediate) {
|
||||||
|
const u64 result = lhs.GetImmediateAsU64() | rhs.GetImmediateAsU64();
|
||||||
|
|
||||||
|
if (is_32_bit) {
|
||||||
|
inst.ReplaceUsesWith(IR::Value{static_cast<u32>(result)});
|
||||||
|
} else {
|
||||||
|
inst.ReplaceUsesWith(IR::Value{result});
|
||||||
|
}
|
||||||
|
} else if (is_lhs_immediate && lhs.GetImmediateAsU64() == 0) {
|
||||||
|
inst.ReplaceUsesWith(rhs);
|
||||||
|
} else if (is_rhs_immediate && rhs.GetImmediateAsU64() == 0) {
|
||||||
|
inst.ReplaceUsesWith(lhs);
|
||||||
|
}
|
||||||
|
}
|
||||||
} // Anonymous namespace
|
} // Anonymous namespace
|
||||||
|
|
||||||
void ConstantPropagation(IR::Block& block) {
|
void ConstantPropagation(IR::Block& block) {
|
||||||
|
@ -109,6 +137,10 @@ void ConstantPropagation(IR::Block& block) {
|
||||||
case IR::Opcode::Eor64:
|
case IR::Opcode::Eor64:
|
||||||
FoldEOR(inst, opcode == IR::Opcode::Eor32);
|
FoldEOR(inst, opcode == IR::Opcode::Eor32);
|
||||||
break;
|
break;
|
||||||
|
case IR::Opcode::Or32:
|
||||||
|
case IR::Opcode::Or64:
|
||||||
|
FoldOR(inst, opcode == IR::Opcode::Or32);
|
||||||
|
break;
|
||||||
case IR::Opcode::ZeroExtendByteToWord: {
|
case IR::Opcode::ZeroExtendByteToWord: {
|
||||||
if (!inst.AreAllArgsImmediates())
|
if (!inst.AreAllArgsImmediates())
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in a new issue