[llvm] AMDGPU: Fix assert on llvm.sqrt.f16 on gfx6/7 (PR #217994)

Matt Arsenault via llvm-commits llvm-commits at lists.llvm.org
Fri Aug 21 11:04:43 PDT 2026


https://github.com/arsenm created https://github.com/llvm/llvm-project/pull/217994

None

>From bda092fc4d71a9b06d3ec37289f32f1591d1a4a0 Mon Sep 17 00:00:00 2001
From: Matt Arsenault <Matthew.Arsenault at amd.com>
Date: Fri, 21 Aug 2026 19:59:12 +0200
Subject: [PATCH] AMDGPU: Fix assert on llvm.sqrt.f16 on gfx6/7

---
 .../Target/AMDGPU/AMDGPUCodeGenPrepare.cpp    |  2 +-
 .../AMDGPU/amdgpu-codegenprepare-sqrt.ll      | 21 +++++++++++++++++++
 2 files changed, 22 insertions(+), 1 deletion(-)

diff --git a/llvm/lib/Target/AMDGPU/AMDGPUCodeGenPrepare.cpp b/llvm/lib/Target/AMDGPU/AMDGPUCodeGenPrepare.cpp
index 59da63da6f51e..21a8896ed3a6d 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPUCodeGenPrepare.cpp
+++ b/llvm/lib/Target/AMDGPU/AMDGPUCodeGenPrepare.cpp
@@ -2170,7 +2170,7 @@ bool AMDGPUCodeGenPrepareImpl::visitFMinLike(IntrinsicInst &I) {
 // Expand llvm.sqrt.f32 calls with !fpmath metadata in a semi-fast way.
 bool AMDGPUCodeGenPrepareImpl::visitSqrt(IntrinsicInst &Sqrt) {
   Type *Ty = Sqrt.getType()->getScalarType();
-  if (!Ty->isFloatTy() && (!Ty->isHalfTy() || ST.has16BitInsts()))
+  if (!Ty->isFloatTy())
     return false;
 
   const FPMathOperator *FPOp = cast<const FPMathOperator>(&Sqrt);
diff --git a/llvm/test/CodeGen/AMDGPU/amdgpu-codegenprepare-sqrt.ll b/llvm/test/CodeGen/AMDGPU/amdgpu-codegenprepare-sqrt.ll
index 8e154fb87eace..7037ca6cec3cf 100644
--- a/llvm/test/CodeGen/AMDGPU/amdgpu-codegenprepare-sqrt.ll
+++ b/llvm/test/CodeGen/AMDGPU/amdgpu-codegenprepare-sqrt.ll
@@ -602,7 +602,28 @@ define amdgpu_kernel void @sqrt_fpmath_f32_assume_nosub(ptr addrspace(1) %out, f
   ret void
 }
 
+; f16 sqrt is left alone on a target without 16-bit instructions: this
+; expansion only emits f32 instructions.
+define amdgpu_kernel void @sqrt_fpmath_f16(ptr addrspace(1) %out, half %x) {
+; CHECK-LABEL: define amdgpu_kernel void @sqrt_fpmath_f16
+; CHECK-SAME: (ptr addrspace(1) [[OUT:%.*]], half [[X:%.*]]) #[[ATTR:[0-9]+]] {
+; CHECK-NEXT:    [[NO_MD:%.*]] = call half @llvm.sqrt.f16(half [[X]])
+; CHECK-NEXT:    store volatile half [[NO_MD]], ptr addrspace(1) [[OUT]], align 2
+; CHECK-NEXT:    [[MD_1ULP:%.*]] = call half @llvm.sqrt.f16(half [[X]]), !fpmath !2
+; CHECK-NEXT:    store volatile half [[MD_1ULP]], ptr addrspace(1) [[OUT]], align 2
+; CHECK-NEXT:    ret void
+;
+  %no.md = call half @llvm.sqrt.f16(half %x)
+  store volatile half %no.md, ptr addrspace(1) %out, align 2
+
+  %md.1ulp = call half @llvm.sqrt.f16(half %x), !fpmath !2
+  store volatile half %md.1ulp, ptr addrspace(1) %out, align 2
+
+  ret void
+}
+
 declare float @llvm.sqrt.f32(float)
+declare half @llvm.sqrt.f16(half)
 declare <2 x float> @llvm.sqrt.v2f32(<2 x float>)
 declare float @llvm.fabs.f32(float)
 declare void @llvm.assume(i1 noundef)



More information about the llvm-commits mailing list