ruby-llvm-next 10.0.0

Sign up to get free protection for your applications and to get access to all the features.
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