本文整理汇总了Python中pykit.ir.Builder.emit方法的典型用法代码示例。如果您正苦于以下问题:Python Builder.emit方法的具体用法?Python Builder.emit怎么用?Python Builder.emit使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类pykit.ir.Builder
的用法示例。
在下文中一共展示了Builder.emit方法的7个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Python代码示例。
示例1: insert_allocations
# 需要导入模块: from pykit.ir import Builder [as 别名]
# 或者: from pykit.ir.Builder import emit [as 别名]
def insert_allocations(func, env):
b = Builder(func)
# IR positions and list of ops
positions = dict((op, idx) for idx, op in enumerate(func.ops))
oplist = list(func.ops)
for op in func.ops:
if op.opcode == 'ckernel':
ckernel, args = op.args
alloc = Op('alloc', op.type, args=[])
# TODO: Insert alloc in args list of ckernel
# Replace uses of ckernel with temporary allocation
op.replace_uses(alloc)
op.set_args([ckernel, [alloc] + args])
# Emit allocation before first use
b.position_before(op)
b.emit(alloc)
# Emit deallocation after last use, unless we are returning
# the result
idx = max(positions[u] for u in func.uses[alloc])
last_op = oplist[idx]
if not last_op.opcode == 'ret':
b.position_after(last_op)
dealloc = Op('dealloc', types.Void, [alloc])
b.emit(dealloc)
return func, env
示例2: explicit_coercions
# 需要导入模块: from pykit.ir import Builder [as 别名]
# 或者: from pykit.ir.Builder import emit [as 别名]
def explicit_coercions(func, env=None):
"""
Turn implicit coercions into explicit conversion operations.
"""
conversions = {}
b = Builder(func)
for op in func.ops:
if op.opcode != 'kernel':
continue
overload = op.metadata['overload']
signature = overload.resolved_sig
parameters = signature.parameters[:-1]
assert len(op.args) - 1 == len(parameters)
# -------------------------------------------------
# Identify conversion points
replacements = {} # { arg : replacement_conversion }
for arg, param_type in zip(op.args[1:], parameters):
if arg.type != param_type:
conversion = conversions.get((arg, param_type))
if not conversion:
conversion = Op('convert', param_type, [arg])
b.position_after(arg)
b.emit(conversion)
conversions[arg, param_type] = conversion
replacements[arg] = conversion
# -------------------------------------------------
op.replace_args(replacements)
示例3: move_allocas
# 需要导入模块: from pykit.ir import Builder [as 别名]
# 或者: from pykit.ir.Builder import emit [as 别名]
def move_allocas(func, allocas):
"""Move all allocas to the start block"""
builder = Builder(func)
builder.position_at_beginning(func.startblock)
for alloca in allocas:
if alloca.block != func.startblock:
alloca.unlink()
builder.emit(alloca)
示例4: move_generator
# 需要导入模块: from pykit.ir import Builder [as 别名]
# 或者: from pykit.ir.Builder import emit [as 别名]
def move_generator(func, consumer, empty_body):
gen = consumer.generator
gen.unlink()
b = Builder(func)
b.position_at_end(empty_body)
b.emit(gen)
with b.at_end(empty_body):
loop_exit = determine_loop_exit(consumer.loop)
b.jump(loop_exit)
示例5: rewrite_getattr
# 需要导入模块: from pykit.ir import Builder [as 别名]
# 或者: from pykit.ir.Builder import emit [as 别名]
def rewrite_getattr(func, env):
"""
Resolve missing attributes through __getattr__
"""
context = env['flypy.typing.context']
b = OpBuilder()
builder = Builder(func)
for op in func.ops:
if op.opcode == 'getfield':
value, attr = op.args
obj_type = context[value]
attr_type = types.String[()]
if attr not in obj_type.fields and attr not in obj_type.layout:
assert '__getattr__' in obj_type.fields
op.set_args([value, '__getattr__'])
# Construct attribute string
attr_string = OConst(attr)
# Retrieve __getattr__ function and type
getattr_func, func_type, restype = infer_getattr(
obj_type, op, env)
# call(getfield(obj, '__getattr__'), ['attr'])
call = b.call(op.type, op, [attr_string])
op.replace_uses(call)
builder.position_after(op)
builder.emit(call)
# Update context
context[op] = func_type
context[attr_string] = attr_type
context[call] = restype
示例6: Translate
# 需要导入模块: from pykit.ir import Builder [as 别名]
# 或者: from pykit.ir.Builder import emit [as 别名]
#.........这里部分代码省略.........
# -------------------------------------------------
# Sanity check
assert all(len(stack) == stacklen for stack in stacks), (preds, stacks)
if not preds or not stacklen:
continue
# -------------------------------------------------
# Update φs with stack values from predecessors
for pos, phi in enumerate(phis):
values = []
for pred in preds:
value_stack = self.stacks[pred]
value = value_stack[pos]
values.append(value)
phi.set_args([preds, values])
@property
def stack(self):
return self.stacks[self.curblock]
@property
def stack_level(self):
return len(self.stack)
def insert(self, opcode, *args):
type = types.Void if ops.is_void(opcode) else types.Opaque
op = Op(opcode, type, list(args))
op.add_metadata({'lineno': self.lineno})
self.builder.emit(op)
return op
def push_insert(self, opcode, *args):
inst = self.insert(opcode, *args)
self.push(inst)
return inst
def push(self, val):
self.stack.append(val)
def peek(self):
"""
Take a peek at the top of stack.
"""
if not self.stack:
# Assuming the bytecode is valid, our predecessors must have left
# some values on the stack.
# return self._insert_phi()
raise EmptyStackError
else:
return self.stack[-1]
def pop(self):
if not self.stack:
# return self._insert_phi()
raise EmptyStackError
else:
return self.stack.pop()
def _insert_phi(self):
with self.builder.at_front(self.curblock):
phi = self.insert('phi', [], [])
示例7: PykitIRVisitor
# 需要导入模块: from pykit.ir import Builder [as 别名]
# 或者: from pykit.ir.Builder import emit [as 别名]
#.........这里部分代码省略.........
else:
argnames = []
self.func = Function(name, argnames, type)
self.func.new_block('entry')
self.builder = Builder(self.func)
self.builder.position_at_end(self.func.startblock)
# Store arguments in stack variables
for argname in argnames:
self.assignvar(argname, self.func.get_arg(argname))
self.generic_visit(node.body)
self.leave_func()
# ______________________________________________________________________
def visit_FuncCall(self, node):
type = self.type
opcode = node.name.name
args = self.visits(node.args.exprs) if node.args else []
if opcode == "list":
return args
elif not type and not ops.is_void(opcode):
error(node, "Expected a type for sub-expression "
"(add a cast or assignment)")
elif not hasattr(self.builder, opcode):
if opcode in self.mod.functions:
func = self.mod.get_function(opcode)
return self.builder.call(type, func, args)
# error(node, "No opcode %s" % (opcode,))
op = Op(opcode, type or types.Opaque, args)
self.builder.emit(op)
return op
buildop = getattr(self.builder, opcode)
if ops.is_void(opcode):
return buildop(*args)
else:
return buildop(type or types.Opaque, *args)
def visit_ID(self, node):
if self.in_function:
if node.name in self.local_vars:
result = self.alloca(node.name)
return self.builder.load(result)
global_val = (self.mod.get_function(node.name) or
self.mod.get_global(node.name))
if not global_val:
error(node, "Not a local or global: %r" % node.name)
return global_val
def visit_Cast(self, node):
type = self.visit(node.to_type)
if isinstance(node.expr, c_ast.FuncCall):
op = self.visit(node.expr, type=type)
op.type = type
return op
else:
result = self.visit(node.expr)
if result.type == type:
return result