[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