diff --git a/compiler/Makefile b/compiler/Makefile index 6b8af6d1e..9b4ba776e 100644 --- a/compiler/Makefile +++ b/compiler/Makefile @@ -172,11 +172,9 @@ build-end-to-end-jit-lambda: build-initialized ## end-to-end-dataflow-tests build-end-to-end-dataflow-tests: build-initialized - cmake --build $(BUILD_DIR) --target end_to_end_jit_dfr cmake --build $(BUILD_DIR) --target end_to_end_jit_auto_parallelization run-end-to-end-dataflow-tests: build-end-to-end-dataflow-tests - $(BUILD_DIR)/tools/concretelang/tests/end_to_end_tests/end_to_end_jit_dfr $(BUILD_DIR)/tools/concretelang/tests/end_to_end_tests/end_to_end_jit_auto_parallelization # benchmark diff --git a/compiler/tests/end_to_end_tests/CMakeLists.txt b/compiler/tests/end_to_end_tests/CMakeLists.txt index 6922a00d0..aefa463d3 100644 --- a/compiler/tests/end_to_end_tests/CMakeLists.txt +++ b/compiler/tests/end_to_end_tests/CMakeLists.txt @@ -59,10 +59,6 @@ add_concretecompiler_unittest( ) if(CONCRETELANG_PARALLEL_EXECUTION_ENABLED) - add_concretecompiler_unittest( - end_to_end_jit_dfr - end_to_end_jit_dfr.cc - ) add_concretecompiler_unittest( end_to_end_jit_auto_parallelization end_to_end_jit_auto_parallelization.cc diff --git a/compiler/tests/end_to_end_tests/end_to_end_jit_dfr.cc b/compiler/tests/end_to_end_tests/end_to_end_jit_dfr.cc deleted file mode 100644 index 6104a0d34..000000000 --- a/compiler/tests/end_to_end_tests/end_to_end_jit_dfr.cc +++ /dev/null @@ -1,351 +0,0 @@ - -#include -#include -#include - -#include "end_to_end_jit_test.h" - -const mlir::concretelang::V0FHEConstraint defaultV0Constraints{10, 7}; - -TEST(CompileAndRunDFR, start_stop) { - checkedJit(lambda, R"XXX( -func.func private @_dfr_stop() -func.func private @_dfr_start() -func.func @main() -> i64{ - call @_dfr_start() : () -> () - %1 = arith.constant 7 : i64 - call @_dfr_stop() : () -> () - return %1 : i64 -} -)XXX", - "main", true); - ASSERT_EXPECTED_VALUE(lambda(), 7); -} - -TEST(CompileAndRunDFR, 0in1out_task) { - checkedJit(lambda, R"XXX( - llvm.func @_dfr_await_future(!llvm.ptr) -> !llvm.ptr> attributes {sym_visibility = "private"} - llvm.func @_dfr_create_async_task(...) attributes {sym_visibility = "private"} - llvm.func @_dfr_stop() - llvm.func @_dfr_start() - func.func @main() -> i64 { - %0 = llvm.mlir.addressof @_dfr_DFT_work_function__main0 : !llvm.ptr)>> - %1 = llvm.mlir.constant(0 : i64) : i64 - %2 = llvm.mlir.constant(1 : i64) : i64 - %3 = llvm.mlir.constant(8 : i64) : i64 - llvm.call @_dfr_start() : () -> () - %4 = llvm.mlir.constant(1 : i64) : i64 - %5 = llvm.alloca %4 x !llvm.ptr : (i64) -> !llvm.ptr> - llvm.call @_dfr_create_async_task(%0, %1, %2, %5, %3) : (!llvm.ptr)>>, i64, i64, !llvm.ptr>, i64) -> () - %6 = llvm.load %5 : !llvm.ptr> - %7 = llvm.call @_dfr_await_future(%6) : (!llvm.ptr) -> !llvm.ptr> - %8 = llvm.bitcast %7 : !llvm.ptr> to !llvm.ptr - %9 = llvm.load %8 : !llvm.ptr - llvm.call @_dfr_stop() : () -> () - return %9 : i64 - } - llvm.func @_dfr_DFT_work_function__main0(%arg0: !llvm.ptr) { - %0 = llvm.mlir.constant(4 : i64) : i64 - %1 = llvm.mlir.constant(3 : i64) : i64 - llvm.br ^bb1 - ^bb1: // pred: ^bb0 - %2 = llvm.add %0, %1 : i64 - llvm.store %2, %arg0 : !llvm.ptr - llvm.return - } -)XXX", - "main", true); - ASSERT_EXPECTED_VALUE(lambda(), 7); -} - -TEST(CompileAndRunDFR, 1in1out_task) { - checkedJit(lambda, R"XXX( - llvm.func @_dfr_await_future(!llvm.ptr) -> !llvm.ptr> attributes {sym_visibility = "private"} - llvm.func @_dfr_create_async_task(...) attributes {sym_visibility = "private"} - llvm.func @malloc(i64) -> !llvm.ptr - llvm.func @_dfr_make_ready_future(...) -> !llvm.ptr attributes {sym_visibility = "private"} - llvm.func @_dfr_stop() - llvm.func @_dfr_start() - func.func @main(%arg0: i64) -> i64 { - %0 = llvm.mlir.addressof @_dfr_DFT_work_function__main0 : !llvm.ptr, ptr)>> - %1 = llvm.mlir.constant(1 : i64) : i64 - %2 = llvm.mlir.constant(8 : i64) : i64 - llvm.call @_dfr_start() : () -> () - %3 = llvm.mlir.null : !llvm.ptr - %4 = llvm.mlir.constant(1 : index) : i64 - %5 = llvm.getelementptr %3[%4] : (!llvm.ptr, i64) -> !llvm.ptr - %6 = llvm.ptrtoint %5 : !llvm.ptr to i64 - %7 = llvm.call @malloc(%6) : (i64) -> !llvm.ptr - %8 = llvm.bitcast %7 : !llvm.ptr to !llvm.ptr - llvm.store %arg0, %8 : !llvm.ptr - %9 = llvm.call @_dfr_make_ready_future(%8) : (!llvm.ptr) -> !llvm.ptr - %10 = llvm.mlir.constant(1 : i64) : i64 - %11 = llvm.alloca %10 x !llvm.ptr : (i64) -> !llvm.ptr> - llvm.call @_dfr_create_async_task(%0, %1, %1, %9, %2, %11, %2) : (!llvm.ptr, ptr)>>, i64, i64, !llvm.ptr, i64, !llvm.ptr>, i64) -> () - %12 = llvm.load %11 : !llvm.ptr> - %13 = llvm.call @_dfr_await_future(%12) : (!llvm.ptr) -> !llvm.ptr> - %14 = llvm.bitcast %13 : !llvm.ptr> to !llvm.ptr - %15 = llvm.load %14 : !llvm.ptr - llvm.call @_dfr_stop() : () -> () - return %15 : i64 - } - llvm.func @_dfr_DFT_work_function__main0(%arg0: !llvm.ptr, %arg1: !llvm.ptr) { - %0 = llvm.mlir.constant(2 : i64) : i64 - %1 = llvm.load %arg0 : !llvm.ptr - llvm.br ^bb1 - ^bb1: // pred: ^bb0 - %2 = llvm.add %1, %0 : i64 - llvm.store %2, %arg1 : !llvm.ptr - llvm.return - } -)XXX", - "main", true); - - ASSERT_EXPECTED_VALUE(lambda(5_u64), 7); -} - -TEST(CompileAndRunDFR, 2in1out_task) { - checkedJit(lambda, R"XXX( - llvm.func @_dfr_await_future(!llvm.ptr) -> !llvm.ptr> attributes {sym_visibility = "private"} - llvm.func @_dfr_create_async_task(...) attributes {sym_visibility = "private"} - llvm.func @malloc(i64) -> !llvm.ptr - llvm.func @_dfr_make_ready_future(...) -> !llvm.ptr attributes {sym_visibility = "private"} - llvm.func @_dfr_stop() - llvm.func @_dfr_start() - func.func @main(%arg0: i64, %arg1: i64) -> i64 { - %0 = llvm.mlir.addressof @_dfr_DFT_work_function__main0 : !llvm.ptr, ptr, ptr)>> - %1 = llvm.mlir.constant(2 : i64) : i64 - %2 = llvm.mlir.constant(1 : i64) : i64 - %3 = llvm.mlir.constant(8 : i64) : i64 - llvm.call @_dfr_start() : () -> () - %4 = llvm.mlir.null : !llvm.ptr - %5 = llvm.mlir.constant(1 : index) : i64 - %6 = llvm.getelementptr %4[%5] : (!llvm.ptr, i64) -> !llvm.ptr - %7 = llvm.ptrtoint %6 : !llvm.ptr to i64 - %8 = llvm.call @malloc(%7) : (i64) -> !llvm.ptr - %9 = llvm.bitcast %8 : !llvm.ptr to !llvm.ptr - llvm.store %arg0, %9 : !llvm.ptr - %10 = llvm.call @_dfr_make_ready_future(%9) : (!llvm.ptr) -> !llvm.ptr - %11 = llvm.mlir.null : !llvm.ptr - %12 = llvm.mlir.constant(1 : index) : i64 - %13 = llvm.getelementptr %11[%12] : (!llvm.ptr, i64) -> !llvm.ptr - %14 = llvm.ptrtoint %13 : !llvm.ptr to i64 - %15 = llvm.call @malloc(%14) : (i64) -> !llvm.ptr - %16 = llvm.bitcast %15 : !llvm.ptr to !llvm.ptr - llvm.store %arg1, %16 : !llvm.ptr - %17 = llvm.call @_dfr_make_ready_future(%16) : (!llvm.ptr) -> !llvm.ptr - %18 = llvm.mlir.constant(1 : i64) : i64 - %19 = llvm.alloca %18 x !llvm.ptr : (i64) -> !llvm.ptr> - llvm.call @_dfr_create_async_task(%0, %1, %2, %10, %3, %17, %3, %19, %3) : (!llvm.ptr, ptr, ptr)>>, i64, i64, !llvm.ptr, i64, !llvm.ptr, i64, !llvm.ptr>, i64) -> () - %20 = llvm.load %19 : !llvm.ptr> - %21 = llvm.call @_dfr_await_future(%20) : (!llvm.ptr) -> !llvm.ptr> - %22 = llvm.bitcast %21 : !llvm.ptr> to !llvm.ptr - %23 = llvm.load %22 : !llvm.ptr - llvm.call @_dfr_stop() : () -> () - return %23 : i64 - } - llvm.func @_dfr_DFT_work_function__main0(%arg0: !llvm.ptr, %arg1: !llvm.ptr, %arg2: !llvm.ptr) { - %0 = llvm.load %arg0 : !llvm.ptr - %1 = llvm.load %arg1 : !llvm.ptr - llvm.br ^bb1 - ^bb1: // pred: ^bb0 - %2 = llvm.add %0, %1 : i64 - llvm.store %2, %arg2 : !llvm.ptr - llvm.return - } -)XXX", - "main", true); - - ASSERT_EXPECTED_VALUE(lambda(1_u64, 6_u64), 7); -} - -TEST(CompileAndRunDFR, taskgraph) { - checkedJit(lambda, R"XXX( - llvm.func @_dfr_await_future(!llvm.ptr) -> !llvm.ptr> attributes {sym_visibility = "private"} - llvm.func @_dfr_create_async_task(...) attributes {sym_visibility = "private"} - llvm.func @malloc(i64) -> !llvm.ptr - llvm.func @_dfr_make_ready_future(...) -> !llvm.ptr attributes {sym_visibility = "private"} - llvm.func @_dfr_stop() - llvm.func @_dfr_start() - func.func @main(%arg0: i64, %arg1: i64, %arg2: i64) -> i64 { - %0 = llvm.mlir.constant(7 : i64) : i64 - %1 = llvm.mlir.addressof @_dfr_DFT_work_function__main0 : !llvm.ptr, ptr, ptr)>> - %2 = llvm.mlir.constant(2 : i64) : i64 - %3 = llvm.mlir.constant(1 : i64) : i64 - %4 = llvm.mlir.constant(8 : i64) : i64 - %5 = llvm.mlir.addressof @_dfr_DFT_work_function__main1 : !llvm.ptr, ptr, ptr)>> - %6 = llvm.mlir.addressof @_dfr_DFT_work_function__main2 : !llvm.ptr, ptr, ptr)>> - %7 = llvm.mlir.addressof @_dfr_DFT_work_function__main3 : !llvm.ptr, ptr, ptr)>> - %8 = llvm.mlir.addressof @_dfr_DFT_work_function__main4 : !llvm.ptr, ptr, ptr)>> - %9 = llvm.mlir.addressof @_dfr_DFT_work_function__main5 : !llvm.ptr, ptr, ptr)>> - %10 = llvm.mlir.addressof @_dfr_DFT_work_function__main6 : !llvm.ptr, ptr, ptr)>> - %11 = llvm.mlir.addressof @_dfr_DFT_work_function__main7 : !llvm.ptr, ptr, ptr)>> - llvm.call @_dfr_start() : () -> () - %12 = llvm.mlir.null : !llvm.ptr - %13 = llvm.mlir.constant(1 : index) : i64 - %14 = llvm.getelementptr %12[%13] : (!llvm.ptr, i64) -> !llvm.ptr - %15 = llvm.ptrtoint %14 : !llvm.ptr to i64 - %16 = llvm.call @malloc(%15) : (i64) -> !llvm.ptr - %17 = llvm.bitcast %16 : !llvm.ptr to !llvm.ptr - llvm.store %arg0, %17 : !llvm.ptr - %18 = llvm.call @_dfr_make_ready_future(%17) : (!llvm.ptr) -> !llvm.ptr - %19 = llvm.mlir.null : !llvm.ptr - %20 = llvm.mlir.constant(1 : index) : i64 - %21 = llvm.getelementptr %19[%20] : (!llvm.ptr, i64) -> !llvm.ptr - %22 = llvm.ptrtoint %21 : !llvm.ptr to i64 - %23 = llvm.call @malloc(%22) : (i64) -> !llvm.ptr - %24 = llvm.bitcast %23 : !llvm.ptr to !llvm.ptr - llvm.store %arg1, %24 : !llvm.ptr - %25 = llvm.call @_dfr_make_ready_future(%24) : (!llvm.ptr) -> !llvm.ptr - %26 = llvm.mlir.constant(1 : i64) : i64 - %27 = llvm.alloca %26 x !llvm.ptr : (i64) -> !llvm.ptr> - llvm.call @_dfr_create_async_task(%1, %2, %3, %18, %4, %25, %4, %27, %4) : (!llvm.ptr, ptr, ptr)>>, i64, i64, !llvm.ptr, i64, !llvm.ptr, i64, !llvm.ptr>, i64) -> () - %28 = llvm.load %27 : !llvm.ptr> - %29 = llvm.mlir.null : !llvm.ptr - %30 = llvm.mlir.constant(1 : index) : i64 - %31 = llvm.getelementptr %29[%30] : (!llvm.ptr, i64) -> !llvm.ptr - %32 = llvm.ptrtoint %31 : !llvm.ptr to i64 - %33 = llvm.call @malloc(%32) : (i64) -> !llvm.ptr - %34 = llvm.bitcast %33 : !llvm.ptr to !llvm.ptr - llvm.store %arg2, %34 : !llvm.ptr - %35 = llvm.call @_dfr_make_ready_future(%34) : (!llvm.ptr) -> !llvm.ptr - %36 = llvm.mlir.constant(1 : i64) : i64 - %37 = llvm.alloca %36 x !llvm.ptr : (i64) -> !llvm.ptr> - llvm.call @_dfr_create_async_task(%5, %2, %3, %18, %4, %35, %4, %37, %4) : (!llvm.ptr, ptr, ptr)>>, i64, i64, !llvm.ptr, i64, !llvm.ptr, i64, !llvm.ptr>, i64) -> () - %38 = llvm.load %37 : !llvm.ptr> - %39 = llvm.mlir.constant(1 : i64) : i64 - %40 = llvm.alloca %39 x !llvm.ptr : (i64) -> !llvm.ptr> - llvm.call @_dfr_create_async_task(%6, %2, %3, %25, %4, %35, %4, %40, %4) : (!llvm.ptr, ptr, ptr)>>, i64, i64, !llvm.ptr, i64, !llvm.ptr, i64, !llvm.ptr>, i64) -> () - %41 = llvm.load %40 : !llvm.ptr> - %42 = llvm.mul %arg0, %0 : i64 - %43 = llvm.mul %arg1, %0 : i64 - %44 = llvm.mul %arg2, %0 : i64 - %45 = llvm.mlir.null : !llvm.ptr - %46 = llvm.mlir.constant(1 : index) : i64 - %47 = llvm.getelementptr %45[%46] : (!llvm.ptr, i64) -> !llvm.ptr - %48 = llvm.ptrtoint %47 : !llvm.ptr to i64 - %49 = llvm.call @malloc(%48) : (i64) -> !llvm.ptr - %50 = llvm.bitcast %49 : !llvm.ptr to !llvm.ptr - llvm.store %42, %50 : !llvm.ptr - %51 = llvm.call @_dfr_make_ready_future(%50) : (!llvm.ptr) -> !llvm.ptr - %52 = llvm.mlir.constant(1 : i64) : i64 - %53 = llvm.alloca %52 x !llvm.ptr : (i64) -> !llvm.ptr> - llvm.call @_dfr_create_async_task(%7, %2, %3, %28, %4, %51, %4, %53, %4) : (!llvm.ptr, ptr, ptr)>>, i64, i64, !llvm.ptr, i64, !llvm.ptr, i64, !llvm.ptr>, i64) -> () - %54 = llvm.load %53 : !llvm.ptr> - %55 = llvm.mlir.null : !llvm.ptr - %56 = llvm.mlir.constant(1 : index) : i64 - %57 = llvm.getelementptr %55[%56] : (!llvm.ptr, i64) -> !llvm.ptr - %58 = llvm.ptrtoint %57 : !llvm.ptr to i64 - %59 = llvm.call @malloc(%58) : (i64) -> !llvm.ptr - %60 = llvm.bitcast %59 : !llvm.ptr to !llvm.ptr - llvm.store %43, %60 : !llvm.ptr - %61 = llvm.call @_dfr_make_ready_future(%60) : (!llvm.ptr) -> !llvm.ptr - %62 = llvm.mlir.constant(1 : i64) : i64 - %63 = llvm.alloca %62 x !llvm.ptr : (i64) -> !llvm.ptr> - llvm.call @_dfr_create_async_task(%8, %2, %3, %38, %4, %61, %4, %63, %4) : (!llvm.ptr, ptr, ptr)>>, i64, i64, !llvm.ptr, i64, !llvm.ptr, i64, !llvm.ptr>, i64) -> () - %64 = llvm.load %63 : !llvm.ptr> - %65 = llvm.mlir.null : !llvm.ptr - %66 = llvm.mlir.constant(1 : index) : i64 - %67 = llvm.getelementptr %65[%66] : (!llvm.ptr, i64) -> !llvm.ptr - %68 = llvm.ptrtoint %67 : !llvm.ptr to i64 - %69 = llvm.call @malloc(%68) : (i64) -> !llvm.ptr - %70 = llvm.bitcast %69 : !llvm.ptr to !llvm.ptr - llvm.store %44, %70 : !llvm.ptr - %71 = llvm.call @_dfr_make_ready_future(%70) : (!llvm.ptr) -> !llvm.ptr - %72 = llvm.mlir.constant(1 : i64) : i64 - %73 = llvm.alloca %72 x !llvm.ptr : (i64) -> !llvm.ptr> - llvm.call @_dfr_create_async_task(%9, %2, %3, %41, %4, %71, %4, %73, %4) : (!llvm.ptr, ptr, ptr)>>, i64, i64, !llvm.ptr, i64, !llvm.ptr, i64, !llvm.ptr>, i64) -> () - %74 = llvm.load %73 : !llvm.ptr> - %75 = llvm.mlir.constant(1 : i64) : i64 - %76 = llvm.alloca %75 x !llvm.ptr : (i64) -> !llvm.ptr> - llvm.call @_dfr_create_async_task(%10, %2, %3, %54, %4, %64, %4, %76, %4) : (!llvm.ptr, ptr, ptr)>>, i64, i64, !llvm.ptr, i64, !llvm.ptr, i64, !llvm.ptr>, i64) -> () - %77 = llvm.load %76 : !llvm.ptr> - %78 = llvm.mlir.constant(1 : i64) : i64 - %79 = llvm.alloca %78 x !llvm.ptr : (i64) -> !llvm.ptr> - llvm.call @_dfr_create_async_task(%11, %2, %3, %77, %4, %74, %4, %79, %4) : (!llvm.ptr, ptr, ptr)>>, i64, i64, !llvm.ptr, i64, !llvm.ptr, i64, !llvm.ptr>, i64) -> () - %80 = llvm.load %79 : !llvm.ptr> - %81 = llvm.call @_dfr_await_future(%80) : (!llvm.ptr) -> !llvm.ptr> - %82 = llvm.bitcast %81 : !llvm.ptr> to !llvm.ptr - %83 = llvm.load %82 : !llvm.ptr - llvm.call @_dfr_stop() : () -> () - return %83 : i64 - } - llvm.func @_dfr_DFT_work_function__main0(%arg0: !llvm.ptr, %arg1: !llvm.ptr, %arg2: !llvm.ptr) attributes {_dfr_work_function_attribute} { - %0 = llvm.load %arg0 : !llvm.ptr - %1 = llvm.load %arg1 : !llvm.ptr - llvm.br ^bb1 - ^bb1: // pred: ^bb0 - %2 = llvm.add %0, %1 : i64 - llvm.store %2, %arg2 : !llvm.ptr - llvm.return - } - llvm.func @_dfr_DFT_work_function__main1(%arg0: !llvm.ptr, %arg1: !llvm.ptr, %arg2: !llvm.ptr) attributes {_dfr_work_function_attribute} { - %0 = llvm.load %arg0 : !llvm.ptr - %1 = llvm.load %arg1 : !llvm.ptr - llvm.br ^bb1 - ^bb1: // pred: ^bb0 - %2 = llvm.add %0, %1 : i64 - llvm.store %2, %arg2 : !llvm.ptr - llvm.return - } - llvm.func @_dfr_DFT_work_function__main2(%arg0: !llvm.ptr, %arg1: !llvm.ptr, %arg2: !llvm.ptr) attributes {_dfr_work_function_attribute} { - %0 = llvm.load %arg0 : !llvm.ptr - %1 = llvm.load %arg1 : !llvm.ptr - llvm.br ^bb1 - ^bb1: // pred: ^bb0 - %2 = llvm.add %0, %1 : i64 - llvm.store %2, %arg2 : !llvm.ptr - llvm.return - } - llvm.func @_dfr_DFT_work_function__main3(%arg0: !llvm.ptr, %arg1: !llvm.ptr, %arg2: !llvm.ptr) attributes {_dfr_work_function_attribute} { - %0 = llvm.load %arg0 : !llvm.ptr - %1 = llvm.load %arg1 : !llvm.ptr - llvm.br ^bb1 - ^bb1: // pred: ^bb0 - %2 = llvm.add %0, %1 : i64 - llvm.store %2, %arg2 : !llvm.ptr - llvm.return - } - llvm.func @_dfr_DFT_work_function__main4(%arg0: !llvm.ptr, %arg1: !llvm.ptr, %arg2: !llvm.ptr) attributes {_dfr_work_function_attribute} { - %0 = llvm.load %arg0 : !llvm.ptr - %1 = llvm.load %arg1 : !llvm.ptr - llvm.br ^bb1 - ^bb1: // pred: ^bb0 - %2 = llvm.add %0, %1 : i64 - llvm.store %2, %arg2 : !llvm.ptr - llvm.return - } - llvm.func @_dfr_DFT_work_function__main5(%arg0: !llvm.ptr, %arg1: !llvm.ptr, %arg2: !llvm.ptr) attributes {_dfr_work_function_attribute} { - %0 = llvm.load %arg0 : !llvm.ptr - %1 = llvm.load %arg1 : !llvm.ptr - llvm.br ^bb1 - ^bb1: // pred: ^bb0 - %2 = llvm.add %0, %1 : i64 - llvm.store %2, %arg2 : !llvm.ptr - llvm.return - } - llvm.func @_dfr_DFT_work_function__main6(%arg0: !llvm.ptr, %arg1: !llvm.ptr, %arg2: !llvm.ptr) attributes {_dfr_work_function_attribute} { - %0 = llvm.load %arg0 : !llvm.ptr - %1 = llvm.load %arg1 : !llvm.ptr - llvm.br ^bb1 - ^bb1: // pred: ^bb0 - %2 = llvm.add %0, %1 : i64 - llvm.store %2, %arg2 : !llvm.ptr - llvm.return - } - llvm.func @_dfr_DFT_work_function__main7(%arg0: !llvm.ptr, %arg1: !llvm.ptr, %arg2: !llvm.ptr) attributes {_dfr_work_function_attribute} { - %0 = llvm.load %arg0 : !llvm.ptr - %1 = llvm.load %arg1 : !llvm.ptr - llvm.br ^bb1 - ^bb1: // pred: ^bb0 - %2 = llvm.add %0, %1 : i64 - llvm.store %2, %arg2 : !llvm.ptr - llvm.return - } -)XXX", - "main", true); - - ASSERT_EXPECTED_VALUE(lambda(1_u64, 2_u64, 3_u64), 54); - ASSERT_EXPECTED_VALUE(lambda(2_u64, 5_u64, 1_u64), 72); - ASSERT_EXPECTED_VALUE(lambda(3_u64, 1_u64, 7_u64), 99); -}