[llvm] 19860ce - [Win][X86]Fix issue where _fltused reference is incorrectly issued for vector floating point operations (#146792)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Jul 7 09:31:52 PDT 2025
Author: Adam Glass
Date: 2025-07-07T09:31:49-07:00
New Revision: 19860ce3c99c0365ca8c2a8b39eebe3f306556d0
URL: https://github.com/llvm/llvm-project/commit/19860ce3c99c0365ca8c2a8b39eebe3f306556d0
DIFF: https://github.com/llvm/llvm-project/commit/19860ce3c99c0365ca8c2a8b39eebe3f306556d0.diff
LOG: [Win][X86]Fix issue where _fltused reference is incorrectly issued for vector floating point operations (#146792)
Fixes #146428 _fltused reference generated for vector floating point
operations
Currently references to _fltused are incorrectly emitted due to the
presence of vector floating point operations. This causes spurious
references to _fltused in vector floating point system code where the
CRT is not used. This issue is limited to the X86 MSVC environment.
As described in the bug:
* _fltused should only be emitted for floating point operations as the
reference is used to initialize some parts of FP CRT support.
* Vector floating point operations on their own don't require that CRT
support.
Have confirmed intended behavior with MSVC team.
Fix alters usesMSVCFloatingPoint() to look for floating point
instructions/operands rather than floating point or vector floating
point.
Added:
llvm/test/CodeGen/X86/fltused_vec.ll
Modified:
llvm/lib/Target/X86/X86AsmPrinter.cpp
Removed:
################################################################################
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..6e63e2e7ff891
--- /dev/null
+++ b/llvm/test/CodeGen/X86/fltused_vec.ll
@@ -0,0 +1,29 @@
+; 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
+; RUN: llc < %s -mtriple x86_64-pc-win32 | FileCheck %s
+
+ 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
+; CHECK-NOT: .globl {{_?}}_fltused
More information about the llvm-commits
mailing list