ruby-llvm-next 10.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +30 -0
  3. data/README.md +67 -0
  4. data/ext/ruby-llvm-support/Rakefile +110 -0
  5. data/ext/ruby-llvm-support/support.cpp +32 -0
  6. data/lib/llvm.rb +29 -0
  7. data/lib/llvm/analysis.rb +49 -0
  8. data/lib/llvm/analysis_ffi.rb +77 -0
  9. data/lib/llvm/config.rb +10 -0
  10. data/lib/llvm/core.rb +97 -0
  11. data/lib/llvm/core/bitcode.rb +84 -0
  12. data/lib/llvm/core/bitcode_ffi.rb +132 -0
  13. data/lib/llvm/core/builder.rb +944 -0
  14. data/lib/llvm/core/context.rb +24 -0
  15. data/lib/llvm/core/module.rb +240 -0
  16. data/lib/llvm/core/pass_manager.rb +80 -0
  17. data/lib/llvm/core/type.rb +210 -0
  18. data/lib/llvm/core/value.rb +1005 -0
  19. data/lib/llvm/core_ffi.rb +6021 -0
  20. data/lib/llvm/execution_engine.rb +323 -0
  21. data/lib/llvm/execution_engine_ffi.rb +421 -0
  22. data/lib/llvm/linker.rb +16 -0
  23. data/lib/llvm/linker_ffi.rb +44 -0
  24. data/lib/llvm/support.rb +38 -0
  25. data/lib/llvm/target.rb +318 -0
  26. data/lib/llvm/target_ffi.rb +628 -0
  27. data/lib/llvm/transforms/builder.rb +107 -0
  28. data/lib/llvm/transforms/builder_ffi.rb +117 -0
  29. data/lib/llvm/transforms/ipo.rb +78 -0
  30. data/lib/llvm/transforms/ipo_ffi.rb +127 -0
  31. data/lib/llvm/transforms/scalar.rb +152 -0
  32. data/lib/llvm/transforms/scalar_ffi.rb +344 -0
  33. data/lib/llvm/transforms/vectorize.rb +22 -0
  34. data/lib/llvm/transforms/vectorize_ffi.rb +38 -0
  35. data/lib/llvm/version.rb +5 -0
  36. data/test/array_test.rb +38 -0
  37. data/test/basic_block_test.rb +87 -0
  38. data/test/binary_operations_test.rb +58 -0
  39. data/test/bitcode_test.rb +24 -0
  40. data/test/branch_test.rb +57 -0
  41. data/test/call_test.rb +82 -0
  42. data/test/comparisons_test.rb +66 -0
  43. data/test/conversions_test.rb +92 -0
  44. data/test/double_test.rb +34 -0
  45. data/test/equality_test.rb +89 -0
  46. data/test/function_test.rb +100 -0
  47. data/test/generic_value_test.rb +22 -0
  48. data/test/instruction_test.rb +30 -0
  49. data/test/ipo_test.rb +53 -0
  50. data/test/linker_test.rb +37 -0
  51. data/test/mcjit_test.rb +94 -0
  52. data/test/memory_access_test.rb +38 -0
  53. data/test/module_test.rb +93 -0
  54. data/test/parameter_collection_test.rb +28 -0
  55. data/test/pass_manager_builder_test.rb +53 -0
  56. data/test/phi_test.rb +33 -0
  57. data/test/select_test.rb +22 -0
  58. data/test/struct_test.rb +98 -0
  59. data/test/target_test.rb +113 -0
  60. data/test/test_helper.rb +62 -0
  61. data/test/type_test.rb +15 -0
  62. data/test/vector_test.rb +64 -0
  63. metadata +240 -0
