llvmbot wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang-codegen

Author: David Green (davemgreen)

<details>
<summary>Changes</summary>

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

---
Full diff: https://github.com/llvm/llvm-project/pull/174209.diff


5 Files Affected:

- (modified) clang/lib/CodeGen/BackendUtil.cpp (+2-30) 
- (modified) flang/lib/Frontend/CompilerInstance.cpp (+1) 
- (added) flang/test/Driver/veclib-frem.f90 (+16) 
- (modified) llvm/include/llvm/Frontend/Driver/CodeGenOptions.h (+4) 
- (modified) llvm/lib/Frontend/Driver/CodeGenOptions.cpp (+28-40) 


``````````diff
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() {

``````````

</details>


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

Reply via email to