From 0982c965b14f7d623da82b5a0901a7628310e9bd Mon Sep 17 00:00:00 2001 From: whitequark Date: Tue, 7 Aug 2018 07:06:53 +0000 Subject: [PATCH] compiler: handle async RPC as last statement in try block. Fixes #1107. --- artiq/compiler/transforms/llvm_ir_generator.py | 6 ++++++ artiq/test/coredevice/test_embedding.py | 12 ++++++++++++ 2 files changed, 18 insertions(+) diff --git a/artiq/compiler/transforms/llvm_ir_generator.py b/artiq/compiler/transforms/llvm_ir_generator.py index 680659b46..9457d39e1 100644 --- a/artiq/compiler/transforms/llvm_ir_generator.py +++ b/artiq/compiler/transforms/llvm_ir_generator.py @@ -1339,6 +1339,12 @@ class LLVMIRGenerator: self.llbuilder.call(self.llbuiltin("llvm.stackrestore"), [llstackptr]) if fun_type.async: + # If this RPC is called using an `invoke` ARTIQ IR instruction, there will be + # no other instructions in this basic block. Since this RPC is async, it cannot + # possibly raise an exception, so add an explicit jump to the normal successor. + if llunwindblock: + self.llbuilder.branch(llnormalblock) + return ll.Undefined # T result = { diff --git a/artiq/test/coredevice/test_embedding.py b/artiq/test/coredevice/test_embedding.py index 8d0e64aba..00a8321f1 100644 --- a/artiq/test/coredevice/test_embedding.py +++ b/artiq/test/coredevice/test_embedding.py @@ -221,6 +221,17 @@ class _RPCCalls(EnvExperiment): def builtin(self): sleep(1.0) + @rpc(flags={"async"}) + def async_rpc(self): + pass + + @kernel + def async_in_try(self): + try: + self.async_rpc() + except ValueError: + pass + class RPCCallsTest(ExperimentCase): def test_args(self): @@ -237,6 +248,7 @@ class RPCCallsTest(ExperimentCase): self.assertTrue((exp.numpy_full() == numpy.full(10, 20)).all()) self.assertTrue(numpy.isnan(exp.numpy_nan()).all()) exp.builtin() + exp.async_in_try() class _Annotation(EnvExperiment):