Skip to content

Commit 22570af

Browse files
author
whitequark
committedAug 10, 2015
LLVMIRGenerator: allocate less.
1 parent b99eae6 commit 22570af

File tree

1 file changed

+51
-41
lines changed

1 file changed

+51
-41
lines changed
 

Diff for: ‎artiq/compiler/transforms/llvm_ir_generator.py

+51-41
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,16 @@
77
from llvmlite_artiq import ir as ll
88
from .. import types, builtins, ir
99

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+
1020
class LLVMIRGenerator:
1121
def __init__(self, engine, module_name, target):
1222
self.engine = engine
@@ -26,11 +36,11 @@ def llty_of_type(self, typ, bare=False, for_return=False):
2636
return ll.LiteralStructType([self.llty_of_type(eltty) for eltty in typ.elts])
2737
elif types.is_rpc_function(typ):
2838
if for_return:
29-
return ll.VoidType()
39+
return llvoid
3040
else:
3141
return ll.LiteralStructType([])
3242
elif types.is_function(typ):
33-
envarg = ll.IntType(8).as_pointer()
43+
envarg = llptr
3444
llty = ll.FunctionType(args=[envarg] +
3545
[self.llty_of_type(typ.args[arg])
3646
for arg in typ.args] +
@@ -43,27 +53,27 @@ def llty_of_type(self, typ, bare=False, for_return=False):
4353
return ll.LiteralStructType([envarg, llty.as_pointer()])
4454
elif builtins.is_none(typ):
4555
if for_return:
46-
return ll.VoidType()
56+
return llvoid
4757
else:
4858
return ll.LiteralStructType([])
4959
elif builtins.is_bool(typ):
50-
return ll.IntType(1)
60+
return lli1
5161
elif builtins.is_int(typ):
5262
return ll.IntType(builtins.get_int_width(typ))
5363
elif builtins.is_float(typ):
54-
return ll.DoubleType()
64+
return lldouble
5565
elif builtins.is_str(typ) or ir.is_exn_typeinfo(typ):
56-
return ll.IntType(8).as_pointer()
66+
return llptr
5767
elif builtins.is_list(typ):
5868
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()])
6070
elif builtins.is_range(typ):
6171
lleltty = self.llty_of_type(builtins.get_iterable_elt(typ))
6272
return ll.LiteralStructType([lleltty, lleltty, lleltty])
6373
elif ir.is_basic_block(typ):
64-
return ll.IntType(8).as_pointer()
74+
return llptr
6575
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"])])
6777
elif ir.is_environment(typ):
6878
llty = ll.LiteralStructType([self.llty_of_type(typ.params[name])
6979
for name in typ.params])
@@ -117,14 +127,14 @@ def llconst_of_const(self, const):
117127

118128
llconst = self.llmodule.get_global(name)
119129
if llconst is None:
120-
llstrty = ll.ArrayType(ll.IntType(8), len(as_bytes))
130+
llstrty = ll.ArrayType(lli8, len(as_bytes))
121131
llconst = ll.GlobalVariable(self.llmodule, llstrty, name)
122132
llconst.global_constant = True
123133
llconst.initializer = ll.Constant(llstrty, bytearray(as_bytes))
124134
llconst.linkage = linkage
125135
llconst.unnamed_addr = unnamed_addr
126136

127-
return llconst.bitcast(ll.IntType(8).as_pointer())
137+
return llconst.bitcast(llptr)
128138
else:
129139
assert False
130140

@@ -134,36 +144,36 @@ def llbuiltin(self, name):
134144
return llfun
135145

136146
if name in "llvm.donothing":
137-
llty = ll.FunctionType(ll.VoidType(), [])
147+
llty = ll.FunctionType(llvoid, [])
138148
elif name in "llvm.trap":
139-
llty = ll.FunctionType(ll.VoidType(), [])
149+
llty = ll.FunctionType(llvoid, [])
140150
elif name == "llvm.floor.f64":
141-
llty = ll.FunctionType(ll.DoubleType(), [ll.DoubleType()])
151+
llty = ll.FunctionType(lldouble, [lldouble])
142152
elif name == "llvm.round.f64":
143-
llty = ll.FunctionType(ll.DoubleType(), [ll.DoubleType()])
153+
llty = ll.FunctionType(lldouble, [lldouble])
144154
elif name == "llvm.pow.f64":
145-
llty = ll.FunctionType(ll.DoubleType(), [ll.DoubleType(), ll.DoubleType()])
155+
llty = ll.FunctionType(lldouble, [lldouble, lldouble])
146156
elif name == "llvm.powi.f64":
147-
llty = ll.FunctionType(ll.DoubleType(), [ll.DoubleType(), ll.IntType(32)])
157+
llty = ll.FunctionType(lldouble, [lldouble, lli32])
148158
elif name == "llvm.copysign.f64":
149-
llty = ll.FunctionType(ll.DoubleType(), [ll.DoubleType(), ll.DoubleType()])
159+
llty = ll.FunctionType(lldouble, [lldouble, lldouble])
150160
elif name == "llvm.stacksave":
151-
llty = ll.FunctionType(ll.IntType(8).as_pointer(), [])
161+
llty = ll.FunctionType(llptr, [])
152162
elif name == "llvm.stackrestore":
153-
llty = ll.FunctionType(ll.VoidType(), [ll.IntType(8).as_pointer()])
163+
llty = ll.FunctionType(llvoid, [llptr])
154164
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)
156166
elif name == "__artiq_personality":
157-
llty = ll.FunctionType(ll.IntType(32), [], var_arg=True)
167+
llty = ll.FunctionType(lli32, [], var_arg=True)
158168
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())])
160170
elif name == "__artiq_reraise":
161-
llty = ll.FunctionType(ll.VoidType(), [])
171+
llty = ll.FunctionType(llvoid, [])
162172
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],
164174
var_arg=True)
165175
elif name == "recv_rpc":
166-
llty = ll.FunctionType(ll.IntType(32), [ll.IntType(8).as_pointer()])
176+
llty = ll.FunctionType(lli32, [llptr])
167177
else:
168178
assert False
169179

