3
3
function optimize! (@nospecialize (job:: CompilerJob ), mod:: LLVM.Module ; opt_level= 1 )
4
4
tm = llvm_machine (job. config. target)
5
5
6
- global current_job
6
+ global current_job # ScopedValue?
7
7
current_job = job
8
8
9
9
@dispose pb= NewPMPassBuilder () begin
@@ -14,6 +14,10 @@ function optimize!(@nospecialize(job::CompilerJob), mod::LLVM.Module; opt_level=
14
14
register! (pb, LowerKernelStatePass ())
15
15
register! (pb, CleanupKernelStatePass ())
16
16
17
+ for (name, callback) in PIPELINE_CALLBACKS
18
+ register! (pb, CallbackPass (name, callback))
19
+ end
20
+
17
21
add! (pb, NewPMModulePassManager ()) do mpm
18
22
buildNewPMPipeline! (mpm, job, opt_level)
19
23
end
@@ -24,6 +28,15 @@ function optimize!(@nospecialize(job::CompilerJob), mod::LLVM.Module; opt_level=
24
28
return
25
29
end
26
30
31
+ # TODO : Priority heap to provide order between different plugins
32
+ const PIPELINE_CALLBACKS = Dict {String, Any} ()
33
+ function register_plugin! (name:: String , plugin)
34
+ if haskey (PIPELINE_CALLBACKS, name)
35
+ error (" GPUCompiler plugin with name $name is already registered" )
36
+ end
37
+ PIPELINE_CALLBACKS[name] = plugin
38
+ end
39
+
27
40
function buildNewPMPipeline! (mpm, @nospecialize (job:: CompilerJob ), opt_level)
28
41
buildEarlySimplificationPipeline (mpm, job, opt_level)
29
42
add! (mpm, AlwaysInlinerPass ())
@@ -41,6 +54,9 @@ function buildNewPMPipeline!(mpm, @nospecialize(job::CompilerJob), opt_level)
41
54
add! (fpm, WarnMissedTransformationsPass ())
42
55
end
43
56
end
57
+ for (name, callback) in PIPELINE_CALLBACKS
58
+ add! (mpm, CallbackPass (name, callback))
59
+ end
44
60
buildIntrinsicLoweringPipeline (mpm, job, opt_level)
45
61
buildCleanupPipeline (mpm, job, opt_level)
46
62
end
@@ -423,3 +439,17 @@ function lower_ptls!(mod::LLVM.Module)
423
439
return changed
424
440
end
425
441
LowerPTLSPass () = NewPMModulePass (" GPULowerPTLS" , lower_ptls!)
442
+
443
+
444
+ function callback_pass! (name, callback:: F , mod:: LLVM.Module ) where F
445
+ job = current_job:: CompilerJob
446
+ changed = false
447
+
448
+ if haskey (functions (mod), name)
449
+ marker = functions (mod)[name]
450
+ changed = callback (job, marker, mod)
451
+ end
452
+ return changed
453
+ end
454
+
455
+ CallbackPass (name, callback) = NewPMModulePass (" CallbackPass<$name >" , (mod)-> callback_pass! (name, callback, mod))
0 commit comments