On Thu, Apr 24, 2014 at 6:00 PM, Benedikt Huber
<benedikt.hu...@theobroma-systems.com> wrote:
> Hi!
>
> I want to uninline some basic blocks to a separate function to aid slp 
> vectorization.
> The new pass runs just before the slp vectorization pass.
> As a first try I create an new and empty function.
> Which in turn will be filled with some copies of basic blocks from the 
> original function.
> As an example I was looking at code in omp-low.c
> The pass itself seem to be successful,
> however I do not see the new function printed when using 
> -fdump-tree-all-details.
> Further more an ipa pass crashes with a segfault at an seemingly unrelated 
> location.
> I call gcc like this.
>
> /home/bhuber/sandbox/gcc/install/bin/gcc -std=c99 -O3 -I . -S 
> -fdump-tree-all-details -fdump-rtl-all-details -fdump-tree-vect=vec.out 
> -fopt-info-vec-missed=missed.out -ftree-vectorizer-verbose=6 
> -funinline-innermost-loops -ftree-slp-vectorize -Wall -Wextra 
> /home/bhuber/sandbox/try/vectorizable.c
> /home/bhuber/sandbox/try/vectorizable.c: In function '_GLOBAL__N_foo':
> /home/bhuber/sandbox/try/vectorizable.c:61:6: internal compiler error: 
> Segmentation fault
>  void foo ( int M
>       ^
> 0x99be1f crash_signal
>         ../../src/gcc/toplev.c:337
> 0x9cdaac execute_fixup_cfg()
>         ../../src/gcc/tree-cfg.c:8413
> Please submit a full bug report,
> with preprocessed source if appropriate.
> Please include the complete backtrace with any bug report.
> See <http://gcc.gnu.org/bugs.html> for instructions.
> bhuber@android:~/sandbox/try/foo$
>
> The function to generate the empty function looks like this:
>
> static unsigned int
> make_empty_function (void)
> {
>   tree name, decl, type, t, block;
>   gimple_seq body = NULL;
>   gimple bind;
>
>   type = build_function_type_list (void_type_node, NULL_TREE);
>   name = get_file_function_name ("N");
>   decl = build_decl (input_location,
>                      FUNCTION_DECL, name, type);
>
>   TREE_STATIC (decl) = 1;
>   TREE_USED (decl) = 1;
>   DECL_ARTIFICIAL (decl) = 1;
>   DECL_NAMELESS (decl) = 0;
>   DECL_IGNORED_P (decl) = 0;
>   TREE_PUBLIC (decl) = 0;
>   DECL_UNINLINABLE (decl) = 1;
>   DECL_EXTERNAL (decl) = 0;
>   DECL_CONTEXT (decl) = NULL_TREE;
>
>   block = make_node (BLOCK);
>   DECL_INITIAL (decl) = block;
>
>   t = build_decl (DECL_SOURCE_LOCATION (decl),
>                   RESULT_DECL, NULL_TREE, void_type_node);
>   DECL_ARTIFICIAL (t) = 1;
>   DECL_IGNORED_P (t) = 1;
>   DECL_CONTEXT (t) = decl;
>   DECL_RESULT (decl) = t;
>
>   push_struct_function (decl);
>
>   pop_cfun ();
>
>   bind = gimple_build_bind (NULL, body, block);
>   gimple_seq_add_stmt (&body, bind);
>   gimple_set_body (decl, body);
>
>   DECL_STRUCT_FUNCTION (decl)->curr_properties = cfun->curr_properties;
>
>   cgraph_add_new_function (decl, true);
>
>   return 0;
> }
>
> I am working on trunk.
> Please note that this is experimental code to get to know gcc internals.
> What am I doing wrong?

Look at move_sese_region_to_fn (and it's user).

RIchard.

> Thank you in advance and best regards,
> Benedikt

Reply via email to