[llvm] calling conv (PR #187135)

Guo Chen via llvm-commits llvm-commits at lists.llvm.org
Wed Apr 1 08:52:34 PDT 2026


https://github.com/broxigarchen updated https://github.com/llvm/llvm-project/pull/187135

>From 1c30c51f238e156bbe3bc94690c9bb14e36c84db Mon Sep 17 00:00:00 2001
From: guochen2 <guochen2 at amd.com>
Date: Wed, 1 Apr 2026 11:20:27 -0400
Subject: [PATCH] calling conv update

---
 llvm/lib/Target/AMDGPU/AMDGPUCallingConv.td | 25 +++++++++++++++++++--
 llvm/lib/Target/AMDGPU/SIISelLowering.cpp   |  5 ++++-
 2 files changed, 27 insertions(+), 3 deletions(-)

diff --git a/llvm/lib/Target/AMDGPU/AMDGPUCallingConv.td b/llvm/lib/Target/AMDGPU/AMDGPUCallingConv.td
index 2932bbf0e7bbd..3981fbe28444a 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPUCallingConv.td
+++ b/llvm/lib/Target/AMDGPU/AMDGPUCallingConv.td
@@ -18,6 +18,10 @@ class CCIfOrigTypeShaderCCIsSGPR<CCAction A>
   : CCIf<[{(!OrigTy->getScalarType()->isFloatTy() &&
             !OrigTy->getScalarType()->isHalfTy()) }], A>;
 
+class CCIfTrue16<CCAction A> :
+  CCIf<"State.getMachineFunction().getSubtarget<GCNSubtarget>().useRealTrue16Insts()", A>;
+class CCIfNotTrue16<CCAction A> :
+  CCIf<"!State.getMachineFunction().getSubtarget<GCNSubtarget>().useRealTrue16Insts()", A>;
 
 // Calling convention for SI
 def CC_SI_Gfx : CallingConv<[
@@ -143,9 +147,18 @@ def CC_AMDGPU_Func : CallingConv<[
     !foreach(i, !range(0, 30), !cast<Register>("SGPR"#i))  // SGPR0-29
   >>>,
 
-  CCIfType<[i32, f32, i16, f16, v2i16, v2f16, i1, bf16, v2bf16], CCAssignToReg<
+  CCIfType<[i32, f32, v2i16, v2f16, i1, v2bf16], CCAssignToReg<
     !foreach(i, !range(0, 32), !cast<Register>("VGPR"#i))  // VGPR0-31
   >>,
+
+  CCIfTrue16<CCIfType<[i16, f16, bf16], CCAssignToReg<
+       !foreach(i, !range(0, 32), !cast<Register>("VGPR"#i#"_LO16"))  // VGPR0-31_LO16
+  >>>,
+
+  CCIfNotTrue16<CCIfType<[i16, f16, bf16], CCAssignToReg<
+       !foreach(i, !range(0, 32), !cast<Register>("VGPR"#i))  // VGPR0-31
+  >>>,
+
   CCIfType<[i32, f32, v2i16, v2f16, i16, f16, i1, bf16, v2bf16], CCAssignToStack<4, 4>>
 ]>;
 
@@ -153,9 +166,17 @@ def CC_AMDGPU_Func : CallingConv<[
 def RetCC_AMDGPU_Func : CallingConv<[
   CCIfType<[i1], CCPromoteToType<i32>>,
   CCIfType<[i1, i16], CCIfExtend<CCPromoteToType<i32>>>,
-  CCIfType<[i32, f32, i16, f16, v2i16, v2f16, bf16, v2bf16], CCAssignToReg<
+  CCIfType<[i32, f32, v2i16, v2f16, v2bf16], CCAssignToReg<
     !foreach(i, !range(0, 32), !cast<Register>("VGPR"#i))  // VGPR0-31
   >>,
+
+  CCIfTrue16<CCIfType<[i16, f16, bf16], CCAssignToReg<
+       !foreach(i, !range(0, 32), !cast<Register>("VGPR"#i#"_LO16"))  // VGPR0-31_LO16
+  >>>,
+
+  CCIfNotTrue16<CCIfType<[i16, f16, bf16], CCAssignToReg<
+       !foreach(i, !range(0, 32), !cast<Register>("VGPR"#i))  // VGPR0-31
+  >>>,
 ]>;
 
 def CC_AMDGPU : CallingConv<[
diff --git a/llvm/lib/Target/AMDGPU/SIISelLowering.cpp b/llvm/lib/Target/AMDGPU/SIISelLowering.cpp
index 544aca0458975..ac3aa20ac5d7a 100644
--- a/llvm/lib/Target/AMDGPU/SIISelLowering.cpp
+++ b/llvm/lib/Target/AMDGPU/SIISelLowering.cpp
@@ -3639,12 +3639,15 @@ SDValue SITargetLowering::LowerFormalArguments(
       RC = &AMDGPU::VGPR_32RegClass;
     else if (AMDGPU::SGPR_32RegClass.contains(Reg))
       RC = &AMDGPU::SGPR_32RegClass;
+    else if (AMDGPU::VGPR_16RegClass.contains(Reg))
+      RC = &AMDGPU::VGPR_16RegClass;
     else
       llvm_unreachable("Unexpected register class in LowerFormalArguments!");
 
     Reg = MF.addLiveIn(Reg, RC);
     SDValue Val = DAG.getCopyFromReg(Chain, DL, Reg, VT);
-    if (Arg.Flags.isInReg() && RC == &AMDGPU::VGPR_32RegClass) {
+    if (Arg.Flags.isInReg() &&
+        (RC == &AMDGPU::VGPR_32RegClass || RC == &AMDGPU::VGPR_16RegClass)) {
       // FIXME: Need to forward the chains created by `CopyFromReg`s, make sure
       // they will read physical regs before any side effect instructions.
       SDValue ReadFirstLane =



More information about the llvm-commits mailing list