Hi!

Certain GIMPLE codes, such as OpenMP ones, have a structured block
attached to them, for exmaple, gcc/gimple.def:GIMPLE_OMP_PARALLEL:

    /* GIMPLE_OMP_PARALLEL <BODY, CLAUSES, CHILD_FN, DATA_ARG> represents
    
       #pragma omp parallel [CLAUSES]
       BODY
    
       BODY is a the sequence of statements to be executed by all threads.
    [...]
       CHILD_FN is set when outlining the body of the parallel region.
       All the statements in BODY are moved into this newly created
       function when converting OMP constructs into low-GIMPLE.
    [...]
    DEFGSCODE(GIMPLE_OMP_PARALLEL, "gimple_omp_parallel", 
GSS_OMP_PARALLEL_LAYOUT)

Using -ftree-dump-all, I can see this structured block (BODY) getting
dumped, but it then "disappears" in the ompexp pass', and "reappears" (as
function main._omp_fn.0) in the next ssa pass' dump.

If I'm correctly understanding the GCC sources as well as operating GDB,
in the gimple pass we get main._omp_fn.0 dumped because
gcc/cgraphunit.c:analyze_functions iterates over all functions
(analyze_function -> dump_function).  In the following passes,
presumably, this is not done anymore: omplower, lower, eh, cfg.  In
ompexp, the GIMPLE_OMP_PARALLEL is expanded into a
»__builtin_GOMP_parallel (main._omp_fn.0)« call, but the main._omp_fn.0
is not dumped (and there is no BODY anymore to dump).  In the next ssa
pass, main._omp_fn.0 again is being dumped, by means of
gcc/passes.c:do_per_function_toporder (execute_pass_list ->
execute_one_pass -> execute_function_dump -> dump_function_to_file), as I
understand it.  What do I need to modify to get main._omp_fn.0 included
in the dumps before the ssa pass, too?

Example:

    int
    main(void)
    {
    #pragma omp parallel
      {
        extern void foo(void);
        foo ();
      }
      return 0;
    }

p2.c.003t.original:

    ;; Function main (null)
    {
      #pragma omp parallel
        {
          {
            {
              extern void foo (void);
              foo ();
            }
          }
        }
      return 0;
    }

p2.c.004t.gimple:

    main ()
    {
      int D.1749;
      #pragma omp parallel
        {
          {
            extern void foo (void);
            foo ();
          }
        }
      D.1749 = 0;
      return D.1749;
    }
    
    main._omp_fn.0 (void * .omp_data_i)
    {
      <bb 5>:
      <bb 3>:
      foo ();
      return;
    
    }

p2.c.006t.omplower:

    ;; Function main (main, funcdef_no=0, decl_uid=1743, symbol_order=0)
    main ()
    {
      int D.1749;
      {
        #pragma omp parallel [child fn: main._omp_fn.0 (???)]
          {
            extern void foo (void);
    
            foo ();
          }
          #pragma omp return
      }
      D.1749 = 0;
      return D.1749;
    }

p2.c.007t.lower, p2.c.010t.eh:

    ;; Function main (main, funcdef_no=0, decl_uid=1743, symbol_order=0)
    main ()
    {
      int D.1749;
      #pragma omp parallel [child fn: main._omp_fn.0 (???)]
      foo ();
      #pragma omp return
      D.1749 = 0;
      goto <D.1754>;
      <D.1754>:
      return D.1749;
    }

p2.c.011t.cfg:

    ;; Function main (main, funcdef_no=0, decl_uid=1743, symbol_order=0)
    [...]
    main ()
    {
      int D.1749;
      <bb 2>:
      #pragma omp parallel [child fn: main._omp_fn.0 (???)]
      <bb 3>:
      foo ();
      #pragma omp return
      <bb 4>:
      D.1749 = 0;
      return D.1749;
    
    }

p2.c.012t.ompexp:

    ;; Function main (main, funcdef_no=0, decl_uid=1743, symbol_order=0)
    OMP region tree
    bb 2: gimple_omp_parallel
    bb 3: GIMPLE_OMP_RETURN
    Introduced new external node (foo/2).
    Merging blocks 2 and 6
    Merging blocks 2 and 4
    main ()
    {
      int D.1749;
      <bb 2>:
      __builtin_GOMP_parallel (main._omp_fn.0, 0B, 0, 0);
      D.1749 = 0;
      return D.1749;
    }

p2.c.015t.ssa:

    ;; Function main._omp_fn.0 (main._omp_fn.0, funcdef_no=1, decl_uid=1751, 
symbol_order=1)
    main._omp_fn.0 (void * .omp_data_i)
    {
      <bb 5>:
      <bb 3>:
      foo ();
      return;
    }
    
    ;; Function main (main, funcdef_no=0, decl_uid=1743, symbol_order=0)
    main ()
    {
      int _3;
      <bb 2>:
      __builtin_GOMP_parallel (main._omp_fn.0, 0B, 0, 0);
      _3 = 0;
      return _3;
    }


Grüße,
 Thomas

Attachment: pgpv_AdE6Cp9f.pgp
Description: PGP signature

Reply via email to