fix: 消除用于自我赋值的冗余移动指令

This commit is contained in:
Luke 2025-06-13 10:42:14 +08:00
parent 91bc1f15cc
commit 616d361c9d

View File

@ -78,7 +78,7 @@ public class InstructionFactory {
} }
/** /**
* 简易 Move 指令src dest若寄存器相同也安全 * Move 指令src dest若寄存器相同也安全
* <p> * <p>
* 实现方式dest = src + 0即加上常量 0 * 实现方式dest = src + 0即加上常量 0
* </p> * </p>
@ -88,7 +88,11 @@ public class InstructionFactory {
* @param dest 目标寄存器 * @param dest 目标寄存器
*/ */
public static void move(IRContext ctx, IRVirtualRegister src, IRVirtualRegister dest) { public static void move(IRContext ctx, IRVirtualRegister src, IRVirtualRegister dest) {
/* 采用 “dest = src + 0” 的最简实现 */ // 自赋值无需任何操作避免生成多余的常量 0 寄存器
if (src == dest) {
return;
}
// 回退实现dest = src + 0
IRVirtualRegister zero = loadConst(ctx, 0); IRVirtualRegister zero = loadConst(ctx, 0);
ctx.addInstruction(new BinaryOperationInstruction(IROpCode.ADD_I32, dest, src, zero)); ctx.addInstruction(new BinaryOperationInstruction(IROpCode.ADD_I32, dest, src, zero));
} }