[llvm] [AMDGPU][WIP] Added mask intrinsics (PR #193538)

Ravil Dorozhinskii via llvm-commits llvm-commits at lists.llvm.org
Wed Apr 22 09:54:57 PDT 2026


https://github.com/ravil-mobile created https://github.com/llvm/llvm-project/pull/193538

None

>From 8c9c1cf54ccca07b24966c30a6681f9ecc58521a Mon Sep 17 00:00:00 2001
From: ravil-mobile <ravil.aviva.com at gmail.com>
Date: Wed, 22 Apr 2026 16:25:30 +0000
Subject: [PATCH] [AMDGPU][WIP] Added mask intrinsics

---
 llvm/include/llvm/IR/IntrinsicsAMDGPU.td  | 10 +++++++
 llvm/lib/Target/AMDGPU/SIISelLowering.cpp | 34 +++++++++++++++++++++++
 2 files changed, 44 insertions(+)

diff --git a/llvm/include/llvm/IR/IntrinsicsAMDGPU.td b/llvm/include/llvm/IR/IntrinsicsAMDGPU.td
index 9528fb2b446bc..a9f77d9c4ad07 100644
--- a/llvm/include/llvm/IR/IntrinsicsAMDGPU.td
+++ b/llvm/include/llvm/IR/IntrinsicsAMDGPU.td
@@ -3844,6 +3844,16 @@ def int_amdgcn_cooperative_atomic_store_16x8B : AMDGPUCooperativeAtomicStore<llv
 def int_amdgcn_cooperative_atomic_load_8x16B : AMDGPUCooperativeAtomicLoad<llvm_v4i32_ty>;
 def int_amdgcn_cooperative_atomic_store_8x16B : AMDGPUCooperativeAtomicStore<llvm_v4i32_ty>;
 
+def int_amdgcn_mask : ClangBuiltin<"__builtin_amdgcn_mask">,
+  Intrinsic<[llvm_anyint_ty],
+  [llvm_i1_ty], [IntrWillReturn, IntrNoCallback, IntrNoFree]
+>;
+
+def int_amdgcn_reset_mask : ClangBuiltin<"__builtin_amdgcn_reset_mask">,
+  Intrinsic<[],
+  [llvm_anyint_ty], [IntrWillReturn, IntrNoCallback, IntrNoFree]
+>;
+
 //===----------------------------------------------------------------------===//
 // Special Intrinsics for backend internal use only. No frontend
 // should emit calls to these.
diff --git a/llvm/lib/Target/AMDGPU/SIISelLowering.cpp b/llvm/lib/Target/AMDGPU/SIISelLowering.cpp
index 8bb072a9626a9..1efb0a0078d60 100644
--- a/llvm/lib/Target/AMDGPU/SIISelLowering.cpp
+++ b/llvm/lib/Target/AMDGPU/SIISelLowering.cpp
@@ -11742,6 +11742,30 @@ SDValue SITargetLowering::LowerINTRINSIC_W_CHAIN(SDValue Op,
                                    Op->getVTList(), {Chain, Ptr},
                                    MII->getMemoryVT(), MII->getMemOperand());
   }
+  case Intrinsic::amdgcn_mask: {
+    SDNode *N = Op.getNode();
+    SDLoc SL(N);
+    SDValue Pred = N->getOperand(2);
+
+    // generate a new EXEC mask based on the predicate value
+    SmallVector<SDValue, 2> Operands;
+    Operands.push_back(
+    DAG.getTargetConstant(Intrinsic::amdgcn_ballot, SL, MVT::i32));
+    Operands.push_back(Pred);
+    SDValue NewMask = DAG.getNode(ISD::INTRINSIC_WO_CHAIN, SL, MVT::i32, Operands);
+
+    // save the original EXEC mask
+    EVT ExecVT = Subtarget->isWave32() ? MVT::i32 : MVT::i64;
+    Register ExecReg = Subtarget->isWave32() ? AMDGPU::EXEC_LO : AMDGPU::EXEC;
+    SDValue OrigMask = DAG.getCopyFromReg(DAG.getEntryNode(), SL, ExecReg, ExecVT);
+    SDValue Chain = OrigMask.getValue(1);
+
+    // change the EXEC mask
+    SDValue Res = DAG.getCopyToReg(Chain, SL, ExecReg, NewMask, SDValue());
+
+    return DAG.getMergeValues({OrigMask.getValue(0), Res.getValue(0)}, SL);
+  }
+
   default:
 
     if (const AMDGPU::ImageDimIntrinsicInfo *ImageDimIntr =
@@ -12425,6 +12449,16 @@ SDValue SITargetLowering::LowerINTRINSIC_VOID(SDValue Op,
     return DAG.getAtomic(ISD::ATOMIC_STORE, DL, MII->getMemoryVT(), Chain, Val,
                          Ptr, MII->getMemOperand());
   }
+  case Intrinsic::amdgcn_reset_mask: {
+    SDNode *N = Op.getNode();
+    SDLoc SL(N);
+
+    SDValue Chain = N->getOperand(0);
+    SDValue Mask = N->getOperand(2);
+    const GCNSubtarget *ST = this->getSubtarget();
+    Register ExecReg = ST->isWave32() ? AMDGPU::EXEC_LO : AMDGPU::EXEC;
+    return DAG.getCopyToReg(Chain, SL, ExecReg, Mask.getValue(0), SDValue());
+  }
   default: {
     if (const AMDGPU::ImageDimIntrinsicInfo *ImageDimIntr =
             AMDGPU::getImageDimIntrinsicInfo(IntrinsicID))



More information about the llvm-commits mailing list