Optimise out unnecessary shifts (#1021)

This commit is contained in:
korenkonder 2024-09-22 15:02:20 +03:00 committed by GitHub
parent a73b5c3e02
commit 126b2c30bd
2 changed files with 18 additions and 0 deletions

View file

@ -1079,6 +1079,10 @@ U32 IREmitter::IAbs(const U32& value) {
}
U32U64 IREmitter::ShiftLeftLogical(const U32U64& base, const U32& shift) {
if (shift.IsImmediate() && shift.U32() == 0) {
return base;
}
switch (base.Type()) {
case Type::U32:
return Inst<U32>(Opcode::ShiftLeftLogical32, base, shift);
@ -1090,6 +1094,10 @@ U32U64 IREmitter::ShiftLeftLogical(const U32U64& base, const U32& shift) {
}
U32U64 IREmitter::ShiftRightLogical(const U32U64& base, const U32& shift) {
if (shift.IsImmediate() && shift.U32() == 0) {
return base;
}
switch (base.Type()) {
case Type::U32:
return Inst<U32>(Opcode::ShiftRightLogical32, base, shift);
@ -1101,6 +1109,10 @@ U32U64 IREmitter::ShiftRightLogical(const U32U64& base, const U32& shift) {
}
U32U64 IREmitter::ShiftRightArithmetic(const U32U64& base, const U32& shift) {
if (shift.IsImmediate() && shift.U32() == 0) {
return base;
}
switch (base.Type()) {
case Type::U32:
return Inst<U32>(Opcode::ShiftRightArithmetic32, base, shift);

View file

@ -278,6 +278,12 @@ void ConstantPropagation(IR::Block& block, IR::Inst& inst) {
case IR::Opcode::FPCmpClass32:
FoldCmpClass(inst);
return;
case IR::Opcode::ShiftLeftLogical32:
FoldWhenAllImmediates(inst, [](u32 a, u32 b) { return static_cast<u32>(a << b); });
return;
case IR::Opcode::ShiftRightLogical32:
FoldWhenAllImmediates(inst, [](u32 a, u32 b) { return static_cast<u32>(a >> b); });
return;
case IR::Opcode::ShiftRightArithmetic32:
FoldWhenAllImmediates(inst, [](s32 a, s32 b) { return static_cast<u32>(a >> b); });
return;