[llvm] [AMDGPU] remove move instruction if there is no user of it (PR #136735)

Mariusz Sikora via llvm-commits llvm-commits at lists.llvm.org
Mon May 5 06:26:09 PDT 2025


================
@@ -797,7 +797,7 @@ MachineInstr *SIShrinkInstructions::matchSwap(MachineInstr &MovT) const {
     dropInstructionKeepingImpDefs(*MovY);
     MachineInstr *Next = &*std::next(MovT.getIterator());
 
-    if (T.isVirtual() && MRI->use_nodbg_empty(T)) {
+    if (MRI->use_nodbg_empty(T)) {
----------------
mariusz-sikora-at-amd wrote:

It looks like `use_nodbg_empty` is not tracing registers which are used as sub-registers (for Physical Registers)

e.g.
```
$vgpr2 = V_MOV_B32_e32 killed $vgpr0, implicit $exec  // this instruction will be removed
$vgpr0 = V_MOV_B32_e32 killed $vgpr1, implicit $exec
$vgpr1 = V_MOV_B32_e32 $vgpr2, implicit $exec

$vgpr3 = V_MOV_B32_e32 0, implicit $exec
$vgpr4_vgpr5 = V_MOV_B64_e32 $vgpr2_vgpr3, implicit $exec
```
vs.
```
$vgpr2 = V_MOV_B32_e32 killed $vgpr0, implicit $exec
$vgpr0 = V_MOV_B32_e32 killed $vgpr1, implicit $exec
$vgpr1 = V_MOV_B32_e32 $vgpr2, implicit $exec

$vgpr4 = V_MOV_B64_e32 $vgpr2, implicit $exec
```

Maybe we should also check if `T` is not marked as `killed` ?

https://github.com/llvm/llvm-project/pull/136735


More information about the llvm-commits mailing list