Skip to content

Commit

Permalink
compiler: mark loaded pointers as !dereferenceable.
Browse files Browse the repository at this point in the history
Also, lower the bound for test_pulse_rate_dds, since we generate
better code for it now.
whitequark committed Mar 31, 2016
1 parent 2c04979 commit 10108e6
Showing 2 changed files with 16 additions and 9 deletions.
19 changes: 12 additions & 7 deletions artiq/compiler/transforms/llvm_ir_generator.py
Original file line number Diff line number Diff line change
@@ -175,6 +175,7 @@ def __init__(self, engine, module_name, target, function_map, object_map, type_m
self.llmodule = ll.Module(context=self.llcontext, name=module_name)
self.llmodule.triple = target.triple
self.llmodule.data_layout = target.data_layout
self.lldatalayout = llvm.create_target_data(self.llmodule.data_layout)
self.function_flags = None
self.llfunction = None
self.llmap = {}
@@ -459,8 +460,6 @@ def emit_attribute_writeback(self):
if llobject is not None:
llobjects[typ].append(llobject.bitcast(llptr))

lldatalayout = llvm.create_target_data(self.llmodule.data_layout)

llrpcattrty = self.llcontext.get_identified_type("A")
llrpcattrty.elements = [lli32, llptr, llptr]

@@ -512,9 +511,9 @@ def rpc_tag_error(typ):
for attr in typ.attributes:
attrtyp = typ.attributes[attr]
size = self.llty_of_type(attrtyp). \
get_abi_size(lldatalayout, context=self.llcontext)
get_abi_size(self.lldatalayout, context=self.llcontext)
alignment = self.llty_of_type(attrtyp). \
get_abi_alignment(lldatalayout, context=self.llcontext)
get_abi_alignment(self.lldatalayout, context=self.llcontext)

if offset % alignment != 0:
offset += alignment - (offset % alignment)
@@ -688,13 +687,19 @@ def llptr_to_var(self, llenv, env_ty, var_name, var_type=None):
llouterenv.metadata['nonnull'] = self.empty_metadata
return self.llptr_to_var(llouterenv, env_ty.params["$outer"], var_name)

def mark_dereferenceable(self, load):
assert isinstance(load, ll.LoadInstr) and isinstance(load.type, ll.PointerType)
pointee_size = load.type.pointee.get_abi_size(self.lldatalayout, context=self.llcontext)
metadata = self.llmodule.add_metadata([ll.Constant(lli64, pointee_size)])
load.metadata['dereferenceable'] = metadata

def process_GetLocal(self, insn):
env = insn.environment()
llptr = self.llptr_to_var(self.map(env), env.type, insn.var_name)
llptr.name = "ptr.{}.{}".format(env.name, insn.var_name)
llvalue = self.llbuilder.load(llptr, name="val.{}.{}".format(env.name, insn.var_name))
if isinstance(llvalue.type, ll.PointerType):
llvalue.metadata['nonnull'] = self.empty_metadata
self.mark_dereferenceable(llvalue)
return llvalue

def process_SetLocal(self, insn):
@@ -818,7 +823,7 @@ def process_GetAttr(self, insn):
if types.is_instance(typ) and attr in typ.constant_attributes:
llvalue.metadata['invariant.load'] = self.empty_metadata
if isinstance(llvalue.type, ll.PointerType):
llvalue.metadata['nonnull'] = self.empty_metadata
self.mark_dereferenceable(llvalue)
return llvalue

def process_SetAttr(self, insn):
@@ -849,7 +854,7 @@ def process_GetElem(self, insn):
inbounds=True)
llvalue = self.llbuilder.load(llelt)
if isinstance(llvalue.type, ll.PointerType):
llvalue.metadata['nonnull'] = self.empty_metadata
self.mark_dereferenceable(llvalue)
return llvalue

def process_SetElem(self, insn):
6 changes: 4 additions & 2 deletions artiq/test/coredevice/test_rtio.py
Original file line number Diff line number Diff line change
@@ -105,6 +105,8 @@ def run(self):


class PulseRateDDS(EnvExperiment):
kernel_constant_attributes = {"core", "core_dds", "dds0", "dds1"}

def build(self):
self.setattr_device("core")
self.setattr_device("core_dds")
@@ -113,7 +115,7 @@ def build(self):

@kernel
def run(self):
dt = seconds_to_mu(150*us)
dt = seconds_to_mu(50*us)
while True:
delay(10*ms)
for i in range(1250):
@@ -262,7 +264,7 @@ def test_pulse_rate_dds(self):
rate = self.dataset_mgr.get("pulse_rate")
print(rate)
self.assertGreater(rate, 100*us)
self.assertLess(rate, 400*us)
self.assertLess(rate, 150*us)

def test_loopback_count(self):
npulses = 2

0 comments on commit 10108e6

Please sign in to comment.