Merge pull request #404 from lioncash/fold

constant_propagation_pass: Extend folding of sign-extension/zero-extension opcodes
This commit is contained in:
Merry 2018-10-07 16:40:11 +01:00 committed by MerryMage
commit 546cfbc0ee

View file

@ -113,6 +113,42 @@ void FoldOR(IR::Inst& inst, bool is_32_bit) {
inst.ReplaceUsesWith(lhs); inst.ReplaceUsesWith(lhs);
} }
} }
void FoldSignExtendXToWord(IR::Inst& inst) {
if (!inst.AreAllArgsImmediates()) {
return;
}
const s64 value = inst.GetArg(0).GetImmediateAsS64();
inst.ReplaceUsesWith(IR::Value{static_cast<u32>(value)});
}
void FoldSignExtendXToLong(IR::Inst& inst) {
if (!inst.AreAllArgsImmediates()) {
return;
}
const s64 value = inst.GetArg(0).GetImmediateAsS64();
inst.ReplaceUsesWith(IR::Value{static_cast<u64>(value)});
}
void FoldZeroExtendXToWord(IR::Inst& inst) {
if (!inst.AreAllArgsImmediates()) {
return;
}
const u64 value = inst.GetArg(0).GetImmediateAsU64();
inst.ReplaceUsesWith(IR::Value{static_cast<u32>(value)});
}
void FoldZeroExtendXToLong(IR::Inst& inst) {
if (!inst.AreAllArgsImmediates()) {
return;
}
const u64 value = inst.GetArg(0).GetImmediateAsU64();
inst.ReplaceUsesWith(IR::Value{value});
}
} // Anonymous namespace } // Anonymous namespace
void ConstantPropagation(IR::Block& block) { void ConstantPropagation(IR::Block& block) {
@ -154,24 +190,24 @@ void ConstantPropagation(IR::Block& block) {
case IR::Opcode::Not64: case IR::Opcode::Not64:
FoldNOT(inst, opcode == IR::Opcode::Not32); FoldNOT(inst, opcode == IR::Opcode::Not32);
break; break;
case IR::Opcode::ZeroExtendByteToWord: { case IR::Opcode::SignExtendByteToWord:
if (!inst.AreAllArgsImmediates()) case IR::Opcode::SignExtendHalfToWord:
FoldSignExtendXToWord(inst);
break; break;
case IR::Opcode::SignExtendByteToLong:
u8 byte = inst.GetArg(0).GetU8(); case IR::Opcode::SignExtendHalfToLong:
u32 value = static_cast<u32>(byte); case IR::Opcode::SignExtendWordToLong:
inst.ReplaceUsesWith(IR::Value{value}); FoldSignExtendXToLong(inst);
break; break;
} case IR::Opcode::ZeroExtendByteToWord:
case IR::Opcode::ZeroExtendHalfToWord: { case IR::Opcode::ZeroExtendHalfToWord:
if (!inst.AreAllArgsImmediates()) FoldZeroExtendXToWord(inst);
break; break;
case IR::Opcode::ZeroExtendByteToLong:
u16 half = inst.GetArg(0).GetU16(); case IR::Opcode::ZeroExtendHalfToLong:
u32 value = static_cast<u32>(half); case IR::Opcode::ZeroExtendWordToLong:
inst.ReplaceUsesWith(IR::Value{value}); FoldZeroExtendXToLong(inst);
break; break;
}
default: default:
break; break;
} }