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