A simple OpenMP program {{{ #include #define N 10 int main (int argc, char * argv[]){ double a[N]; int i; #pragma omp parallel #pragma omp for for(i=0; i struct _omp_lock_t >, Globals: , Initializer: , Functions: main : ((int<4>,ref>,1>>)->int<4>) => fun(int<4> v2, ref>,1>> v3) -> int<4> {decl ref,10>> v4 = ( var(undefined(type,10>>)));decl ref> v54 = ( var(undefined(type>)));{merge(parallel(job(([1-inf])){bind(){fun(ref,10>> v103) -> unit {{pfor(getThreadGroup(0), 0, 10, 1, bind(v91, v92, v93){fun(ref,10>> v87, int<4> v88, int<4> v89, int<4> v90) -> unit {for(decl int<4> v64 = v88 .. v89 : v90) {((ref_vector_to_ref_array(v87)&[int_to_uint(v64, 4)]) := 0.0);};}(v103, v91, v92, v93)});(barrier());};mergeAll();}(v4)}}));};merge(parallel(job(([1-inf])){bind(){fun(ref> v105) -> unit {{(v105 := 10);};mergeAll();}(v54)}}));}, Entry Points: {}, MetaInfos: {_omp_lock_t : [class-info < > ]} ) }}} Control flow graph: see attachment Insieme IR: {{{ let fun000 = fun(ref,10>> v87, int<4> v88, int<4> v89, int<4> v90) -> unit { for(decl int<4> v64 = v88 .. v89 : v90) { ((ref_vector_to_ref_array(v87)&[int_to_uint(v64, 4)]) := 0.0); }; }; let fun001 = fun(ref,1>> v1, uint<8> v2, uint<8> v3) -> unit { return unit; }; let fun002 = fun(ref,10>> v103) -> unit { { pfor(getThreadGroup(0), 0, 10, 1, bind(v91, v92, v93){fun000(v103, v91, v92, v93)}); (barrier()); }; mergeAll(); }; let fun003 = fun(ref> v105) -> unit { { (v105 := 10); }; mergeAll(); }; let fun004 = fun(int<4> v2, ref>,1>> v3) -> int<4> { decl ref,10>> v4 = ( var(undefined(type,10>>))); decl ref> v54 = ( var(undefined(type>))); { merge(parallel(job(([1-inf])){ bind(){fun002(v4)} })); }; merge(parallel(job(([1-inf])){ bind(){fun003(v54)} })); return 0; }; // Inspire Program // Entry Point: fun004 }}} target code: {{{ /** * ------------------------ Auto-generated Code ------------------------ * This code was generated by the Insieme Compiler * --------------------------------------------------------------------- */ #include #include #include #include #include struct __insieme_type_10; typedef struct __insieme_type_10 __insieme_type_10; struct __insieme_type_19; typedef struct __insieme_type_19 __insieme_type_19; struct __insieme_type_19 { irt_type_id c0; __insieme_type_10* c1; }; struct __insieme_type_24; typedef struct __insieme_type_24 __insieme_type_24; struct __insieme_type_24 { irt_type_id c0; int32_t* c1; }; struct __insieme_type_26; typedef struct __insieme_type_26 __insieme_type_26; struct __insieme_type_26 { irt_type_id c0; int32_t c1; char** c2; }; // --- components for type table entries --- irt_type_id g_type_2_components[] = {0,1}; irt_type_id g_type_4_components[] = {0,3}; irt_type_id g_type_7_components[] = {0,5,6}; // --- the type table --- irt_type g_insieme_type_table[] = { {IRT_T_UINT32, sizeof(irt_type_id), 0, 0}, {IRT_T_POINTER, sizeof(__insieme_type_10*), 0, 0}, {IRT_T_STRUCT, sizeof(__insieme_type_19), 2, g_type_2_components}, {IRT_T_POINTER, sizeof(int32_t*), 0, 0}, {IRT_T_STRUCT, sizeof(__insieme_type_24), 2, g_type_4_components}, {IRT_T_INT32, sizeof(int32_t), 0, 0}, {IRT_T_POINTER, sizeof(char**), 0, 0}, {IRT_T_STRUCT, sizeof(__insieme_type_26), 3, g_type_7_components} }; struct __insieme_type_10 { double data[10]; }; /* ------- Function Definitions --------- */ void insieme_wi_0_var_0_impl(irt_work_item* var_1) { irt_work_item_range var_2 = (*var_1).range; int32_t var_3 = var_2.begin; int32_t var_4 = var_2.end; int32_t var_5 = var_2.step; { for (int32_t i_ins_it = var_3; i_ins_it < var_4; i_ins_it+=var_5) { ((double*)(*(__insieme_type_19*)(*var_1).parameters).c1)[i_ins_it] = 0.0; }; }; } /* ------- Function Definitions --------- */ void __insieme_fun_21(int32_t* var_1) { { *var_1 = 10; }; irt_wi_join_all(irt_wi_get_current()); } /* ------- Function Definitions --------- */ void insieme_wi_2_var_0_impl(irt_work_item* var_1) { __insieme_fun_21((*(__insieme_type_24*)(*var_1).parameters).c1); } // --- the meta info table --- irt_meta_info_table_entry g_insieme_meta_table[] = { {{ false, 0, 0 },{ false, 0, -1, -1, 0, -1, -1, 0, -1, -1, 0, -1, -1, (2147483647 * 2U + 1U), (2147483647 * 2U + 1U) },{ false, false },{ false, { 0 }, { 0 }, 0, 0, 0 },{ false, "" }}, /* the no-info-entry */ {{ false, 0, 0 },{ false, 0, -1, -1, 0, -1, -1, 0, -1, -1, 0, -1, -1, (2147483647 * 2U + 1U), (2147483647 * 2U + 1U) },{ true, (bool)false },{ false, { 0 }, { 0 }, 0, 0, 0 },{ false, "" }} }; extern irt_wi_implementation g_insieme_impl_table[]; /* ------- Function Definitions --------- */ void __insieme_fun_13(__insieme_type_10* var_1) { { irt_pfor(irt_wi_get_current(), irt_wi_get_wg(irt_wi_get_current(), 0u), (irt_work_item_range){0, 10, 1}, &g_insieme_impl_table[0], (irt_lw_data_item*)(&(__insieme_type_19){2, var_1})); irt_wg_barrier(irt_wi_get_wg(irt_wi_get_current(), 0u)); }; irt_wi_join_all(irt_wi_get_current()); } /* ------- Function Definitions --------- */ void insieme_wi_1_var_0_impl(irt_work_item* var_1) { __insieme_fun_13((*(__insieme_type_19*)(*var_1).parameters).c1); } /* ------- Function Definitions --------- */ int32_t __insieme_fun_8(int32_t argc, char** argv) { __insieme_type_10 a; int32_t i; { irt_merge(irt_parallel(&(irt_parallel_job){(uint64_t)1, (uint64_t)4294967295, (uint64_t)1, &g_insieme_impl_table[1], (irt_lw_data_item*)(&(__insieme_type_19){2, &a})})); }; irt_merge(irt_parallel(&(irt_parallel_job){(uint64_t)1, (uint64_t)4294967295, (uint64_t)1, &g_insieme_impl_table[2], (irt_lw_data_item*)(&(__insieme_type_24){4, &i})})); return 0; } /* ------- Function Definitions --------- */ void insieme_wi_3_var_0_impl(irt_work_item* var_229) { __insieme_fun_8((*(__insieme_type_26*)(*var_229).parameters).c1, (*(__insieme_type_26*)(*var_229).parameters).c2); } // --- work item variants --- irt_wi_implementation_variant g_insieme_wi_0_variants[] = { { &insieme_wi_0_var_0_impl, 0, NULL, 0, NULL, &(g_insieme_meta_table[1]) }, }; irt_wi_implementation_variant g_insieme_wi_1_variants[] = { { &insieme_wi_1_var_0_impl, 0, NULL, 0, NULL, &(g_insieme_meta_table[0]) }, }; irt_wi_implementation_variant g_insieme_wi_2_variants[] = { { &insieme_wi_2_var_0_impl, 0, NULL, 0, NULL, &(g_insieme_meta_table[0]) }, }; irt_wi_implementation_variant g_insieme_wi_3_variants[] = { { &insieme_wi_3_var_0_impl, 0, NULL, 0, NULL, &(g_insieme_meta_table[0]) }, }; // --- the implementation table --- irt_wi_implementation g_insieme_impl_table[] = { { 1, 1, g_insieme_wi_0_variants }, { 2, 1, g_insieme_wi_1_variants }, { 3, 1, g_insieme_wi_2_variants }, { 4, 1, g_insieme_wi_3_variants }, }; void insieme_init_context(irt_context* context) { context->type_table_size = 8; context->type_table = g_insieme_type_table; context->impl_table_size = 4; context->impl_table = g_insieme_impl_table; context->info_table_size = 2; context->info_table = g_insieme_meta_table; context->num_regions = 1; } void insieme_cleanup_context(irt_context* context) { } /* ------- Function Definitions --------- */ int32_t main(int32_t var_227, char** var_228) { irt_runtime_standalone(irt_get_default_worker_count(), &insieme_init_context, &insieme_cleanup_context, &g_insieme_impl_table[3], (irt_lw_data_item*)(&(__insieme_type_26){7, var_227, var_228})); return 0; } }}} ----- No OpenMP transformation (ignoring OpenMP pragma): {{{ let fun000 = fun(int<4> v2, ref>,1>> v3) -> int<4> { decl ref,10>> v4 = ( var(undefined(type,10>>))); decl ref> v54 = ( var(undefined(type>))); for(decl int<4> v64 = 0 .. 10 : 1) { ((ref_vector_to_ref_array(v4)&[int_to_uint(v64, 4)]) := 0.0); }; (v54 := 10); return 0; }; // Inspire Program // Entry Point: fun000 }}}