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? Thank you in advance and best regards, Benedikt