7
7
from llvmlite_artiq import ir as ll
8
8
from .. import types , builtins , ir
9
9
10
+
11
+ llvoid = ll .VoidType ()
12
+ lli1 = ll .IntType (1 )
13
+ lli8 = ll .IntType (8 )
14
+ lli32 = ll .IntType (32 )
15
+ lldouble = ll .DoubleType ()
16
+ llptr = ll .IntType (8 ).as_pointer ()
17
+ llemptyptr = ll .LiteralStructType ( []).as_pointer ()
18
+
19
+
10
20
class LLVMIRGenerator :
11
21
def __init__ (self , engine , module_name , target ):
12
22
self .engine = engine
@@ -26,11 +36,11 @@ def llty_of_type(self, typ, bare=False, for_return=False):
26
36
return ll .LiteralStructType ([self .llty_of_type (eltty ) for eltty in typ .elts ])
27
37
elif types .is_rpc_function (typ ):
28
38
if for_return :
29
- return ll . VoidType ()
39
+ return llvoid
30
40
else :
31
41
return ll .LiteralStructType ([])
32
42
elif types .is_function (typ ):
33
- envarg = ll . IntType ( 8 ). as_pointer ()
43
+ envarg = llptr
34
44
llty = ll .FunctionType (args = [envarg ] +
35
45
[self .llty_of_type (typ .args [arg ])
36
46
for arg in typ .args ] +
@@ -43,27 +53,27 @@ def llty_of_type(self, typ, bare=False, for_return=False):
43
53
return ll .LiteralStructType ([envarg , llty .as_pointer ()])
44
54
elif builtins .is_none (typ ):
45
55
if for_return :
46
- return ll . VoidType ()
56
+ return llvoid
47
57
else :
48
58
return ll .LiteralStructType ([])
49
59
elif builtins .is_bool (typ ):
50
- return ll . IntType ( 1 )
60
+ return lli1
51
61
elif builtins .is_int (typ ):
52
62
return ll .IntType (builtins .get_int_width (typ ))
53
63
elif builtins .is_float (typ ):
54
- return ll . DoubleType ()
64
+ return lldouble
55
65
elif builtins .is_str (typ ) or ir .is_exn_typeinfo (typ ):
56
- return ll . IntType ( 8 ). as_pointer ()
66
+ return llptr
57
67
elif builtins .is_list (typ ):
58
68
lleltty = self .llty_of_type (builtins .get_iterable_elt (typ ))
59
- return ll .LiteralStructType ([ll . IntType ( 32 ) , lleltty .as_pointer ()])
69
+ return ll .LiteralStructType ([lli32 , lleltty .as_pointer ()])
60
70
elif builtins .is_range (typ ):
61
71
lleltty = self .llty_of_type (builtins .get_iterable_elt (typ ))
62
72
return ll .LiteralStructType ([lleltty , lleltty , lleltty ])
63
73
elif ir .is_basic_block (typ ):
64
- return ll . IntType ( 8 ). as_pointer ()
74
+ return llptr
65
75
elif ir .is_option (typ ):
66
- return ll .LiteralStructType ([ll . IntType ( 1 ) , self .llty_of_type (typ .params ["inner" ])])
76
+ return ll .LiteralStructType ([lli1 , self .llty_of_type (typ .params ["inner" ])])
67
77
elif ir .is_environment (typ ):
68
78
llty = ll .LiteralStructType ([self .llty_of_type (typ .params [name ])
69
79
for name in typ .params ])
@@ -117,14 +127,14 @@ def llconst_of_const(self, const):
117
127
118
128
llconst = self .llmodule .get_global (name )
119
129
if llconst is None :
120
- llstrty = ll .ArrayType (ll . IntType ( 8 ) , len (as_bytes ))
130
+ llstrty = ll .ArrayType (lli8 , len (as_bytes ))
121
131
llconst = ll .GlobalVariable (self .llmodule , llstrty , name )
122
132
llconst .global_constant = True
123
133
llconst .initializer = ll .Constant (llstrty , bytearray (as_bytes ))
124
134
llconst .linkage = linkage
125
135
llconst .unnamed_addr = unnamed_addr
126
136
127
- return llconst .bitcast (ll . IntType ( 8 ). as_pointer () )
137
+ return llconst .bitcast (llptr )
128
138
else :
129
139
assert False
130
140
@@ -134,36 +144,36 @@ def llbuiltin(self, name):
134
144
return llfun
135
145
136
146
if name in "llvm.donothing" :
137
- llty = ll .FunctionType (ll . VoidType () , [])
147
+ llty = ll .FunctionType (llvoid , [])
138
148
elif name in "llvm.trap" :
139
- llty = ll .FunctionType (ll . VoidType () , [])
149
+ llty = ll .FunctionType (llvoid , [])
140
150
elif name == "llvm.floor.f64" :
141
- llty = ll .FunctionType (ll . DoubleType () , [ll . DoubleType () ])
151
+ llty = ll .FunctionType (lldouble , [lldouble ])
142
152
elif name == "llvm.round.f64" :
143
- llty = ll .FunctionType (ll . DoubleType () , [ll . DoubleType () ])
153
+ llty = ll .FunctionType (lldouble , [lldouble ])
144
154
elif name == "llvm.pow.f64" :
145
- llty = ll .FunctionType (ll . DoubleType () , [ll . DoubleType (), ll . DoubleType () ])
155
+ llty = ll .FunctionType (lldouble , [lldouble , lldouble ])
146
156
elif name == "llvm.powi.f64" :
147
- llty = ll .FunctionType (ll . DoubleType () , [ll . DoubleType (), ll . IntType ( 32 ) ])
157
+ llty = ll .FunctionType (lldouble , [lldouble , lli32 ])
148
158
elif name == "llvm.copysign.f64" :
149
- llty = ll .FunctionType (ll . DoubleType () , [ll . DoubleType (), ll . DoubleType () ])
159
+ llty = ll .FunctionType (lldouble , [lldouble , lldouble ])
150
160
elif name == "llvm.stacksave" :
151
- llty = ll .FunctionType (ll . IntType ( 8 ). as_pointer () , [])
161
+ llty = ll .FunctionType (llptr , [])
152
162
elif name == "llvm.stackrestore" :
153
- llty = ll .FunctionType (ll . VoidType () , [ll . IntType ( 8 ). as_pointer () ])
163
+ llty = ll .FunctionType (llvoid , [llptr ])
154
164
elif name == self .target .print_function :
155
- llty = ll .FunctionType (ll . VoidType () , [ll . IntType ( 8 ). as_pointer () ], var_arg = True )
165
+ llty = ll .FunctionType (llvoid , [llptr ], var_arg = True )
156
166
elif name == "__artiq_personality" :
157
- llty = ll .FunctionType (ll . IntType ( 32 ) , [], var_arg = True )
167
+ llty = ll .FunctionType (lli32 , [], var_arg = True )
158
168
elif name == "__artiq_raise" :
159
- llty = ll .FunctionType (ll . VoidType () , [self .llty_of_type (builtins .TException ())])
169
+ llty = ll .FunctionType (llvoid , [self .llty_of_type (builtins .TException ())])
160
170
elif name == "__artiq_reraise" :
161
- llty = ll .FunctionType (ll . VoidType () , [])
171
+ llty = ll .FunctionType (llvoid , [])
162
172
elif name == "send_rpc" :
163
- llty = ll .FunctionType (ll . VoidType () , [ll . IntType ( 32 ), ll . IntType ( 8 ). as_pointer () ],
173
+ llty = ll .FunctionType (llvoid , [lli32 , llptr ],
164
174
var_arg = True )
165
175
elif name == "recv_rpc" :
166
- llty = ll .FunctionType (ll . IntType ( 32 ) , [ll . IntType ( 8 ). as_pointer () ])
176
+ llty = ll .FunctionType (lli32 , [llptr ])
167
177
else :
168
178
assert False
169
179
@@ -254,7 +264,7 @@ def fixup():
254
264
return llinsn
255
265
256
266
def llindex (self , index ):
257
- return ll .Constant (ll . IntType ( 32 ) , index )
267
+ return ll .Constant (lli32 , index )
258
268
259
269
def process_Alloc (self , insn ):
260
270
if ir .is_environment (insn .type ):
@@ -263,11 +273,11 @@ def process_Alloc(self, insn):
263
273
elif ir .is_option (insn .type ):
264
274
if len (insn .operands ) == 0 : # empty
265
275
llvalue = ll .Constant (self .llty_of_type (insn .type ), ll .Undefined )
266
- return self .llbuilder .insert_value (llvalue , ll .Constant (ll . IntType ( 1 ) , False ), 0 ,
276
+ return self .llbuilder .insert_value (llvalue , ll .Constant (lli1 , False ), 0 ,
267
277
name = insn .name )
268
278
elif len (insn .operands ) == 1 : # full
269
279
llvalue = ll .Constant (self .llty_of_type (insn .type ), ll .Undefined )
270
- llvalue = self .llbuilder .insert_value (llvalue , ll .Constant (ll . IntType ( 1 ) , True ), 0 )
280
+ llvalue = self .llbuilder .insert_value (llvalue , ll .Constant (lli1 , True ), 0 )
271
281
return self .llbuilder .insert_value (llvalue , self .map (insn .operands [0 ]), 1 ,
272
282
name = insn .name )
273
283
else :
@@ -439,8 +449,8 @@ def process_Arith(self, insn):
439
449
[self .map (insn .lhs ()), self .map (insn .rhs ())],
440
450
name = insn .name )
441
451
else :
442
- lllhs = self .llbuilder .sitofp (self .map (insn .lhs ()), ll . DoubleType () )
443
- llrhs = self .llbuilder .trunc (self .map (insn .rhs ()), ll . IntType ( 32 ) )
452
+ lllhs = self .llbuilder .sitofp (self .map (insn .lhs ()), lldouble )
453
+ llrhs = self .llbuilder .trunc (self .map (insn .rhs ()), lli32 )
444
454
llvalue = self .llbuilder .call (self .llbuiltin ("llvm.powi.f64" ), [lllhs , llrhs ])
445
455
return self .llbuilder .fptosi (llvalue , self .llty_of_type (insn .type ),
446
456
name = insn .name )
@@ -497,19 +507,19 @@ def process_Compare(self, insn):
497
507
elif isinstance (lllhs .type , ll .PointerType ):
498
508
return self .llbuilder .icmp_unsigned (op , lllhs , llrhs ,
499
509
name = insn .name )
500
- elif isinstance (lllhs .type , ( ll .FloatType , ll . DoubleType ) ):
510
+ elif isinstance (lllhs .type , ll .DoubleType ):
501
511
return self .llbuilder .fcmp_ordered (op , lllhs , llrhs ,
502
512
name = insn .name )
503
513
elif isinstance (lllhs .type , ll .LiteralStructType ):
504
514
# Compare aggregates (such as lists or ranges) element-by-element.
505
- llvalue = ll .Constant (ll . IntType ( 1 ) , True )
515
+ llvalue = ll .Constant (lli1 , True )
506
516
for index in range (len (lllhs .type .elements )):
507
517
lllhselt = self .llbuilder .extract_value (lllhs , index )
508
518
llrhselt = self .llbuilder .extract_value (llrhs , index )
509
519
llresult = self .llbuilder .icmp_unsigned ('==' , lllhselt , llrhselt )
510
520
llvalue = self .llbuilder .select (llresult , llvalue ,
511
- ll .Constant (ll . IntType ( 1 ) , False ))
512
- return self .llbuilder .icmp_unsigned (op , llvalue , ll .Constant (ll . IntType ( 1 ) , True ),
521
+ ll .Constant (lli1 , False ))
522
+ return self .llbuilder .icmp_unsigned (op , llvalue , ll .Constant (lli1 , True ),
513
523
name = insn .name )
514
524
else :
515
525
print (lllhs , llrhs )
@@ -567,7 +577,7 @@ def get_outer(llenv, env_ty):
567
577
568
578
def process_Closure (self , insn ):
569
579
llvalue = ll .Constant (self .llty_of_type (insn .target_function .type ), ll .Undefined )
570
- llenv = self .llbuilder .bitcast (self .map (insn .environment ()), ll . IntType ( 8 ). as_pointer () )
580
+ llenv = self .llbuilder .bitcast (self .map (insn .environment ()), llptr )
571
581
llvalue = self .llbuilder .insert_value (llvalue , llenv , 0 )
572
582
llvalue = self .llbuilder .insert_value (llvalue , self .map (insn .target_function ), 1 ,
573
583
name = insn .name )
@@ -611,7 +621,7 @@ def _rpc_tag(self, typ, error_handler):
611
621
error_handler (typ )
612
622
613
623
def _build_rpc (self , fun_loc , fun_type , args , llnormalblock , llunwindblock ):
614
- llservice = ll .Constant (ll . IntType ( 32 ) , fun_type .service )
624
+ llservice = ll .Constant (lli32 , fun_type .service )
615
625
616
626
tag = b""
617
627
@@ -676,7 +686,7 @@ def ret_error_handler(typ):
676
686
677
687
llretty = self .llty_of_type (fun_type .ret )
678
688
llslot = self .llbuilder .alloca (llretty )
679
- llslotgen = self .llbuilder .bitcast (llslot , ll . IntType ( 8 ). as_pointer () )
689
+ llslotgen = self .llbuilder .bitcast (llslot , llptr )
680
690
self .llbuilder .branch (llhead )
681
691
682
692
self .llbuilder .position_at_end (llhead )
@@ -692,7 +702,7 @@ def ret_error_handler(typ):
692
702
self .llbuilder .cbranch (lldone , lltail , llalloc )
693
703
694
704
self .llbuilder .position_at_end (llalloc )
695
- llalloca = self .llbuilder .alloca (ll . IntType ( 8 ) , llsize )
705
+ llalloca = self .llbuilder .alloca (lli8 , llsize )
696
706
llphi .add_incoming (llalloca , llalloc )
697
707
self .llbuilder .branch (llhead )
698
708
@@ -783,8 +793,8 @@ def process_Reraise(self, insn):
783
793
784
794
def process_LandingPad (self , insn ):
785
795
# Layout on return from landing pad: {%_Unwind_Exception*, %Exception*}
786
- lllandingpadty = ll .LiteralStructType ([ll . IntType ( 8 ). as_pointer () ,
787
- ll . IntType ( 8 ). as_pointer () ])
796
+ lllandingpadty = ll .LiteralStructType ([llptr ,
797
+ llptr ])
788
798
lllandingpad = self .llbuilder .landingpad (lllandingpadty ,
789
799
self .llbuiltin ("__artiq_personality" ),
790
800
cleanup = True )
0 commit comments