[LLVMdev] LLVM and OpenMP

Anton Korobeynikov asl at math.spbu.ru
Thu Nov 29 13:39:42 PST 2007


Wojciech,

I've just commited a patch to llvm-gcc 4.2, which moves openmp lowering
stuff to be run little bit earlier, so llvm-convert will catch its
result. It looks now gcc atomic & sync builtins should be introduced to
llvm as a remaining ingredient.

Example program from Diego's paper now compiles to:

@.str = internal constant [10 x i8] c"sum = %d\0A\00"           ; <[10 x
i8]*> [#uses=1]

define i32 @main() {
entry:
        %sum = alloca i32               ; <i32*> [#uses=3]
        %.omp_data_o.3 = alloca %struct..omp_data_s.1           ; <%
struct..omp_data_s.1*> [#uses=2]
        store i32 0, i32* %sum, align 4
        %tmp = getelementptr %struct..omp_data_s.1* %.omp_data_o.3, i32
0, i32 0                ; <i32**> [#uses=1]
        store i32* %sum, i32** %tmp, align 8
        %.omp_data_o.31 = bitcast %struct..omp_data_s.1* %.omp_data_o.3
to i8*          ; <i8*> [#uses=2]
        call void @GOMP_parallel_start( void (i8*)* @main.omp_fn.0, i8*
%.omp_data_o.31, i32 0 ) nounwind
        call void @main.omp_fn.0( i8* %.omp_data_o.31 )
        call void @GOMP_parallel_end( ) nounwind
        %tmp3 = load i32* %sum, align 4         ; <i32> [#uses=1]
        %tmp5 = call i32 (i8*, ...)* @printf( i8* getelementptr ([10 x
i8]* @.str, i32 0, i32 0), i32 %tmp3 ) nounwind      $
        ret i32 undef
}

define internal void @main.omp_fn.0(i8* %.omp_data_i) {
entry:
        %tmp1 = tail call i32 (...)*
@omp_get_thread_num( )             ; <i32> [#uses=1]
        %tmp3 = bitcast i8* %.omp_data_i to i32**               ;
<i32**> [#uses=1]
        %tmp4 = load i32** %tmp3, align 4               ; <i32*>
[#uses=1]
        %tmp45 = bitcast i32* %tmp4 to i8*              ; <i8*>
[#uses=1]
        %tmp6 = tail call i32 @__sync_fetch_and_add_4( i8* %tmp45, i32 %
tmp1 ) nounwind                 ; <i32> [#uses=0]
        ret void
}

-- 
With best regards, Anton Korobeynikov.

Faculty of Mathematics & Mechanics, Saint Petersburg State University.





More information about the llvm-dev mailing list