@@ -0,0 +1,107 @@
1
+ require 'llvm'
2
+ require 'llvm/core'
3
+ require 'llvm/transforms/builder_ffi'
4
+
5
+ module LLVM
6
+ class PassManagerBuilder
7
+ include PointerIdentity
8
+
9
+ attr_reader :size_level
10
+ attr_reader :opt_level
11
+ attr_reader :unit_at_a_time
12
+ attr_reader :unroll_loops
13
+ attr_reader :simplify_lib_calls
14
+ attr_reader :inliner_threshold
15
+
16
+ def initialize
17
+ @ptr = C.pass_manager_builder_create
18
+
19
+ @size_level = 0
20
+ @opt_level = 0
21
+ @unit_at_a_time = false
22
+ @unroll_loops = false
23
+ @simplify_lib_calls = false
24
+ @inliner_threshold = 0
25
+ end
26
+
27
+ def dispose
28
+ return if @ptr.nil?
29
+
30
+ C.pass_manager_builder_dispose(@ptr)
31
+ @ptr = nil
32
+ end
33
+
34
+ # Specify the basic optimization level.
35
+ # @param [Integer] level 0 = -O0, 1 = -O1, 2 = -O2, 3 = -O3
36
+ def opt_level=(level)
37
+ @opt_level = level.to_i
38
+ C.pass_manager_builder_set_opt_level(self, @opt_level)
39
+ end
40
+
41
+ # How much we're optimizing for size.
42
+ # @param [Integer] level 0 = none, 1 = -Os, 2 = -Oz
43
+ def size_level=(level)
44
+ @size_level = level.to_i
45
+ C.pass_manager_builder_set_size_level(self, @size_level)
46
+ end
47
+
48
+ # @param [Boolean] do_unit_at_a_time
49
+ def unit_at_a_time=(do_unit_at_a_time)
50
+ @unit_at_a_time = do_unit_at_a_time
51
+ C.pass_manager_builder_set_disable_unit_at_a_time(self, flag(!@unit_at_a_time))
52
+ end
53
+
54
+ # @param [Boolean] do_unroll
55
+ def unroll_loops=(do_unroll)
56
+ @unroll_loops = do_unroll
57
+ C.pass_manager_builder_set_disable_unroll_loops(self, flag(!@unroll_loops))
58
+ end
59
+
60
+ # @param [Boolean] do_simplify_lib_calls
61
+ def simplify_lib_calls=(do_simplify_lib_calls)
62
+ @simplify_lib_calls = do_simplify_lib_calls
63
+ C.pass_manager_builder_set_disable_simplify_lib_calls(self, flag(!@simplify_lib_calls))
64
+ end
65
+
66
+ # @param [Integer] threshold 0 = -O1, 225 = -O2, 275 = -O3
67
+ def inliner_threshold=(threshold)
68
+ @inliner_threshold = threshold
69
+ C.pass_manager_builder_use_inliner_with_threshold(self, @inliner_threshold)
70
+ end
71
+
72
+ # Populate a pass manager.
73
+ # @param [PassManager, FunctionPassManager] pass_manager
74
+ def build(pass_manager)
75
+ case pass_manager
76
+ when FunctionPassManager
77
+ C.pass_manager_builder_populate_function_pass_manager(self, pass_manager)
78
+
79
+ when PassManager
80
+ C.pass_manager_builder_populate_module_pass_manager(self, pass_manager)
81
+ end
82
+ end
83
+
84
+ # Populate an LTO pass manager.
85
+ # @param [PassManager] pass_manager
86
+ def build_with_lto(pass_manager, internalize = false, run_inliner = false)
87
+ if pass_manager.is_a?(FunctionPassManager)
88
+ raise ArgumentError, "FunctionPassManager does not support LTO"
89
+ end
90
+
91
+ if internalize.kind_of?(Integer) || run_inliner.kind_of?(Integer)
92
+ warn 'Warning: Passing Integer value to LLVM::PassManagerBuilder#build_with_lto is deprecated.'
93
+ internalize = !internalize.zero? if internalize.kind_of?(Integer)
94
+ run_inliner = !run_inliner.zero? if run_inliner.kind_of?(Integer)
95
+ end
96
+
97
+ C.pass_manager_builder_populate_lto_pass_manager(self,
98
+ pass_manager, flag(internalize), flag(run_inliner))
99
+ end
100
+
101
+ private
102
+
103
+ def flag(boolean)
104
+ boolean ? 1 : 0
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,117 @@
1
+ # Generated by ffi_gen. Please do not change this file by hand.
2
+
3
+ require 'ffi'
4
+
5
+ module LLVM::C
6
+ extend FFI::Library
7
+ ffi_lib ["libLLVM-10.so.1", "LLVM-10"]
8
+
9
+ def self.attach_function(name, *_)
10
+ begin; super; rescue FFI::NotFoundError => e
11
+ (class << self; self; end).class_eval { define_method(name) { |*_| raise e } }
12
+ end
13
+ end
14
+
15
+ # (Not documented)
16
+ class OpaquePassManagerBuilder < FFI::Struct
17
+ layout :dummy, :char
18
+ end
19
+
20
+ # See llvm::PassManagerBuilder.
21
+ #
22
+ # @method pass_manager_builder_create()
23
+ # @return [OpaquePassManagerBuilder]
24
+ # @scope class
25
+ attach_function :pass_manager_builder_create, :LLVMPassManagerBuilderCreate, [], OpaquePassManagerBuilder
26
+
27
+ # (Not documented)
28
+ #
29
+ # @method pass_manager_builder_dispose(pmb)
30
+ # @param [OpaquePassManagerBuilder] pmb
31
+ # @return [nil]
32
+ # @scope class
33
+ attach_function :pass_manager_builder_dispose, :LLVMPassManagerBuilderDispose, [OpaquePassManagerBuilder], :void
34
+
35
+ # See llvm::PassManagerBuilder::OptLevel.
36
+ #
37
+ # @method pass_manager_builder_set_opt_level(pmb, opt_level)
38
+ # @param [OpaquePassManagerBuilder] pmb
39
+ # @param [Integer] opt_level
40
+ # @return [nil]
41
+ # @scope class
42
+ attach_function :pass_manager_builder_set_opt_level, :LLVMPassManagerBuilderSetOptLevel, [OpaquePassManagerBuilder, :uint], :void
43
+
44
+ # See llvm::PassManagerBuilder::SizeLevel.
45
+ #
46
+ # @method pass_manager_builder_set_size_level(pmb, size_level)
47
+ # @param [OpaquePassManagerBuilder] pmb
48
+ # @param [Integer] size_level
49
+ # @return [nil]
50
+ # @scope class
51
+ attach_function :pass_manager_builder_set_size_level, :LLVMPassManagerBuilderSetSizeLevel, [OpaquePassManagerBuilder, :uint], :void
52
+
53
+ # See llvm::PassManagerBuilder::DisableUnitAtATime.
54
+ #
55
+ # @method pass_manager_builder_set_disable_unit_at_a_time(pmb, value)
56
+ # @param [OpaquePassManagerBuilder] pmb
57
+ # @param [Integer] value
58
+ # @return [nil]
59
+ # @scope class
60
+ attach_function :pass_manager_builder_set_disable_unit_at_a_time, :LLVMPassManagerBuilderSetDisableUnitAtATime, [OpaquePassManagerBuilder, :int], :void
61
+
62
+ # See llvm::PassManagerBuilder::DisableUnrollLoops.
63
+ #
64
+ # @method pass_manager_builder_set_disable_unroll_loops(pmb, value)
65
+ # @param [OpaquePassManagerBuilder] pmb
66
+ # @param [Integer] value
67
+ # @return [nil]
68
+ # @scope class
69
+ attach_function :pass_manager_builder_set_disable_unroll_loops, :LLVMPassManagerBuilderSetDisableUnrollLoops, [OpaquePassManagerBuilder, :int], :void
70
+
71
+ # See llvm::PassManagerBuilder::DisableSimplifyLibCalls
72
+ #
73
+ # @method pass_manager_builder_set_disable_simplify_lib_calls(pmb, value)
74
+ # @param [OpaquePassManagerBuilder] pmb
75
+ # @param [Integer] value
76
+ # @return [nil]
77
+ # @scope class
78
+ attach_function :pass_manager_builder_set_disable_simplify_lib_calls, :LLVMPassManagerBuilderSetDisableSimplifyLibCalls, [OpaquePassManagerBuilder, :int], :void
79
+
80
+ # See llvm::PassManagerBuilder::Inliner.
81
+ #
82
+ # @method pass_manager_builder_use_inliner_with_threshold(pmb, threshold)
83
+ # @param [OpaquePassManagerBuilder] pmb
84
+ # @param [Integer] threshold
85
+ # @return [nil]
86
+ # @scope class
87
+ attach_function :pass_manager_builder_use_inliner_with_threshold, :LLVMPassManagerBuilderUseInlinerWithThreshold, [OpaquePassManagerBuilder, :uint], :void
88
+
89
+ # See llvm::PassManagerBuilder::populateFunctionPassManager.
90
+ #
91
+ # @method pass_manager_builder_populate_function_pass_manager(pmb, pm)
92
+ # @param [OpaquePassManagerBuilder] pmb
93
+ # @param [FFI::Pointer(PassManagerRef)] pm
94
+ # @return [nil]
95
+ # @scope class
96
+ attach_function :pass_manager_builder_populate_function_pass_manager, :LLVMPassManagerBuilderPopulateFunctionPassManager, [OpaquePassManagerBuilder, :pointer], :void
97
+
98
+ # See llvm::PassManagerBuilder::populateModulePassManager.
99
+ #
100
+ # @method pass_manager_builder_populate_module_pass_manager(pmb, pm)
101
+ # @param [OpaquePassManagerBuilder] pmb
102
+ # @param [FFI::Pointer(PassManagerRef)] pm
103
+ # @return [nil]
104
+ # @scope class
105
+ attach_function :pass_manager_builder_populate_module_pass_manager, :LLVMPassManagerBuilderPopulateModulePassManager, [OpaquePassManagerBuilder, :pointer], :void
106
+
107
+ # See llvm::PassManagerBuilder::populateLTOPassManager.
108
+ #
109
+ # @method pass_manager_builder_populate_lto_pass_manager(pmb, pm, internalize, run_inliner)
110
+ # @param [OpaquePassManagerBuilder] pmb
111
+ # @param [FFI::Pointer(PassManagerRef)] pm
112
+ # @param [Integer] internalize
113
+ # @param [Integer] run_inliner
114
+ # @return [nil]
115
+ # @scope class
116
+ attach_function :pass_manager_builder_populate_lto_pass_manager, :LLVMPassManagerBuilderPopulateLTOPassManager, [OpaquePassManagerBuilder, :pointer, :int, :int], :void
117
+ end
@@ -0,0 +1,78 @@
1
+ # Interprocedural optimization (IPO)
2
+ require 'llvm'
3
+ require 'llvm/core'
4
+ require 'llvm/transforms/ipo_ffi'
5
+
6
+ module LLVM
7
+ class PassManager
8
+ # @LLVMpass arg_promotion
9
+ def arg_promote!
10
+ C.add_argument_promotion_pass(self)
11
+ end
12
+
13
+ # @LLVMpass const_merge
14
+ def const_merge!
15
+ C.add_constant_merge_pass(self)
16
+ end
17
+
18
+ # @LLVMpass dae
19
+ def dae!
20
+ C.add_dead_arg_elimination(self)
21
+ end
22
+
23
+ # @LLVMpass function_attrs
24
+ def fun_attrs!
25
+ C.add_function_attrs_pass(self)
26
+ end
27
+
28
+ # @LLVMpass inline
29
+ def inline!
30
+ C.add_function_inlining_pass(self)
31
+ end
32
+
33
+ # @LLVMpass always_inline
34
+ def always_inline!
35
+ C.add_always_inliner_pass(self)
36
+ end
37
+
38
+ # @LLVMpass gdce
39
+ def gdce!
40
+ C.add_global_dce_pass(self)
41
+ end
42
+
43
+ # @LLVMpass global_opt
44
+ def global_opt!
45
+ C.add_global_optimizer_pass(self)
46
+ end
47
+
48
+ # @LLVMpass ipcp
49
+ def ipcp!
50
+ C.add_ip_constant_propagation_pass(self)
51
+ end
52
+
53
+ # @LLVMpass prune_eh
54
+ def prune_eh!
55
+ C.add_prune_eh_pass(self)
56
+ end
57
+
58
+ # @LLVMpass ipsccp
59
+ def ipsccp!
60
+ C.add_ipsccp_pass(self)
61
+ end
62
+
63
+ # @LLVMpass internalize
64
+ def internalize!(all_but_main = true)
65
+ C.add_internalize_pass(self, all_but_main)
66
+ end
67
+
68
+ # @LLVMpass sdp
69
+ def sdp!
70
+ C.add_strip_dead_prototypes_pass(self)
71
+ end
72
+
73
+ # @LLVMpass strip
74
+ def strip!
75
+ C.add_strip_symbols_pass(self)
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,127 @@
1
+ # Generated by ffi_gen. Please do not change this file by hand.
2
+
3
+ require 'ffi'
4
+
5
+ module LLVM::C
6
+ extend FFI::Library
7
+ ffi_lib ["libLLVM-10.so.1", "LLVM-10"]
8
+
9
+ def self.attach_function(name, *_)
10
+ begin; super; rescue FFI::NotFoundError => e
11
+ (class << self; self; end).class_eval { define_method(name) { |*_| raise e } }
12
+ end
13
+ end
14
+
15
+ # See llvm::createArgumentPromotionPass function.
16
+ #
17
+ # @method add_argument_promotion_pass(pm)
18
+ # @param [FFI::Pointer(PassManagerRef)] pm
19
+ # @return [nil]
20
+ # @scope class
21
+ attach_function :add_argument_promotion_pass, :LLVMAddArgumentPromotionPass, [:pointer], :void
22
+
23
+ # See llvm::createConstantMergePass function.
24
+ #
25
+ # @method add_constant_merge_pass(pm)
26
+ # @param [FFI::Pointer(PassManagerRef)] pm
27
+ # @return [nil]
28
+ # @scope class
29
+ attach_function :add_constant_merge_pass, :LLVMAddConstantMergePass, [:pointer], :void
30
+
31
+ # See llvm::createDeadArgEliminationPass function.
32
+ #
33
+ # @method add_dead_arg_elimination_pass(pm)
34
+ # @param [FFI::Pointer(PassManagerRef)] pm
35
+ # @return [nil]
36
+ # @scope class
37
+ attach_function :add_dead_arg_elimination_pass, :LLVMAddDeadArgEliminationPass, [:pointer], :void
38
+
39
+ # See llvm::createFunctionAttrsPass function.
40
+ #
41
+ # @method add_function_attrs_pass(pm)
42
+ # @param [FFI::Pointer(PassManagerRef)] pm
43
+ # @return [nil]
44
+ # @scope class
45
+ attach_function :add_function_attrs_pass, :LLVMAddFunctionAttrsPass, [:pointer], :void
46
+
47
+ # See llvm::createFunctionInliningPass function.
48
+ #
49
+ # @method add_function_inlining_pass(pm)
50
+ # @param [FFI::Pointer(PassManagerRef)] pm
51
+ # @return [nil]
52
+ # @scope class
53
+ attach_function :add_function_inlining_pass, :LLVMAddFunctionInliningPass, [:pointer], :void
54
+
55
+ # See llvm::createAlwaysInlinerPass function.
56
+ #
57
+ # @method add_always_inliner_pass(pm)
58
+ # @param [FFI::Pointer(PassManagerRef)] pm
59
+ # @return [nil]
60
+ # @scope class
61
+ attach_function :add_always_inliner_pass, :LLVMAddAlwaysInlinerPass, [:pointer], :void
62
+
63
+ # See llvm::createGlobalDCEPass function.
64
+ #
65
+ # @method add_global_dce_pass(pm)
66
+ # @param [FFI::Pointer(PassManagerRef)] pm
67
+ # @return [nil]
68
+ # @scope class
69
+ attach_function :add_global_dce_pass, :LLVMAddGlobalDCEPass, [:pointer], :void
70
+
71
+ # See llvm::createGlobalOptimizerPass function.
72
+ #
73
+ # @method add_global_optimizer_pass(pm)
74
+ # @param [FFI::Pointer(PassManagerRef)] pm
75
+ # @return [nil]
76
+ # @scope class
77
+ attach_function :add_global_optimizer_pass, :LLVMAddGlobalOptimizerPass, [:pointer], :void
78
+
79
+ # See llvm::createIPConstantPropagationPass function.
80
+ #
81
+ # @method add_ip_constant_propagation_pass(pm)
82
+ # @param [FFI::Pointer(PassManagerRef)] pm
83
+ # @return [nil]
84
+ # @scope class
85
+ attach_function :add_ip_constant_propagation_pass, :LLVMAddIPConstantPropagationPass, [:pointer], :void
86
+
87
+ # See llvm::createPruneEHPass function.
88
+ #
89
+ # @method add_prune_eh_pass(pm)
90
+ # @param [FFI::Pointer(PassManagerRef)] pm
91
+ # @return [nil]
92
+ # @scope class
93
+ attach_function :add_prune_eh_pass, :LLVMAddPruneEHPass, [:pointer], :void
94
+
95
+ # See llvm::createIPSCCPPass function.
96
+ #
97
+ # @method add_ipsccp_pass(pm)
98
+ # @param [FFI::Pointer(PassManagerRef)] pm
99
+ # @return [nil]
100
+ # @scope class
101
+ attach_function :add_ipsccp_pass, :LLVMAddIPSCCPPass, [:pointer], :void
102
+
103
+ # See llvm::createInternalizePass function.
104
+ #
105
+ # @method add_internalize_pass(pass_manager_ref, all_but_main)
106
+ # @param [FFI::Pointer(PassManagerRef)] pass_manager_ref
107
+ # @param [Integer] all_but_main
108
+ # @return [nil]
109
+ # @scope class
110
+ attach_function :add_internalize_pass, :LLVMAddInternalizePass, [:pointer, :uint], :void
111
+
112
+ # See llvm::createStripDeadPrototypesPass function.
113
+ #
114
+ # @method add_strip_dead_prototypes_pass(pm)
115
+ # @param [FFI::Pointer(PassManagerRef)] pm
116
+ # @return [nil]
117
+ # @scope class
118
+ attach_function :add_strip_dead_prototypes_pass, :LLVMAddStripDeadPrototypesPass, [:pointer], :void
119
+
120
+ # See llvm::createStripSymbolsPass function.
121
+ #
122
+ # @method add_strip_symbols_pass(pm)
123
+ # @param [FFI::Pointer(PassManagerRef)] pm
124
+ # @return [nil]
125
+ # @scope class
126
+ attach_function :add_strip_symbols_pass, :LLVMAddStripSymbolsPass, [:pointer], :void
127
+ end
@@ -0,0 +1,152 @@
1
+ require 'llvm'
2
+ require 'llvm/core'
3
+ require 'llvm/transforms/scalar_ffi'
4
+
5
+ module LLVM
6
+ class PassManager
7
+ # @LLVMpass adce
8
+ def adce!
9
+ C.add_aggressive_dce_pass(self)
10
+ end
11
+
12
+ # @LLVMpass simplifycfg
13
+ def simplifycfg!
14
+ C.add_cfg_simplification_pass(self)
15
+ end
16
+
17
+ # @LLVMpass dse
18
+ def dse!
19
+ C.add_dead_store_elimination_pass(self)
20
+ end
21
+
22
+ # @LLVMpass gvn
23
+ def gvn!
24
+ C.add_gvn_pass(self)
25
+ end
26
+
27
+ # @LLVMpass indvars
28
+ def indvars!
29
+ C.add_ind_var_simplify_pass(self)
30
+ end
31
+
32
+ # @LLVMpass instcombine
33
+ def instcombine!
34
+ C.add_instruction_combining_pass(self)
35
+ end
36
+
37
+ # @LLVMpass jump-threading
38
+ def jump_threading!
39
+ C.add_jump_threading_pass(self)
40
+ end
41
+
42
+ # @LLVMpass licm
43
+ def licm!
44
+ C.add_licm_pass(self)
45
+ end
46
+
47
+ # @LLVMpass loop-deletion
48
+ def loop_deletion!
49
+ C.add_loop_deletion_pass(self)
50
+ end
51
+
52
+ # @LLVMpass loop-idiom
53
+ def loop_idiom!
54
+ C.add_loop_idiom_pass(self)
55
+ end
56
+
57
+ # @LLVMpass loop-rotate
58
+ def loop_rotate!
59
+ C.add_loop_rotate_pass(self)
60
+ end
61
+
62
+ # @LLVMpass loop-unroll
63
+ def loop_unroll!
64
+ C.add_loop_unroll_pass(self)
65
+ end
66
+
67
+ # @LLVMpass loop-unswitch
68
+ def loop_unswitch!
69
+ C.add_loop_unswitch_pass(self)
70
+ end
71
+
72
+ # @LLVMpass memcpyopt
73
+ def memcpyopt!
74
+ C.add_mem_cpy_opt_pass(self)
75
+ end
76
+
77
+ # @LLVMpass mem2reg
78
+ def mem2reg!
79
+ C.add_promote_memory_to_register_pass(self)
80
+ end
81
+
82
+ # @LLVMpass reassociate
83
+ def reassociate!
84
+ C.add_reassociate_pass(self)
85
+ end
86
+
87
+ # @LLVMpass sccp
88
+ def sccp!
89
+ C.add_sccp_pass(self)
90
+ end
91
+
92
+ # @LLVMpass scalarrepl
93
+ def scalarrepl!
94
+ C.add_scalar_repl_aggregates_pass(self)
95
+ end
96
+
97
+ # @LLVMpass scalarrepl
98
+ def scalarrepl_ssa!
99
+ C.add_scalar_repl_aggregates_pass_ssa(self)
100
+ end
101
+
102
+ # @LLVMpass scalarrepl
103
+ def scalarrepl_threshold!(threshold)
104
+ C.add_scalar_repl_aggregates_pass(self, threshold)
105
+ end
106
+
107
+ # @LLVMpass simplify-libcalls
108
+ def simplify_libcalls!
109
+ C.add_simplify_lib_calls_pass(self)
110
+ end
111
+
112
+ # @LLVMpass tailcallelim
113
+ def tailcallelim!
114
+ C.add_tail_call_elimination_pass(self)
115
+ end
116
+
117
+ # @LLVMpass constprop
118
+ def constprop!
119
+ C.add_constant_propagation_pass(self)
120
+ end
121
+
122
+ # @LLVMpass reg2mem
123
+ def reg2mem!
124
+ C.add_demote_memory_to_register_pass(self)
125
+ end
126
+
127
+ # @LLVMpass cvprop
128
+ def cvprop!
129
+ C.add_correlated_value_propagation_pass(self)
130
+ end
131
+
132
+ # @LLVMpass early-cse
133
+ def early_cse!
134
+ C.add_early_cse_pass(self)
135
+ end
136
+
137
+ # @LLVMpass lower-expect
138
+ def lower_expect!
139
+ C.add_lower_expect_intrinsic_pass(self)
140
+ end
141
+
142
+ # @LLVMpass tbaa
143
+ def tbaa!
144
+ C.add_type_based_alias_analysis_pass(self)
145
+ end
146
+
147
+ # @LLVMpass basicaa
148
+ def basicaa!
149
+ C.add_basic_alias_analysis_pass(self)
150
+ end
151
+ end
152
+ end