https://github.com/davemgreen updated 
https://github.com/llvm/llvm-project/pull/174209

>From 391e0ed6a0f6f8a26e08ec5d2fe95639dbe61555 Mon Sep 17 00:00:00 2001
From: David Green <[email protected]>
Date: Thu, 8 Jan 2026 08:52:52 +0000
Subject: [PATCH] [Flang][VecLib] Ensure TargetMachine->VecLib is set for flang
 invocations.

This ensures that both the midend and backend see consistent values for VecLib,
so that for example frem can be selected correctly.

The test involves running the front-end, midend (to vectorize) and backend to
prove it can lower the vector frem call.

Fixes #172483
---
 clang/lib/CodeGen/BackendUtil.cpp             | 32 +--------
 flang/lib/Frontend/CompilerInstance.cpp       |  1 +
 flang/test/Driver/veclib-frem.f90             | 23 +++++++
 .../llvm/Frontend/Driver/CodeGenOptions.h     |  4 ++
 llvm/lib/Frontend/Driver/CodeGenOptions.cpp   | 67 ++++++++-----------
 5 files changed, 57 insertions(+), 70 deletions(-)
 create mode 100644 flang/test/Driver/veclib-frem.f90

diff --git a/clang/lib/CodeGen/BackendUtil.cpp 
b/clang/lib/CodeGen/BackendUtil.cpp
index c5ea8c9e8c3de..26794a9cbc11d 100644
--- a/clang/lib/CodeGen/BackendUtil.cpp
+++ b/clang/lib/CodeGen/BackendUtil.cpp
@@ -466,36 +466,8 @@ static bool initTargetOptions(const CompilerInstance &CI,
   Options.Hotpatch = CodeGenOpts.HotPatch;
   Options.JMCInstrument = CodeGenOpts.JMCInstrument;
   Options.XCOFFReadOnlyPointers = CodeGenOpts.XCOFFReadOnlyPointers;
-
-  switch (CodeGenOpts.getVecLib()) {
-  case llvm::driver::VectorLibrary::NoLibrary:
-    Options.VecLib = llvm::VectorLibrary::NoLibrary;
-    break;
-  case llvm::driver::VectorLibrary::Accelerate:
-    Options.VecLib = llvm::VectorLibrary::Accelerate;
-    break;
-  case llvm::driver::VectorLibrary::Darwin_libsystem_m:
-    Options.VecLib = llvm::VectorLibrary::DarwinLibSystemM;
-    break;
-  case llvm::driver::VectorLibrary::LIBMVEC:
-    Options.VecLib = llvm::VectorLibrary::LIBMVEC;
-    break;
-  case llvm::driver::VectorLibrary::MASSV:
-    Options.VecLib = llvm::VectorLibrary::MASSV;
-    break;
-  case llvm::driver::VectorLibrary::SVML:
-    Options.VecLib = llvm::VectorLibrary::SVML;
-    break;
-  case llvm::driver::VectorLibrary::SLEEF:
-    Options.VecLib = llvm::VectorLibrary::SLEEFGNUABI;
-    break;
-  case llvm::driver::VectorLibrary::ArmPL:
-    Options.VecLib = llvm::VectorLibrary::ArmPL;
-    break;
-  case llvm::driver::VectorLibrary::AMDLIBM:
-    Options.VecLib = llvm::VectorLibrary::AMDLIBM;
-    break;
-  }
+  Options.VecLib =
+      convertDriverVectorLibraryToVectorLibrary(CodeGenOpts.getVecLib());
 
   switch (CodeGenOpts.getSwiftAsyncFramePointer()) {
   case CodeGenOptions::SwiftAsyncFramePointerKind::Auto:
diff --git a/flang/lib/Frontend/CompilerInstance.cpp 
b/flang/lib/Frontend/CompilerInstance.cpp
index 5920ed82114f8..851cd1f47afd2 100644
--- a/flang/lib/Frontend/CompilerInstance.cpp
+++ b/flang/lib/Frontend/CompilerInstance.cpp
@@ -364,6 +364,7 @@ bool CompilerInstance::setUpTargetMachine() {
 
   llvm::TargetOptions tOpts = llvm::TargetOptions();
   tOpts.EnableAIXExtendedAltivecABI = targetOpts.EnableAIXExtendedAltivecABI;
+  tOpts.VecLib = convertDriverVectorLibraryToVectorLibrary(CGOpts.getVecLib());
 
   targetMachine.reset(theTarget->createTargetMachine(
       triple, /*CPU=*/targetOpts.cpu,
diff --git a/flang/test/Driver/veclib-frem.f90 
b/flang/test/Driver/veclib-frem.f90
new file mode 100644
index 0000000000000..c7741ffea6442
--- /dev/null
+++ b/flang/test/Driver/veclib-frem.f90
@@ -0,0 +1,23 @@
+! RUN: %flang %s -O3 -ffast-math -fveclib=ArmPL --target=aarch64 
-mcpu=neoverse-v1 -S -o - | FileCheck %s
+! REQUIRES: aarch64-registered-target
+
+! This test checks that veclib works from flang through the pipeline:
+!  The modulo is turned into a loop with double frem.
+!  The frem is vectorized in the loop vectorizer using fveclib=ArmPL to a
+!    <vscale x 2 x double> frem.
+!  The <vscale x 2 x double> frem is converted to a call to armpl_svfmod_f64_x
+!    in the backend.
+
+! CHECK-LABEL: frem_kernel_
+! CHECK: bl armpl_svfmod_f64_x
+
+  subroutine frem_kernel(a, b, c, n)
+    integer, intent(in) :: n
+    real(8), intent(in)  :: a(n), b(n)
+    real(8), intent(out) :: c(n)
+    integer :: i
+
+    do i = 1, n
+       c(i) = modulo(a(i), b(i))
+    end do
+  end subroutine frem_kernel
\ No newline at end of file
diff --git a/llvm/include/llvm/Frontend/Driver/CodeGenOptions.h 
b/llvm/include/llvm/Frontend/Driver/CodeGenOptions.h
index 17ba28b6de443..77ab477986d31 100644
--- a/llvm/include/llvm/Frontend/Driver/CodeGenOptions.h
+++ b/llvm/include/llvm/Frontend/Driver/CodeGenOptions.h
@@ -19,6 +19,7 @@
 namespace llvm {
 class Triple;
 class TargetLibraryInfoImpl;
+enum class VectorLibrary;
 } // namespace llvm
 
 namespace llvm::driver {
@@ -49,6 +50,9 @@ enum class VectorLibrary {
   AMDLIBM             // AMD vector math library.
 };
 
+LLVM_ABI llvm::VectorLibrary
+convertDriverVectorLibraryToVectorLibrary(llvm::driver::VectorLibrary VecLib);
+
 LLVM_ABI TargetLibraryInfoImpl *createTLII(const llvm::Triple &TargetTriple,
                                            VectorLibrary Veclib);
 
diff --git a/llvm/lib/Frontend/Driver/CodeGenOptions.cpp 
b/llvm/lib/Frontend/Driver/CodeGenOptions.cpp
index 4e1602703fb35..d22202598a28d 100644
--- a/llvm/lib/Frontend/Driver/CodeGenOptions.cpp
+++ b/llvm/lib/Frontend/Driver/CodeGenOptions.cpp
@@ -19,48 +19,35 @@ extern 
llvm::cl::opt<llvm::InstrProfCorrelator::ProfCorrelatorKind>
 
 namespace llvm::driver {
 
+llvm::VectorLibrary
+convertDriverVectorLibraryToVectorLibrary(llvm::driver::VectorLibrary VecLib) {
+  switch (VecLib) {
+  case llvm::driver::VectorLibrary::NoLibrary:
+    return llvm::VectorLibrary::NoLibrary;
+  case llvm::driver::VectorLibrary::Accelerate:
+    return llvm::VectorLibrary::Accelerate;
+  case llvm::driver::VectorLibrary::Darwin_libsystem_m:
+    return llvm::VectorLibrary::DarwinLibSystemM;
+  case llvm::driver::VectorLibrary::LIBMVEC:
+    return llvm::VectorLibrary::LIBMVEC;
+  case llvm::driver::VectorLibrary::MASSV:
+    return llvm::VectorLibrary::MASSV;
+  case llvm::driver::VectorLibrary::SVML:
+    return llvm::VectorLibrary::SVML;
+  case llvm::driver::VectorLibrary::SLEEF:
+    return llvm::VectorLibrary::SLEEFGNUABI;
+  case llvm::driver::VectorLibrary::ArmPL:
+    return llvm::VectorLibrary::ArmPL;
+  case llvm::driver::VectorLibrary::AMDLIBM:
+    return llvm::VectorLibrary::AMDLIBM;
+  }
+  llvm_unreachable("Unexpected driver::VectorLibrary");
+}
+
 TargetLibraryInfoImpl *createTLII(const llvm::Triple &TargetTriple,
                                   driver::VectorLibrary Veclib) {
-  TargetLibraryInfoImpl *TLII = new TargetLibraryInfoImpl(TargetTriple);
-
-  using VectorLibrary = llvm::driver::VectorLibrary;
-  switch (Veclib) {
-  case VectorLibrary::Accelerate:
-    TLII->addVectorizableFunctionsFromVecLib(llvm::VectorLibrary::Accelerate,
-                                             TargetTriple);
-    break;
-  case VectorLibrary::LIBMVEC:
-    TLII->addVectorizableFunctionsFromVecLib(llvm::VectorLibrary::LIBMVEC,
-                                             TargetTriple);
-    break;
-  case VectorLibrary::MASSV:
-    TLII->addVectorizableFunctionsFromVecLib(llvm::VectorLibrary::MASSV,
-                                             TargetTriple);
-    break;
-  case VectorLibrary::SVML:
-    TLII->addVectorizableFunctionsFromVecLib(llvm::VectorLibrary::SVML,
-                                             TargetTriple);
-    break;
-  case VectorLibrary::SLEEF:
-    TLII->addVectorizableFunctionsFromVecLib(llvm::VectorLibrary::SLEEFGNUABI,
-                                             TargetTriple);
-    break;
-  case VectorLibrary::Darwin_libsystem_m:
-    TLII->addVectorizableFunctionsFromVecLib(
-        llvm::VectorLibrary::DarwinLibSystemM, TargetTriple);
-    break;
-  case VectorLibrary::ArmPL:
-    TLII->addVectorizableFunctionsFromVecLib(llvm::VectorLibrary::ArmPL,
-                                             TargetTriple);
-    break;
-  case VectorLibrary::AMDLIBM:
-    TLII->addVectorizableFunctionsFromVecLib(llvm::VectorLibrary::AMDLIBM,
-                                             TargetTriple);
-    break;
-  default:
-    break;
-  }
-  return TLII;
+  return new TargetLibraryInfoImpl(
+      TargetTriple, convertDriverVectorLibraryToVectorLibrary(Veclib));
 }
 
 std::string getDefaultProfileGenName() {

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to