constant_propagation_pass: Handle GetCarryFromOp for MostSignificantWord

This commit is contained in:
MerryMage 2019-07-28 20:54:46 +01:00
parent ada66d7092
commit 39bd2c034d
3 changed files with 50 additions and 0 deletions

View file

@ -158,11 +158,16 @@ void FoldMostSignificantBit(IR::Inst& inst) {
}
void FoldMostSignificantWord(IR::Inst& inst) {
IR::Inst* carry_inst = inst.GetAssociatedPseudoOperation(IR::Opcode::GetCarryFromOp);
if (!inst.AreAllArgsImmediates()) {
return;
}
const auto operand = inst.GetArg(0);
if (carry_inst) {
carry_inst->ReplaceUsesWith(IR::Value{Common::Bit<31>(operand.GetImmediateAsU64())});
}
inst.ReplaceUsesWith(IR::Value{static_cast<u32>(operand.GetImmediateAsU64() >> 32)});
}