MachineFunctionPass::getAnalysisUsage(AU);
}
+/// Check whether an instruction \p MI is dead: it only defines dead virtual
+/// registers, and doesn't have other side effects.
+static bool isTriviallyDead(const MachineInstr &MI,
+ const MachineRegisterInfo &MRI) {
+ // If we can move an instruction, we can remove it. Otherwise, it has
+ // a side-effect of some sort.
+ bool SawStore = false;
+ if (!MI.isSafeToMove(/*AA=*/nullptr, SawStore))
+ return false;
+
+ // Instructions without side-effects are dead iff they only define dead vregs.
+ for (auto &MO : MI.operands()) {
+ if (!MO.isReg() || !MO.isDef())
+ continue;
+
+ unsigned Reg = MO.getReg();
+ // Keep Debug uses live: we don't want to have an effect on debug info.
+ if (TargetRegisterInfo::isPhysicalRegister(Reg) || !MRI.use_empty(Reg))
+ return false;
+ }
+ return true;
+}
+
bool InstructionSelect::runOnMachineFunction(MachineFunction &MF) {
const MachineRegisterInfo &MRI = MF.getRegInfo();
DEBUG(dbgs() << "Selecting: \n " << MI);
+ // We could have folded this instruction away already, making it dead.
+ // If so, erase it.
+ if (isTriviallyDead(MI, MRI)) {
+ DEBUG(dbgs() << "Is dead; erasing.\n");
+ MI.eraseFromParent();
+ continue;
+ }
+
if (!ISel->select(MI)) {
// FIXME: It would be nice to dump all inserted instructions. It's
// not obvious how, esp. considering select() can insert after MI.
%0(s32) = COPY %w0
%1(s32) = COPY %w1
%2(s32) = G_ADD %0, %1
+ %w0 = COPY %2(s32)
...
---
%0(s64) = COPY %x0
%1(s64) = COPY %x1
%2(s64) = G_ADD %0, %1
+ %x0 = COPY %2(s64)
...
---
# CHECK: registers:
# CHECK-NEXT: - { id: 0, class: gpr32sp }
-# CHECK-NEXT: - { id: 1, class: gpr32 }
+# CHECK-NEXT: - { id: 1, class: gpr }
# CHECK-NEXT: - { id: 2, class: gpr32sp }
registers:
- { id: 0, class: gpr }
%0(s32) = COPY %w0
%1(s32) = G_CONSTANT i32 1
%2(s32) = G_ADD %0, %1
+ %w0 = COPY %2(s32)
...
---
# CHECK: registers:
# CHECK-NEXT: - { id: 0, class: gpr64sp }
-# CHECK-NEXT: - { id: 1, class: gpr64 }
+# CHECK-NEXT: - { id: 1, class: gpr }
# CHECK-NEXT: - { id: 2, class: gpr64sp }
registers:
- { id: 0, class: gpr }
%0(s64) = COPY %x0
%1(s64) = G_CONSTANT i32 1
%2(s64) = G_ADD %0, %1
+ %x0 = COPY %2(s64)
...
---
# CHECK: registers:
# CHECK-NEXT: - { id: 0, class: gpr32sp }
-# CHECK-NEXT: - { id: 1, class: gpr32 }
+# CHECK-NEXT: - { id: 1, class: gpr }
# CHECK-NEXT: - { id: 2, class: gpr32sp }
registers:
- { id: 0, class: gpr }
bb.1:
%2(s32) = G_ADD %0, %1
+ %w0 = COPY %2(s32)
...
---
%0(s32) = COPY %w0
%1(s32) = COPY %w1
%2(s32) = G_SUB %0, %1
+ %w0 = COPY %2(s32)
...
---
%0(s64) = COPY %x0
%1(s64) = COPY %x1
%2(s64) = G_SUB %0, %1
+ %x0 = COPY %2(s64)
...
---
%0(s32) = COPY %w0
%1(s32) = COPY %w1
%2(s32) = G_OR %0, %1
+ %w0 = COPY %2(s32)
...
---
%0(s64) = COPY %x0
%1(s64) = COPY %x1
%2(s64) = G_OR %0, %1
+ %x0 = COPY %2(s64)
...
---
%0(<2 x s32>) = COPY %d0
%1(<2 x s32>) = COPY %d1
%2(<2 x s32>) = G_OR %0, %1
+ %d0 = COPY %2(<2 x s32>)
...
---
%0(s32) = COPY %w0
%1(s32) = COPY %w1
%2(s32) = G_AND %0, %1
+ %w0 = COPY %2(s32)
...
---
%0(s64) = COPY %x0
%1(s64) = COPY %x1
%2(s64) = G_AND %0, %1
+ %x0 = COPY %2(s64)
...
---
%0(s32) = COPY %w0
%1(s32) = COPY %w1
%2(s32) = G_SHL %0, %1
+ %w0 = COPY %2(s32)
...
---
%0(s64) = COPY %x0
%1(s64) = COPY %x1
%2(s64) = G_SHL %0, %1
+ %x0 = COPY %2(s64)
...
---
%0(s32) = COPY %w0
%1(s32) = COPY %w1
%2(s32) = G_LSHR %0, %1
+ %w0 = COPY %2(s32)
...
---
%0(s64) = COPY %x0
%1(s64) = COPY %x1
%2(s64) = G_LSHR %0, %1
+ %x0 = COPY %2(s64)
...
---
%0(s32) = COPY %w0
%1(s32) = COPY %w1
%2(s32) = G_ASHR %0, %1
+ %w0 = COPY %2(s32)
...
---
%0(s64) = COPY %x0
%1(s64) = COPY %x1
%2(s64) = G_ASHR %0, %1
+ %x0 = COPY %2(s64)
...
---
%0(s32) = COPY %w0
%1(s32) = COPY %w1
%2(s32) = G_MUL %0, %1
+ %w0 = COPY %2(s32)
...
---
%0(s64) = COPY %x0
%1(s64) = COPY %x1
%2(s64) = G_MUL %0, %1
+ %x0 = COPY %2(s64)
...
---
%1:gpr(s64) = COPY %x1
%2:gpr(s64) = G_SMULH %0, %1
%3:gpr(s64) = G_UMULH %0, %1
+ %x0 = COPY %2(s64)
+ %x0 = COPY %3(s64)
...
---
%0(s32) = COPY %w0
%1(s32) = COPY %w1
%2(s32) = G_SDIV %0, %1
+ %w0 = COPY %2(s32)
...
---
%0(s64) = COPY %x0
%1(s64) = COPY %x1
%2(s64) = G_SDIV %0, %1
+ %x0 = COPY %2(s64)
...
---
%0(s32) = COPY %w0
%1(s32) = COPY %w1
%2(s32) = G_UDIV %0, %1
+ %w0 = COPY %2(s32)
...
---
%0(s64) = COPY %x0
%1(s64) = COPY %x1
%2(s64) = G_UDIV %0, %1
+ %x0 = COPY %2(s64)
...
---
%0(s32) = COPY %s0
%1(s32) = COPY %s1
%2(s32) = G_FADD %0, %1
+ %s0 = COPY %2(s32)
...
---
%0(s64) = COPY %d0
%1(s64) = COPY %d1
%2(s64) = G_FADD %0, %1
+ %d0 = COPY %2(s64)
...
---
%0(s32) = COPY %s0
%1(s32) = COPY %s1
%2(s32) = G_FSUB %0, %1
+ %s0 = COPY %2(s32)
...
---
%0(s64) = COPY %d0
%1(s64) = COPY %d1
%2(s64) = G_FSUB %0, %1
+ %d0 = COPY %2(s64)
...
---
%0(s32) = COPY %s0
%1(s32) = COPY %s1
%2(s32) = G_FMUL %0, %1
+ %s0 = COPY %2(s32)
...
---
%0(s64) = COPY %d0
%1(s64) = COPY %d1
%2(s64) = G_FMUL %0, %1
+ %d0 = COPY %2(s64)
...
---
%0(s32) = COPY %s0
%1(s32) = COPY %s1
%2(s32) = G_FDIV %0, %1
+ %s0 = COPY %2(s32)
...
---
%0(s64) = COPY %d0
%1(s64) = COPY %d1
%2(s64) = G_FDIV %0, %1
+ %d0 = COPY %2(s64)
...
%0(s32) = COPY %w0
%1(s32) = G_BITCAST %0
+ %w0 = COPY %1(s32)
...
---
%0(s32) = COPY %s0
%1(s32) = G_BITCAST %0
+ %s0 = COPY %1(s32)
...
---
%0(s32) = COPY %w0
%1(s32) = G_BITCAST %0
+ %s0 = COPY %1(s32)
...
---
%0(s32) = COPY %s0
%1(s32) = G_BITCAST %0
+ %w0 = COPY %1(s32)
...
---
%0(s64) = COPY %x0
%1(s64) = G_BITCAST %0
+ %x0 = COPY %1(s64)
...
---
%0(s64) = COPY %d0
%1(s64) = G_BITCAST %0
+ %d0 = COPY %1(s64)
...
---
%0(s64) = COPY %x0
%1(s64) = G_BITCAST %0
+ %d0 = COPY %1(s64)
...
---
%0(s64) = COPY %d0
%1(s64) = G_BITCAST %0
+ %x0 = COPY %1(s64)
...
body: |
bb.0:
%0(s32) = G_CONSTANT i32 42
+ %w0 = COPY %0(s32)
...
---
body: |
bb.0:
%0(s64) = G_CONSTANT i64 1234567890123
+ %x0 = COPY %0(s64)
...
---
body: |
bb.0:
%0(s32) = G_FCONSTANT float 3.5
+ %s0 = COPY %0(s32)
...
---
body: |
bb.0:
%0(s64) = G_FCONSTANT double 1.0
+ %d0 = COPY %0(s64)
...
%0(s64) = COPY %d0
%1(s32) = G_FPTRUNC %0
+ %s0 = COPY %1(s32)
...
---
%0(s32) = COPY %s0
%1(s64) = G_FPEXT %0
+ %d0 = COPY %1(s64)
...
---
%0(s32) = COPY %w0
%1(s32) = G_SITOFP %0
+ %s0 = COPY %1(s32)
...
---
%0(s64) = COPY %x0
%1(s32) = G_SITOFP %0
+ %s0 = COPY %1(s32)
...
---
%0(s32) = COPY %w0
%1(s64) = G_SITOFP %0
+ %d0 = COPY %1(s64)
...
---
%0(s64) = COPY %x0
%1(s64) = G_SITOFP %0
+ %d0 = COPY %1(s64)
...
---
%0(s32) = COPY %w0
%1(s32) = G_UITOFP %0
+ %s0 = COPY %1(s32)
...
---
%0(s64) = COPY %x0
%1(s32) = G_UITOFP %0
+ %s0 = COPY %1(s32)
...
---
%0(s32) = COPY %w0
%1(s64) = G_UITOFP %0
+ %d0 = COPY %1(s64)
...
---
%0(s64) = COPY %x0
%1(s64) = G_UITOFP %0
+ %d0 = COPY %1(s64)
...
---
%0(s32) = COPY %s0
%1(s32) = G_FPTOSI %0
+ %w0 = COPY %1(s32)
...
---
%0(s64) = COPY %d0
%1(s32) = G_FPTOSI %0
+ %w0 = COPY %1(s32)
...
---
%0(s32) = COPY %s0
%1(s64) = G_FPTOSI %0
+ %x0 = COPY %1(s64)
...
---
%0(s64) = COPY %d0
%1(s64) = G_FPTOSI %0
+ %x0 = COPY %1(s64)
...
---
%0(s32) = COPY %s0
%1(s32) = G_FPTOUI %0
+ %w0 = COPY %1(s32)
...
---
%0(s64) = COPY %d0
%1(s32) = G_FPTOUI %0
+ %w0 = COPY %1(s32)
...
---
%0(s32) = COPY %s0
%1(s64) = G_FPTOUI %0
+ %x0 = COPY %1(s64)
...
---
%0(s64) = COPY %d0
%1(s64) = G_FPTOUI %0
+ %x0 = COPY %1(s64)
...
%0(s32) = COPY %w0
%1(s64) = G_ANYEXT %0
+ %x0 = COPY %1(s64)
...
---
%0(s8) = COPY %w0
%1(s32) = G_ANYEXT %0
+ %w0 = COPY %1(s32)
...
---
%0(s32) = COPY %w0
%1(s64) = G_ZEXT %0
+ %x0 = COPY %1(s64)
...
---
%0(s8) = COPY %w0
%1(s32) = G_ZEXT %0
+ %w0 = COPY %1(s32)
...
---
%0(s8) = COPY %w0
%1(s16) = G_ZEXT %0
+ %w0 = COPY %1(s16)
...
---
%0(s32) = COPY %w0
%1(s64) = G_SEXT %0
+ %x0 = COPY %1(s64)
...
---
%0(s8) = COPY %w0
%1(s32) = G_SEXT %0
+ %w0 = COPY %1(s32)
...
---
%0(s8) = COPY %w0
%1(s16) = G_SEXT %0
+ %w0 = COPY %1(s16)
...
liveins: %x0
%0(s64) = COPY %x0
%1(p0) = G_INTTOPTR %0
+ %x0 = COPY %1(p0)
...
---
liveins: %x0
%0(p0) = COPY %x0
%1(s64) = G_PTRTOINT %0
+ %x0 = COPY %1(s64)
...
---
liveins: %x0
%0(p0) = COPY %x0
%1(s32) = G_PTRTOINT %0
+ %w0 = COPY %1(s32)
...
---
liveins: %x0
%0(p0) = COPY %x0
%1(s16) = G_PTRTOINT %0
+ %w0 = COPY %1(s16)
...
---
liveins: %x0
%0(p0) = COPY %x0
%1(s8) = G_PTRTOINT %0
+ %w0 = COPY %1(s8)
...
---
liveins: %x0
%0(p0) = COPY %x0
%1(s1) = G_PTRTOINT %0
+ %w0 = COPY %1(s1)
...
%0(p0) = COPY %x0
%1(s64) = G_LOAD %0 :: (load 8 from %ir.addr)
-
+ %x0 = COPY %1(s64)
...
---
%0(p0) = COPY %x0
%1(s32) = G_LOAD %0 :: (load 4 from %ir.addr)
-
+ %w0 = COPY %1(s32)
...
---
%0(p0) = COPY %x0
%1(s16) = G_LOAD %0 :: (load 2 from %ir.addr)
-
+ %w0 = COPY %1(s16)
...
---
%0(p0) = COPY %x0
%1(s8) = G_LOAD %0 :: (load 1 from %ir.addr)
-
+ %w0 = COPY %1(s8)
...
---
%0(p0) = COPY %x0
%1(s64) = G_LOAD %0 :: (load 8 from %ir.addr)
-
+ %d0 = COPY %1(s64)
...
---
%0(p0) = COPY %x0
%1(s32) = G_LOAD %0 :: (load 4 from %ir.addr)
-
+ %s0 = COPY %1(s32)
...
---
%0(p0) = COPY %x0
%1(s16) = G_LOAD %0 :: (load 2 from %ir.addr)
-
+ %h0 = COPY %1(s16)
...
---
%0(p0) = COPY %x0
%1(s8) = G_LOAD %0 :: (load 1 from %ir.addr)
-
+ %b0 = COPY %1(s8)
...
%0(s64) = COPY %x0
%1(s32) = G_TRUNC %0
+ %w0 = COPY %1(s32)
...
---
%0(s64) = COPY %x0
%1(s8) = G_TRUNC %0
+ %w0 = COPY %1(s8)
...
---
%0(s32) = COPY %w0
%1(s1) = G_TRUNC %0
+ %w0 = COPY %1(s1)
...
%0(s32) = COPY %w0
%1(s32) = COPY %w1
%2(s32) = G_XOR %0, %1
+ %w0 = COPY %2(s32)
...
---
%0(s64) = COPY %x0
%1(s64) = COPY %x1
%2(s64) = G_XOR %0, %1
+ %x0 = COPY %2(s64)
...
---
# CHECK: registers:
# CHECK-NEXT: - { id: 0, class: gpr32 }
-# CHECK-NEXT: - { id: 1, class: gpr32 }
+# CHECK-NEXT: - { id: 1, class: gpr }
# CHECK-NEXT: - { id: 2, class: gpr32 }
registers:
- { id: 0, class: gpr }
%0(s32) = COPY %w0
%1(s32) = G_CONSTANT i64 -1
%2(s32) = G_XOR %0, %1
+ %w0 = COPY %2(s32)
...
---
# CHECK: registers:
# CHECK-NEXT: - { id: 0, class: gpr64 }
-# CHECK-NEXT: - { id: 1, class: gpr64 }
+# CHECK-NEXT: - { id: 1, class: gpr }
# CHECK-NEXT: - { id: 2, class: gpr64 }
registers:
- { id: 0, class: gpr }
%0(s64) = COPY %x0
%1(s64) = G_CONSTANT i64 -1
%2(s64) = G_XOR %0, %1
+ %x0 = COPY %2(s64)
...
---
# CHECK: registers:
# CHECK-NEXT: - { id: 0, class: gpr32 }
-# CHECK-NEXT: - { id: 1, class: gpr32 }
+# CHECK-NEXT: - { id: 1, class: gpr }
# CHECK-NEXT: - { id: 2, class: gpr32 }
registers:
- { id: 0, class: gpr }
bb.1:
%0(s32) = COPY %w0
%2(s32) = G_XOR %0, %1
+ %w0 = COPY %2(s32)
...
body: |
bb.0:
%0(p0) = G_FRAME_INDEX %stack.0.ptr0
+ %x0 = COPY %0(p0)
...
---
%0(p0) = COPY %x0
%1(s64) = G_CONSTANT i64 42
%2(p0) = G_GEP %0, %1(s64)
+ %x0 = COPY %2(p0)
...
---
liveins: %x0
%0:gpr(p0) = COPY %x0
%1:gpr(p0) = G_PTR_MASK %0, 3
+ %x0 = COPY %1(p0)
...
---
body: |
bb.0:
%0(p0) = G_GLOBAL_VALUE @var_local
+ %x0 = COPY %0(p0)
...
---
body: |
bb.0:
%0(p0) = G_GLOBAL_VALUE @var_got
+ %x0 = COPY %0(p0)
...
---
%0(s32) = COPY %w0
%1(s1) = G_ICMP intpred(eq), %0, %0
+ %w0 = COPY %1(s1)
%2(s64) = COPY %x0
%3(s1) = G_ICMP intpred(uge), %2, %2
+ %w0 = COPY %3(s1)
%4(p0) = COPY %x0
%5(s1) = G_ICMP intpred(ne), %4, %4
+ %w0 = COPY %5(s1)
...
---
%0(s32) = COPY %s0
%1(s1) = G_FCMP floatpred(one), %0, %0
+ %w0 = COPY %1(s1)
%2(s64) = COPY %d0
%3(s1) = G_FCMP floatpred(uge), %2, %2
+ %w0 = COPY %3(s1)
...
%1(s32) = COPY %w1
%2(s32) = COPY %w2
%3(s32) = G_SELECT %0, %1, %2
+ %w0 = COPY %3(s32)
%4(s64) = COPY %x0
%5(s64) = COPY %x1
%6(s64) = G_SELECT %0, %4, %5
+ %x0 = COPY %6(s64)
%7(p0) = COPY %x0
%8(p0) = COPY %x1
%9(p0) = G_SELECT %0, %7, %8
+ %x0 = COPY %9(p0)
...
%0:vgpr(p1) = COPY %vgpr0_vgpr1
%1:vgpr(s32) = G_LOAD %0 :: (load 4 from %ir.global0)
+ %vgpr0 = COPY %1
...
---
# VI: S_LOAD_DWORD_IMM [[PTR]], 1020, 0
# Immediate overflow for SI
-# FIXME: The immediate gets selected twice, once into the
-# S_LOAD_DWORD instruction and once just as a normal constat.
-# SI: S_MOV_B32 1024
# SI: [[K1024:%[0-9]+]] = S_MOV_B32 1024
# SI: S_LOAD_DWORD_SGPR [[PTR]], [[K1024]], 0
# CI: S_LOAD_DWORD_IMM_ci [[PTR]], 256, 0
# VI: S_LOAD_DWORD_IMM [[PTR]], 1024, 0
# Max immediate offset for VI
-# SI: S_MOV_B32 1048572
# SI: [[K1048572:%[0-9]+]] = S_MOV_B32 1048572
# CI: S_LOAD_DWORD_IMM_ci [[PTR]], 262143
# VI: S_LOAD_DWORD_IMM [[PTR]], 1048572
#
# Immediate overflow for VI
-# FIXME: The immediate gets selected twice, once into the
-# S_LOAD_DWORD instruction and once just as a normal constat.
-# SIVI: S_MOV_B32 1048576
# SIVI: [[K1048576:%[0-9]+]] = S_MOV_B32 1048576
# SIVI: S_LOAD_DWORD_SGPR [[PTR]], [[K1048576]], 0
# CI: S_LOAD_DWORD_IMM_ci [[PTR]], 262144, 0
# GCN: S_LOAD_DWORD_IMM [[ADD_PTR]], 0, 0
# Max 32-bit byte offset
-# FIXME: The immediate gets selected twice, once into the
-# S_LOAD_DWORD instruction and once just as a normal constat.
-# SIVI: S_MOV_B32 4294967292
# SIVI: [[K4294967292:%[0-9]+]] = S_MOV_B32 4294967292
# SIVI: S_LOAD_DWORD_SGPR [[PTR]], [[K4294967292]], 0
# CI: S_LOAD_DWORD_IMM_ci [[PTR]], 1073741823, 0
%1:sgpr(s64) = G_CONSTANT i64 4
%2:sgpr(p2) = G_GEP %0, %1
%3:sgpr(s32) = G_LOAD %2 :: (load 4 from %ir.const0)
+ %sgpr0 = COPY %3
%4:sgpr(s64) = G_CONSTANT i64 1020
%5:sgpr(p2) = G_GEP %0, %4
%6:sgpr(s32) = G_LOAD %5 :: (load 4 from %ir.const0)
+ %sgpr0 = COPY %6
%7:sgpr(s64) = G_CONSTANT i64 1024
%8:sgpr(p2) = G_GEP %0, %7
%9:sgpr(s32) = G_LOAD %8 :: (load 4 from %ir.const0)
+ %sgpr0 = COPY %9
%10:sgpr(s64) = G_CONSTANT i64 1048572
%11:sgpr(p2) = G_GEP %0, %10
%12:sgpr(s32) = G_LOAD %11 :: (load 4 from %ir.const0)
+ %sgpr0 = COPY %12
%13:sgpr(s64) = G_CONSTANT i64 1048576
%14:sgpr(p2) = G_GEP %0, %13
%15:sgpr(s32) = G_LOAD %14 :: (load 4 from %ir.const0)
+ %sgpr0 = COPY %15
%16:sgpr(s64) = G_CONSTANT i64 17179869180
%17:sgpr(p2) = G_GEP %0, %16
%18:sgpr(s32) = G_LOAD %17 :: (load 4 from %ir.const0)
+ %sgpr0 = COPY %18
%19:sgpr(s64) = G_CONSTANT i64 17179869184
%20:sgpr(p2) = G_GEP %0, %19
%21:sgpr(s32) = G_LOAD %20 :: (load 4 from %ir.const0)
+ %sgpr0 = COPY %21
%22:sgpr(s64) = G_CONSTANT i64 4294967292
%23:sgpr(p2) = G_GEP %0, %22
%24:sgpr(s32) = G_LOAD %23 :: (load 4 from %ir.const0)
+ %sgpr0 = COPY %24
%25:sgpr(s64) = G_CONSTANT i64 4294967296
%26:sgpr(p2) = G_GEP %0, %25
%27:sgpr(s32) = G_LOAD %26 :: (load 4 from %ir.const0)
+ %sgpr0 = COPY %27
...
---
; CHECK: [[FI32VREG:%[0-9]+]] = ADDri %fixed-stack.[[FI32]], 0, 14, _, _
%1(s32) = G_LOAD %0(p0) :: (load 4)
- ; CHECK: {{%[0-9]+}} = LDRi12 [[FI32VREG]], 0, 14, _
+ ; CHECK: [[LD32VREG:%[0-9]+]] = LDRi12 [[FI32VREG]], 0, 14, _
+
+ %r0 = COPY %1
+ ; CHECK: %r0 = COPY [[LD32VREG]]
%2(p0) = G_FRAME_INDEX %fixed-stack.0
; CHECK: [[FI1VREG:%[0-9]+]] = ADDri %fixed-stack.[[FI1]], 0, 14, _, _
%3(s1) = G_LOAD %2(p0) :: (load 1)
- ; CHECK: {{%[0-9]+}} = LDRBi12 [[FI1VREG]], 0, 14, _
+ ; CHECK: [[LD1VREG:%[0-9]+]] = LDRBi12 [[FI1VREG]], 0, 14, _
+
+ %r0 = COPY %3
+ ; CHECK: %r0 = COPY [[LD1VREG]]
BX_RET 14, _
; CHECK: BX_RET 14, _
%0(s64) = COPY %rdi
%1(s64) = COPY %rsi
%2(s64) = G_ADD %0, %1
+ %rax = COPY %2(s64)
...
%0(s32) = COPY %edi
%1(s32) = COPY %esi
%2(s32) = G_ADD %0, %1
+ %rax = COPY %2(s32)
...
%0(s64) = COPY %rdi
%1(s64) = COPY %rsi
%2(s64) = G_SUB %0, %1
+ %rax = COPY %2(s64)
...
%0(s32) = COPY %edi
%1(s32) = COPY %esi
%2(s32) = G_SUB %0, %1
+ %rax = COPY %2(s32)
...