[llvm] bea94ba - [AMDGPU][True16][CodeGen] Do not fold hi16 SGPR copy (#220858)

via llvm-commits llvm-commits at lists.llvm.org
Mon Sep 7 15:20:18 PDT 2026


Author: Arseniy Obolenskiy
Date: 2026-09-07T22:20:13Z
New Revision: bea94ba6d6424468b60478c4ef1933e4c598f58f

URL: https://github.com/llvm/llvm-project/commit/bea94ba6d6424468b60478c4ef1933e4c598f58f
DIFF: https://github.com/llvm/llvm-project/commit/bea94ba6d6424468b60478c4ef1933e4c598f58f.diff

LOG: [AMDGPU][True16][CodeGen] Do not fold hi16 SGPR copy (#220858)

Dropping the subreg on a hi16 copy would read the low half instead

Added: 
    

Modified: 
    llvm/lib/Target/AMDGPU/SIFoldOperands.cpp
    llvm/test/CodeGen/AMDGPU/true16-fold.mir

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/AMDGPU/SIFoldOperands.cpp b/llvm/lib/Target/AMDGPU/SIFoldOperands.cpp
index d55067c963a89..e5490b390db08 100644
--- a/llvm/lib/Target/AMDGPU/SIFoldOperands.cpp
+++ b/llvm/lib/Target/AMDGPU/SIFoldOperands.cpp
@@ -2215,7 +2215,9 @@ bool SIFoldOperandsImpl::tryFoldFoldableCopy(
       OpToFold.getSubReg()) {
     if (DstRC == &AMDGPU::SReg_32RegClass &&
         DstRC == MRI->getRegClass(OpToFold.getReg())) {
-      assert(OpToFold.getSubReg() == AMDGPU::lo16);
+      if (!TRI->getMatchingSuperRegClass(DstRC, &AMDGPU::SGPR_LO16RegClass,
+                                         OpToFold.getSubReg()))
+        return false;
       OpToFold.setSubReg(0);
     }
   }

diff  --git a/llvm/test/CodeGen/AMDGPU/true16-fold.mir b/llvm/test/CodeGen/AMDGPU/true16-fold.mir
index 29be6c55e6f30..5dfabb938f1f9 100644
--- a/llvm/test/CodeGen/AMDGPU/true16-fold.mir
+++ b/llvm/test/CodeGen/AMDGPU/true16-fold.mir
@@ -265,3 +265,21 @@ body:             |
     $vgpr0 = COPY %5
     SI_RETURN implicit $vgpr0
 ...
+
+---
+name:            sgpr_hi16_copy_not_folded
+tracksRegLiveness: true
+body:             |
+  bb.0:
+    ; CHECK-LABEL: name: sgpr_hi16_copy_not_folded
+    ; CHECK: [[DEF:%[0-9]+]]:sreg_32 = IMPLICIT_DEF
+    ; CHECK-NEXT: [[DEF1:%[0-9]+]]:sreg_32 = IMPLICIT_DEF
+    ; CHECK-NEXT: [[COPY:%[0-9]+]]:sreg_32 = COPY [[DEF]].hi16
+    ; CHECK-NEXT: [[S_PACK_LL_B32_B16_:%[0-9]+]]:sreg_32 = S_PACK_LL_B32_B16 [[DEF1]], killed [[COPY]], implicit-def dead $scc
+    ; CHECK-NEXT: S_ENDPGM 0, implicit [[S_PACK_LL_B32_B16_]]
+    %0:sreg_32 = IMPLICIT_DEF
+    %1:sreg_32 = IMPLICIT_DEF
+    %2:sreg_32 = COPY %0.hi16
+    %3:sreg_32 = S_PACK_LL_B32_B16 %1, killed %2, implicit-def dead $scc
+    S_ENDPGM 0, implicit %3
+...


        


More information about the llvm-commits mailing list