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.
Anton Korobeynikov wrote:> 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:Thanks, Anton! The compiled code seems to be ok. IIRC, there is a project aiming at introducing gcc atomic and sync builtins. It is temporarily suspended, but when it is eventually finished, OpenMP will be a nice thing to test it with:) Kind regards, Wojtek
On Fri, 30 Nov 2007, Anton Korobeynikov wrote:> 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:Very nice Anton!! -Chris> @.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 > } > >-Chris -- http://nondot.org/sabre/ http://llvm.org/
Seemingly Similar Threads
- [LLVMdev] Fwd: Documentation about converting GIMPLE IR to LLVM IR in LLVM-GCC/DragonEgg
- [LLVMdev] Documentation about converting GIMPLE IR to LLVM IR in LLVM-GCC/DragonEgg
- [LLVMdev] Accessing structure members of .omp_data_i
- [LLVMdev] OpenMPI and llvm-gcc
- [LLVMdev] Redundant Add Operation in Code Generation?