[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