summaryrefslogtreecommitdiffstats
path: root/source/x/mesa/patches/2d4fe5f229791fde52846b3f583c12508b5109d6.patch
blob: 3fa3282f2a82a3c34a31abb0f96781851f155af8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
From 2d4fe5f229791fde52846b3f583c12508b5109d6 Mon Sep 17 00:00:00 2001
From: Dave Airlie <airlied@redhat.com>
Date: Fri, 25 Aug 2023 12:43:44 +1000
Subject: clover/llvm: move to modern pass manager.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

This seems like it should work, but I haven't tested it yet.

Tested-by: Dieter Nützel <Dieter@nuetzel-hh.de>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24879>
---
 src/gallium/frontends/clover/llvm/invocation.cpp | 64 +++++++++++++++++++-----
 1 file changed, 51 insertions(+), 13 deletions(-)

diff --git a/src/gallium/frontends/clover/llvm/invocation.cpp b/src/gallium/frontends/clover/llvm/invocation.cpp
index 7a50fea3323..43d26fe1abb 100644
--- a/src/gallium/frontends/clover/llvm/invocation.cpp
+++ b/src/gallium/frontends/clover/llvm/invocation.cpp
@@ -27,13 +27,17 @@
 #include <llvm/IR/DiagnosticPrinter.h>
 #include <llvm/IR/DiagnosticInfo.h>
 #include <llvm/IR/LLVMContext.h>
+#include <llvm/IR/Module.h>
 #include <llvm/Support/raw_ostream.h>
-#include <llvm/Transforms/IPO/PassManagerBuilder.h>
+#include <llvm/Transforms/IPO/Internalize.h>
 #include <llvm-c/Target.h>
 #ifdef HAVE_CLOVER_SPIRV
 #include <LLVMSPIRVLib/LLVMSPIRVLib.h>
 #endif
 
+#include <llvm-c/TargetMachine.h>
+#include <llvm-c/Transforms/PassBuilder.h>
+#include <llvm/Support/CBindingWrapping.h>
 #include <clang/CodeGen/CodeGenAction.h>
 #include <clang/Lex/PreprocessorOptions.h>
 #include <clang/Frontend/TextDiagnosticBuffer.h>
@@ -439,10 +443,10 @@ clover::llvm::compile_program(const std::string &source,
 
 namespace {
    void
-   optimize(Module &mod, unsigned optimization_level,
+   optimize(Module &mod,
+            const std::string& ir_target,
+            unsigned optimization_level,
             bool internalize_symbols) {
-      ::llvm::legacy::PassManager pm;
-
       // By default, the function internalizer pass will look for a function
       // called "main" and then mark all other functions as internal.  Marking
       // functions as internal enables the optimizer to perform optimizations
@@ -458,19 +462,53 @@ namespace {
       if (internalize_symbols) {
          std::vector<std::string> names =
             map(std::mem_fn(&Function::getName), get_kernels(mod));
-         pm.add(::llvm::createInternalizePass(
+         internalizeModule(mod,
                       [=](const ::llvm::GlobalValue &gv) {
                          return std::find(names.begin(), names.end(),
                                           gv.getName()) != names.end();
-                      }));
+                      });
       }
 
-      ::llvm::PassManagerBuilder pmb;
-      pmb.OptLevel = optimization_level;
-      pmb.LibraryInfo = new ::llvm::TargetLibraryInfoImpl(
-         ::llvm::Triple(mod.getTargetTriple()));
-      pmb.populateModulePassManager(pm);
-      pm.run(mod);
+
+      const char *opt_str = NULL;
+      LLVMCodeGenOptLevel level;
+      switch (optimization_level) {
+      case 0:
+      default:
+         opt_str = "default<O0>";
+         level = LLVMCodeGenLevelNone;
+         break;
+      case 1:
+         opt_str = "default<O1>";
+         level = LLVMCodeGenLevelLess;
+         break;
+      case 2:
+         opt_str = "default<O2>";
+         level = LLVMCodeGenLevelDefault;
+         break;
+      case 3:
+         opt_str = "default<O3>";
+         level = LLVMCodeGenLevelAggressive;
+         break;
+      }
+
+      const target &target = ir_target;
+      LLVMTargetRef targ;
+      char *err_message;
+
+      if (LLVMGetTargetFromTriple(target.triple.c_str(), &targ, &err_message))
+         return;
+      LLVMTargetMachineRef tm =
+         LLVMCreateTargetMachine(targ, target.triple.c_str(),
+                                 target.cpu.c_str(), "", level,
+                                 LLVMRelocDefault, LLVMCodeModelDefault);
+
+      if (!tm)
+         return;
+      LLVMPassBuilderOptionsRef opts = LLVMCreatePassBuilderOptions();
+      LLVMRunPasses(wrap(&mod), opt_str, tm, opts);
+
+      LLVMDisposeTargetMachine(tm);
    }
 
    std::unique_ptr<Module>
@@ -500,7 +538,7 @@ clover::llvm::link_program(const std::vector<binary> &binaries,
    auto c = create_compiler_instance(dev, dev.ir_target(), options, r_log);
    auto mod = link(*ctx, *c, binaries, r_log);
 
-   optimize(*mod, c->getCodeGenOpts().OptimizationLevel, !create_library);
+   optimize(*mod, dev.ir_target(), c->getCodeGenOpts().OptimizationLevel, !create_library);
 
    static std::atomic_uint seq(0);
    const std::string id = "." + mod->getModuleIdentifier() + "-" +
-- 
cgit v1.2.1