[LLVMdev] Fwd: Documentation about converting GIMPLE IR to LLVM IR in LLVM-GCC/DragonEgg

Mahesha S mahesha.llvm at gmail.com
Thu Jul 12 21:50:19 PDT 2012


Hello Duncan Sands,

>From your reply, what I can understand is that there is no any new OPENMP
specific instructions introduced into LLVM IR as a part of DragonEgg
project since GCC has already done the job of lowering OpenMP directives
into GOMP runtime library calls at LOW GIMPLE IR level.

Now, it throws up following questions.


   1. Am I correct that DragoEgg should logically supports all the OMP
   benchmarks as supported by GCC (4.5 or later)?
   2. If we decide to support OpenMP directly in LLVM what is the better
   way to handle it? Suppose, assume that we decide to support OpenMP through
   Clang. Then, do you think that Clang should also follow the same mechanism
   as DragoEgg does by lowering all the OpenMP directives into OMP runtime
   library calls so that it is not necessary to add any extra new OpenMP
   related instructions into LLVM IR?
   3. Assume that tomorrow, some other front-end other than GCC/Clang is
   being plugged into LLVM back-end. Or assume that sometime later new FROTRAN
   front-end is being introduced along with Clang. Or Someone wants to plug-in
   EDG front-end into LVVM back-end. Or OpenACC needs to be supported in LLVM.
   Or OpenACC may get merge with OpenMP and becomes of one of the standard
   platforms to program heterogeneous architectures. By considering all these
   and other future possibilities, what is the best way to support OpenMP in
   LLVM. By best, I mean here that LLVM should not compromise with any other
   compilers in terms of OpenMP features completeness, bench mark results, and
   the OpenMP infrastructure laid out in LLVM should be flexible enough to
   handle above mentioned future possibilities.

It would be great, if you throw some light upon it.

-mahesh


On Fri, Jul 13, 2012 at 8:54 AM, Mahesha S <mahesha.llvm at gmail.com> wrote:

> Hello Duncan Sands,
>
> From your reply, what I can understand is that there is no any new OPENMP
> specific instructions
>
>
> On Thu, Jul 12, 2012 at 7:48 PM, Duncan Sands <baldrick at free.fr> wrote:
>
>> Hi Mahesha,
>> > I am trying to understand the process followed for converting GIMPLE IR
>> to LLVM
>> > IR in LLVM-GCC/DragonEgg - more importantly conversion of OpenMP
>> extended GIMPLE
>> > IR to LLVM IR. It would be great if anybody points me to some
>> documentation
>> > before I my-self delve into the understanding of related source code.
>>
>> dragonegg doesn't have to do anything special for openmp, since gcc has
>> already
>> lowered it to a bunch of extra functions and library calls by that point.
>>
>> Ciao, Duncan.
>>
>> PS: Here's an example:
>>
>> void foo()
>> {
>>    int i;
>>
>>    #pragma omp parallel
>>      {
>>      #pragma omp parallel
>>        {
>>        #pragma omp parallel
>>          {
>>            i++;
>>          }
>>        }
>>      }
>> }
>>
>> -> (the LLVM IR is a direct transliteration of the gimple):
>>
>> target datalayout =
>>
>> "e-p:64:64:64-S128-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f16:16:16-f32:32:32-f64:64:64-f128:128:128-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
>> target triple = "x86_64-unknown-linux-gnu"
>>
>> module asm "\09.ident\09\22GCC: (GNU) 4.7.1 20120603 (prerelease) LLVM:
>> 3.2svn\22"
>>
>> %struct..omp_data_s.2 = type { i32* }
>> %struct..omp_data_s.1 = type { i32* }
>> %struct..omp_data_s.0 = type { i32 }
>>
>> define internal void @foo._omp_fn.2(i8* nocapture %.omp_data_i) nounwind
>> uwtable {
>> entry:
>>    %0 = bitcast i8* %.omp_data_i to i32**
>>    %1 = load i32** %0, align 8
>>    %2 = load i32* %1, align 4
>>    %3 = add i32 %2, 1
>>    store i32 %3, i32* %1, align 4
>>    ret void
>> }
>>
>> define internal void @foo._omp_fn.1(i8* nocapture %.omp_data_i) nounwind
>> uwtable {
>> entry:
>>    %.omp_data_o.3 = alloca %struct..omp_data_s.2, align 8
>>    %0 = bitcast i8* %.omp_data_i to i32**
>>    %1 = load i32** %0, align 8
>>    %2 = getelementptr inbounds %struct..omp_data_s.2* %.omp_data_o.3, i64
>> 0, i32 0
>>    store i32* %1, i32** %2, align 8
>>    %3 = bitcast %struct..omp_data_s.2* %.omp_data_o.3 to i8*
>>    call void @GOMP_parallel_start(void (i8*)* @foo._omp_fn.2, i8* %3, i32
>> 0)
>> nounwind
>>    call void @foo._omp_fn.2(i8* %3) nounwind uwtable
>>    call void @GOMP_parallel_end() nounwind
>>    ret void
>> }
>>
>> declare void @GOMP_parallel_start(void (i8*)*, i8*, i32) nounwind
>>
>> declare void @GOMP_parallel_end() nounwind
>>
>> define internal void @foo._omp_fn.0(i8* %.omp_data_i) nounwind uwtable {
>> entry:
>>    %.omp_data_o.4 = alloca %struct..omp_data_s.1, align 8
>>    %0 = bitcast i8* %.omp_data_i to i32*
>>    %1 = getelementptr inbounds %struct..omp_data_s.1* %.omp_data_o.4, i64
>> 0, i32 0
>>    store i32* %0, i32** %1, align 8
>>    %2 = bitcast %struct..omp_data_s.1* %.omp_data_o.4 to i8*
>>    call void @GOMP_parallel_start(void (i8*)* @foo._omp_fn.1, i8* %2, i32
>> 0)
>> nounwind
>>    call void @foo._omp_fn.1(i8* %2) nounwind uwtable
>>    call void @GOMP_parallel_end() nounwind
>>    ret void
>> }
>>
>> define void @foo(...) nounwind uwtable {
>> entry:
>>    %.omp_data_o.5 = alloca %struct..omp_data_s.0, align 8
>>    %0 = bitcast %struct..omp_data_s.0* %.omp_data_o.5 to i8*
>>    call void @GOMP_parallel_start(void (i8*)* @foo._omp_fn.0, i8* %0, i32
>> 0)
>> nounwind
>>    call void @foo._omp_fn.0(i8* %0) nounwind uwtable
>>    call void @GOMP_parallel_end() nounwind
>>    ret void
>> }
>> _______________________________________________
>> LLVM Developers mailing list
>> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>>
>
>
>
> --
> Cheers
> -mahesha
>
>


-- 
Cheers
-mahesha




-- 
Cheers
-mahesha
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20120713/13b13376/attachment.html>


More information about the llvm-dev mailing list