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,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 }}} 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 }}}