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

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

>From 1b6f0da69436ceba34ce10caf28321b945f5ef82 Mon Sep 17 00:00:00 2001
From: David Green <[email protected]>
Date: Fri, 2 Jan 2026 13:24:56 +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             | 16 +++++
 .../llvm/Frontend/Driver/CodeGenOptions.h     |  4 ++
 llvm/lib/Frontend/Driver/CodeGenOptions.cpp   | 68 ++++++++-----------
 5 files changed, 51 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 c11b13de15d91..fc753b0da0680 100644
--- a/clang/lib/CodeGen/BackendUtil.cpp
+++ b/clang/lib/CodeGen/BackendUtil.cpp
@@ -464,36 +464,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..7ecf2ff025977
--- /dev/null
+++ b/flang/test/Driver/veclib-frem.f90
@@ -0,0 +1,16 @@
+! RUN: %flang %s -O3 -ffast-math -fveclib=ArmPL --target=aarch64 
-mcpu=neoverse-v1 -S -o - | FileCheck %s
+! REQUIRES: aarch64-registered-target
+
+! 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..53d4522b1e0c2 100644
--- a/llvm/lib/Frontend/Driver/CodeGenOptions.cpp
+++ b/llvm/lib/Frontend/Driver/CodeGenOptions.cpp
@@ -19,48 +19,36 @@ extern 
llvm::cl::opt<llvm::InstrProfCorrelator::ProfCorrelatorKind>
 
 namespace llvm::driver {
 
-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;
+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;
   default:
-    break;
+    llvm_unreachable("Unexpected driver::VectorLibrary");
   }
-  return TLII;
+}
+
+TargetLibraryInfoImpl *createTLII(const llvm::Triple &TargetTriple,
+                                  driver::VectorLibrary Veclib) {
+  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