[llvm] 847c164 - [AMDGPU] Reject i64 amdgcn.ubfe/sbfe with a diagnostic (#217461)

via llvm-commits llvm-commits at lists.llvm.org
Fri Aug 28 12:20:20 PDT 2026


Author: Arseniy Obolenskiy
Date: 2026-08-28T21:20:16+02:00
New Revision: 847c164baf4220ce0d0dc634da767ae0b547f022

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

LOG: [AMDGPU] Reject i64 amdgcn.ubfe/sbfe with a diagnostic (#217461)

- BFE_I32/BFE_U32 are 32-bit only
- wider widths now expand to shifts

Added: 
    llvm/test/CodeGen/AMDGPU/llvm.amdgcn.sbfe.i64.err.ll
    llvm/test/CodeGen/AMDGPU/llvm.amdgcn.ubfe.i64.err.ll

Modified: 
    llvm/lib/Target/AMDGPU/AMDGPUISelLowering.cpp
    llvm/lib/Target/AMDGPU/SIISelLowering.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/AMDGPU/AMDGPUISelLowering.cpp b/llvm/lib/Target/AMDGPU/AMDGPUISelLowering.cpp
index 7acc9ca2bafbd..9040b506eb7c9 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPUISelLowering.cpp
+++ b/llvm/lib/Target/AMDGPU/AMDGPUISelLowering.cpp
@@ -5668,8 +5668,8 @@ SDValue AMDGPUTargetLowering::PerformDAGCombine(SDNode *N,
     return performFAbsCombine(N, DCI);
   case AMDGPUISD::BFE_I32:
   case AMDGPUISD::BFE_U32: {
-    assert(!N->getValueType(0).isVector() &&
-           "Vector handling of BFE not implemented");
+    assert(N->getValueType(0) == MVT::i32 &&
+           "BFE_I32/BFE_U32 is a 32-bit operation");
     ConstantSDNode *Width = dyn_cast<ConstantSDNode>(N->getOperand(2));
     if (!Width)
       break;

diff  --git a/llvm/lib/Target/AMDGPU/SIISelLowering.cpp b/llvm/lib/Target/AMDGPU/SIISelLowering.cpp
index 4bb61e43501d1..a8b4d1f9a568b 100644
--- a/llvm/lib/Target/AMDGPU/SIISelLowering.cpp
+++ b/llvm/lib/Target/AMDGPU/SIISelLowering.cpp
@@ -7998,6 +7998,27 @@ static SDValue lowerBALLOTIntrinsic(const SITargetLowering &TLI, SDNode *N,
       DAG.getConstant(0, SL, MVT::i32), DAG.getCondCode(ISD::SETNE));
 }
 
+static SDValue lowerBFEIntrinsic(SDValue Op, SelectionDAG &DAG,
+                                 Intrinsic::ID IntrinsicID) {
+  bool Signed = IntrinsicID == Intrinsic::amdgcn_sbfe;
+  SDLoc DL(Op);
+  EVT VT = Op.getValueType();
+  SDValue Src = Op.getOperand(1);
+  SDValue Offset = Op.getOperand(2);
+  SDValue Width = Op.getOperand(3);
+
+  if (VT != MVT::i32) {
+    DAG.getContext()->diagnose(DiagnosticInfoUnsupported(
+        DAG.getMachineFunction().getFunction(),
+        Twine(Intrinsic::getBaseName(IntrinsicID)) + " only supports i32",
+        DL.getDebugLoc()));
+    return DAG.getPOISON(VT);
+  }
+
+  return DAG.getNode(Signed ? AMDGPUISD::BFE_I32 : AMDGPUISD::BFE_U32, DL, VT,
+                     Src, Offset, Width);
+}
+
 static SDValue emitRemovedIntrinsicError(SelectionDAG &DAG, const SDLoc &DL,
                                          EVT VT);
 
@@ -11424,11 +11445,8 @@ SDValue SITargetLowering::LowerINTRINSIC_WO_CHAIN(SDValue Op,
     return DAG.getNode(AMDGPUISD::FMUL_LEGACY, DL, VT, Op.getOperand(1),
                        Op.getOperand(2));
   case Intrinsic::amdgcn_sbfe:
-    return DAG.getNode(AMDGPUISD::BFE_I32, DL, VT, Op.getOperand(1),
-                       Op.getOperand(2), Op.getOperand(3));
   case Intrinsic::amdgcn_ubfe:
-    return DAG.getNode(AMDGPUISD::BFE_U32, DL, VT, Op.getOperand(1),
-                       Op.getOperand(2), Op.getOperand(3));
+    return lowerBFEIntrinsic(Op, DAG, IntrinsicID);
   case Intrinsic::amdgcn_cvt_pkrtz:
   case Intrinsic::amdgcn_cvt_pknorm_i16:
   case Intrinsic::amdgcn_cvt_pknorm_u16:

diff  --git a/llvm/test/CodeGen/AMDGPU/llvm.amdgcn.sbfe.i64.err.ll b/llvm/test/CodeGen/AMDGPU/llvm.amdgcn.sbfe.i64.err.ll
new file mode 100644
index 0000000000000..8e00d14c36f57
--- /dev/null
+++ b/llvm/test/CodeGen/AMDGPU/llvm.amdgcn.sbfe.i64.err.ll
@@ -0,0 +1,11 @@
+; RUN: not llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 < %s 2>&1 | FileCheck %s
+
+; CHECK: error: <unknown>:0:0: in function sbfe_i64 void (ptr addrspace(1), i64): llvm.amdgcn.sbfe only supports i32
+
+define amdgpu_kernel void @sbfe_i64(ptr addrspace(1) %out, i64 %src) {
+  %bfe = call i64 @llvm.amdgcn.sbfe.i64(i64 %src, i32 8, i32 16)
+  store i64 %bfe, ptr addrspace(1) %out
+  ret void
+}
+
+declare i64 @llvm.amdgcn.sbfe.i64(i64, i32, i32)

diff  --git a/llvm/test/CodeGen/AMDGPU/llvm.amdgcn.ubfe.i64.err.ll b/llvm/test/CodeGen/AMDGPU/llvm.amdgcn.ubfe.i64.err.ll
new file mode 100644
index 0000000000000..2551dd61c591a
--- /dev/null
+++ b/llvm/test/CodeGen/AMDGPU/llvm.amdgcn.ubfe.i64.err.ll
@@ -0,0 +1,11 @@
+; RUN: not llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 < %s 2>&1 | FileCheck %s
+
+; CHECK: error: <unknown>:0:0: in function ubfe_i64 void (ptr addrspace(1), i64): llvm.amdgcn.ubfe only supports i32
+
+define amdgpu_kernel void @ubfe_i64(ptr addrspace(1) %out, i64 %src) {
+  %bfe = call i64 @llvm.amdgcn.ubfe.i64(i64 %src, i32 8, i32 16)
+  store i64 %bfe, ptr addrspace(1) %out
+  ret void
+}
+
+declare i64 @llvm.amdgcn.ubfe.i64(i64, i32, i32)


        


More information about the llvm-commits mailing list