diff --git a/src/shader_recompiler/ir/ir_emitter.cpp b/src/shader_recompiler/ir/ir_emitter.cpp
index ce809514..a7edb6d9 100644
--- a/src/shader_recompiler/ir/ir_emitter.cpp
+++ b/src/shader_recompiler/ir/ir_emitter.cpp
@@ -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);
diff --git a/src/shader_recompiler/ir/passes/constant_propagation_pass.cpp b/src/shader_recompiler/ir/passes/constant_propagation_pass.cpp
index 87a06933..53cb35a7 100644
--- a/src/shader_recompiler/ir/passes/constant_propagation_pass.cpp
+++ b/src/shader_recompiler/ir/passes/constant_propagation_pass.cpp
@@ -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;