[llvm] [Win][X86]Fix issue where _fltused reference is incorrectly issued for vector floating point operations (PR #146792)

Adam Glass via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 3 13:01:00 PDT 2025


https://github.com/AdamGlass updated https://github.com/llvm/llvm-project/pull/146792

>From 774d9c90a609ea97015ba65338abe2534adfbd4a Mon Sep 17 00:00:00 2001
From: Adam Glass <adamglass at microsoft.com>
Date: Sat, 14 Jun 2025 20:53:45 -0700
Subject: [PATCH 1/2] Only reference _fltused for floating point, not vectors
 of floating point

---
 llvm/lib/Target/X86/X86AsmPrinter.cpp |  4 ++--
 llvm/test/CodeGen/X86/fltused_vec.ll  | 32 +++++++++++++++++++++++++++
 2 files changed, 34 insertions(+), 2 deletions(-)
 create mode 100644 llvm/test/CodeGen/X86/fltused_vec.ll

diff --git a/llvm/lib/Target/X86/X86AsmPrinter.cpp b/llvm/lib/Target/X86/X86AsmPrinter.cpp
index c7238839c26b5..57a1bebb562ed 100644
--- a/llvm/lib/Target/X86/X86AsmPrinter.cpp
+++ b/llvm/lib/Target/X86/X86AsmPrinter.cpp
@@ -1002,11 +1002,11 @@ static bool usesMSVCFloatingPoint(const Triple &TT, const Module &M) {
 
   for (const Function &F : M) {
     for (const Instruction &I : instructions(F)) {
-      if (I.getType()->isFPOrFPVectorTy())
+      if (I.getType()->isFloatingPointTy())
         return true;
 
       for (const auto &Op : I.operands()) {
-        if (Op->getType()->isFPOrFPVectorTy())
+        if (Op->getType()->isFloatingPointTy())
           return true;
       }
     }
diff --git a/llvm/test/CodeGen/X86/fltused_vec.ll b/llvm/test/CodeGen/X86/fltused_vec.ll
new file mode 100644
index 0000000000000..312f71203dde8
--- /dev/null
+++ b/llvm/test/CodeGen/X86/fltused_vec.ll
@@ -0,0 +1,32 @@
+; The purpose of this test to verify that the fltused symbol is
+; not emitted when purely vector floating point operations are used on Windows.
+
+; RUN: llc < %s -mtriple i686-pc-win32 | FileCheck %s --check-prefix WIN32
+; RUN: llc < %s -mtriple x86_64-pc-win32 | FileCheck %s --check-prefix WIN64
+; RUN: llc < %s -O0 -mtriple i686-pc-win32 | FileCheck %s --check-prefix WIN32
+; RUN: llc < %s -O0 -mtriple x86_64-pc-win32 | FileCheck %s --check-prefix WIN64
+
+ at foo = external dso_local global [4 x float], align 16
+
+; Function Attrs: noinline nounwind optnone sspstrong uwtable
+define dso_local <4 x float> @func() #0 {
+entry:
+  %__p.addr.i = alloca ptr, align 8
+  %vector1 = alloca <4 x float>, align 16
+  store ptr @foo, ptr %__p.addr.i, align 8
+  %0 = load ptr, ptr %__p.addr.i, align 8
+  %1 = load <4 x float>, ptr %0, align 16
+  store <4 x float> %1, ptr %vector1, align 16
+  %2 = load <4 x float>, ptr %vector1, align 16
+  ret <4 x float> %2
+}
+
+define <4 x float> @mul_vectors(<4 x float> %a, <4 x float> %b) {
+entry:
+  %result = fmul <4 x float> %a, %b
+  ret <4 x float> %result
+}
+
+; _fltused is determined at a module level
+; WIN32-NOT: .globl __fltused
+; WIN64-NOT: .globl _fltused

>From d6c67662c5de8aa3013648794386116f374cbafe Mon Sep 17 00:00:00 2001
From: Adam Glass <adamglass at microsoft.com>
Date: Thu, 3 Jul 2025 13:00:04 -0700
Subject: [PATCH 2/2] address test feedback

---
 llvm/test/CodeGen/X86/fltused_vec.ll | 9 +++------
 1 file changed, 3 insertions(+), 6 deletions(-)

diff --git a/llvm/test/CodeGen/X86/fltused_vec.ll b/llvm/test/CodeGen/X86/fltused_vec.ll
index 312f71203dde8..6e63e2e7ff891 100644
--- a/llvm/test/CodeGen/X86/fltused_vec.ll
+++ b/llvm/test/CodeGen/X86/fltused_vec.ll
@@ -1,10 +1,8 @@
 ; The purpose of this test to verify that the fltused symbol is
 ; not emitted when purely vector floating point operations are used on Windows.
 
-; RUN: llc < %s -mtriple i686-pc-win32 | FileCheck %s --check-prefix WIN32
-; RUN: llc < %s -mtriple x86_64-pc-win32 | FileCheck %s --check-prefix WIN64
-; RUN: llc < %s -O0 -mtriple i686-pc-win32 | FileCheck %s --check-prefix WIN32
-; RUN: llc < %s -O0 -mtriple x86_64-pc-win32 | FileCheck %s --check-prefix WIN64
+; RUN: llc < %s -mtriple i686-pc-win32 | FileCheck %s
+; RUN: llc < %s -mtriple x86_64-pc-win32 | FileCheck %s
 
 @foo = external dso_local global [4 x float], align 16
 
@@ -28,5 +26,4 @@ entry:
 }
 
 ; _fltused is determined at a module level
-; WIN32-NOT: .globl __fltused
-; WIN64-NOT: .globl _fltused
+; CHECK-NOT: .globl {{_?}}_fltused



More information about the llvm-commits mailing list