@@ -254,7 +264,7 @@ def fixup():
254264
return llinsn
255265

256266
def llindex(self, index):
257-
return ll.Constant(ll.IntType(32), index)
267+
return ll.Constant(lli32, index)
258268

259269
def process_Alloc(self, insn):
260270
if ir.is_environment(insn.type):
@@ -263,11 +273,11 @@ def process_Alloc(self, insn):
263273
elif ir.is_option(insn.type):
264274
if len(insn.operands) == 0: # empty
265275
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,
267277
name=insn.name)
268278
elif len(insn.operands) == 1: # full
269279
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)
271281
return self.llbuilder.insert_value(llvalue, self.map(insn.operands[0]), 1,
272282
name=insn.name)
273283
else:
@@ -439,8 +449,8 @@ def process_Arith(self, insn):
439449
[self.map(insn.lhs()), self.map(insn.rhs())],
440450
name=insn.name)
441451
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)
444454
llvalue = self.llbuilder.call(self.llbuiltin("llvm.powi.f64"), [lllhs, llrhs])
445455
return self.llbuilder.fptosi(llvalue, self.llty_of_type(insn.type),
446456
name=insn.name)
@@ -497,19 +507,19 @@ def process_Compare(self, insn):
497507
elif isinstance(lllhs.type, ll.PointerType):
498508
return self.llbuilder.icmp_unsigned(op, lllhs, llrhs,
499509
name=insn.name)
500-
elif isinstance(lllhs.type, (ll.FloatType, ll.DoubleType)):
510+
elif isinstance(lllhs.type, ll.DoubleType):
501511
return self.llbuilder.fcmp_ordered(op, lllhs, llrhs,
502512
name=insn.name)
503513
elif isinstance(lllhs.type, ll.LiteralStructType):
504514
# Compare aggregates (such as lists or ranges) element-by-element.
505-
llvalue = ll.Constant(ll.IntType(1), True)
515+
llvalue = ll.Constant(lli1, True)
506516
for index in range(len(lllhs.type.elements)):
507517
lllhselt = self.llbuilder.extract_value(lllhs, index)
508518
llrhselt = self.llbuilder.extract_value(llrhs, index)
509519
llresult = self.llbuilder.icmp_unsigned('==', lllhselt, llrhselt)
510520
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),
513523
name=insn.name)
514524
else:
515525
print(lllhs, llrhs)
@@ -567,7 +577,7 @@ def get_outer(llenv, env_ty):
567577

568578
def process_Closure(self, insn):
569579
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)
571581
llvalue = self.llbuilder.insert_value(llvalue, llenv, 0)
572582
llvalue = self.llbuilder.insert_value(llvalue, self.map(insn.target_function), 1,
573583
name=insn.name)
@@ -611,7 +621,7 @@ def _rpc_tag(self, typ, error_handler):
611621
error_handler(typ)
612622

613623
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)
615625

616626
tag = b""
617627

@@ -676,7 +686,7 @@ def ret_error_handler(typ):
676686

677687
llretty = self.llty_of_type(fun_type.ret)
678688
llslot = self.llbuilder.alloca(llretty)
679-
llslotgen = self.llbuilder.bitcast(llslot, ll.IntType(8).as_pointer())
689+
llslotgen = self.llbuilder.bitcast(llslot, llptr)
680690
self.llbuilder.branch(llhead)
681691

682692
self.llbuilder.position_at_end(llhead)
@@ -692,7 +702,7 @@ def ret_error_handler(typ):
692702
self.llbuilder.cbranch(lldone, lltail, llalloc)
693703

694704
self.llbuilder.position_at_end(llalloc)
695-
llalloca = self.llbuilder.alloca(ll.IntType(8), llsize)
705+
llalloca = self.llbuilder.alloca(lli8, llsize)
696706
llphi.add_incoming(llalloca, llalloc)
697707
self.llbuilder.branch(llhead)
698708

@@ -783,8 +793,8 @@ def process_Reraise(self, insn):
783793

784794
def process_LandingPad(self, insn):
785795
# 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])
788798
lllandingpad = self.llbuilder.landingpad(lllandingpadty,
789799
self.llbuiltin("__artiq_personality"),
790800
cleanup=True)

0 commit comments

Comments
 (0)
Please sign in to comment.