On Wed, 13 Mar 2019, Bin.Cheng wrote: > On Wed, Mar 13, 2019 at 3:58 AM Richard Biener <rguent...@suse.de> wrote: > > > > > > This makes an attempt at fixing the most annoying parts of the GIMPLE > > FE unit testing - the lack of proper CFG preservation and hoops you > > need to jump through to make the CFG and SSA builders happy. > > > > Due to this the __GIMPLE specifiers takes two new flags, "cfg" > > for GIMPLE-with-a-CFG and "ssa" for GIMPLE-with-a-CFG-and-SSA. > > When there is a CFG you need to start basic-block boundaries with > > > > __BB(index): > > > > where 'index' is the basic-block index. That implicitely defines > > a label __BBindex for use in goto stmts and friends (but doesn't > > actually add a GIMPLE_LABEL). > > > > The parsing code isn't defensive right now so you need to watch > > out to not use index 0 or 1 (entry and exit block) which are > > only implicitely present. > > > > As a proof of concept I added one BB annotation - loop_header(num) > > where "num" is the loop number. This means you can now also > > have loop structures preserved (to some extent - the loop tree is > > not explicitely represented nor are loop fathers, both are re-built > > via fixup). > > > > I've not yet adjusted -gimple dumping. > > > > I've adjusted all testcases I could find. > > > > The CFG build inside the frontend is a bit awkward (spread out...), > > likewise some functionality is asking for split-out. > > > > This is mainly a RFC for whether you think this is forward looking > > enough. Future enhancements would include EH and abnormal edges > > via stmt annotations: > Thanks very much for doing this. Do we have a centralized > wiki/document on the formal definition? It would be very helpful even > it's still evolving, otherwise we would need to dig into messages for > fragmented clues.
Earlier this week I transformed the old https://gcc.gnu.org/wiki/GimpleFrontEnd page into one documenting the current state but this doesn't yet include any kind of documentation. I suppose special syntax documentation should go into our texinfo docs, I guess into a new section in the internals manual. Currently we only have documentation for the -fgimple switch. Note that I view -gimple dumping as the thing that should give you a clue about expected syntax. I hope to spend a little more time on the patch to make it ready for GCC9. Richard. > Thanks, > bin > > > > __BB(2): > > foo () goto __BB3 __EDGE_EH; // EH edge to BB3 > > > > __BB(3): > > setjmp () goto __BB4 __EDGE_AB; // abnormal edge to BB4 > > > > __BB(4): > > _1 = _5 / 0. __NOTHROW; // gimple_nothrow_p is true > > _3 = _2 / _4 goto __BB5 __EDGE_EH; // EH edge to BB5 > > > > etc. extra edge flags: > > > > goto __BB5 __EDGE_EXECUTABLE; > > > > I guess now is the time for bike-shedding. > > > > Richard. > > > > 2019-03-12 Richard Biener <rguent...@suse.de> > > > > c/ > > * c-tree.h (enum c_declspec_il): New. > > (struct c_declspecs): Merge gimple_p and rtl_p into declspec_il > > enum bitfield. > > * c-parser.c (c_parser_declaration_or_fndef): Adjust accordingly. > > Pass start pass and declspec_il to c_parser_parse_gimple_body. > > (c_parser_declspecs): Adjust. > > * gimple-parser.c: Include cfg.h, cfghooks.h, cfganal.h, tree-cfg.h, > > gimple-iterator.h, cfgloop.h, tree-phinodes.h, tree-into-ssa.h > > and bitmap.h. > > (struct gimple_parser_edge): New. > > (edges, current_bb): New globals. > > (c_parser_gimple_parse_bb_spec): New helper. > > (c_parser_parse_gimple_body): Get start pass and IL specification. > > Initialize SSA and CFG. > > (c_parser_gimple_compound_statement): Handle CFG build. > > (c_parser_gimple_statement): Change intermittend __PHI internal > > function arg. > > (c_parser_gimple_or_rtl_pass_list): Handle ssa, cfg flags. > > (c_parser_gimple_goto_stmt): Record edges to build. > > (c_parser_gimple_if_stmt): Likewise. > > * gimple-parser.h (c_parser_parse_gimple_body): Adjust. > > (c_parser_gimple_or_rtl_pass_list): Likewise. > > > > * gcc.dg/gimplefe-13.c: Adjust. > > ... > > > > Index: gcc/c/c-parser.c > > =================================================================== > > --- gcc/c/c-parser.c (revision 269604) > > +++ gcc/c/c-parser.c (working copy) > > @@ -2324,19 +2324,9 @@ c_parser_declaration_or_fndef (c_parser > > DECL_STRUCT_FUNCTION (current_function_decl)->function_start_locus > > = c_parser_peek_token (parser)->location; > > > > - /* If the definition was marked with __GIMPLE then parse the > > - function body as GIMPLE. */ > > - if (specs->gimple_p) > > - { > > - cfun->pass_startwith = specs->gimple_or_rtl_pass; > > - bool saved = in_late_binary_op; > > - in_late_binary_op = true; > > - c_parser_parse_gimple_body (parser); > > - in_late_binary_op = saved; > > - } > > - /* Similarly, if it was marked with __RTL, use the RTL parser now, > > + /* If the definition was marked with __RTL, use the RTL parser now, > > consuming the function body. */ > > - else if (specs->rtl_p) > > + if (specs->declspec_il == cdil_rtl) > > { > > c_parser_parse_rtl_body (parser, specs->gimple_or_rtl_pass); > > > > @@ -2350,6 +2340,16 @@ c_parser_declaration_or_fndef (c_parser > > finish_function (); > > return; > > } > > + /* If the definition was marked with __GIMPLE then parse the > > + function body as GIMPLE. */ > > + else if (specs->declspec_il != cdil_none) > > + { > > + bool saved = in_late_binary_op; > > + in_late_binary_op = true; > > + c_parser_parse_gimple_body (parser, specs->gimple_or_rtl_pass, > > + specs->declspec_il); > > + in_late_binary_op = saved; > > + } > > else > > fnbody = c_parser_compound_statement (parser); > > tree fndecl = current_function_decl; > > @@ -2372,8 +2372,8 @@ c_parser_declaration_or_fndef (c_parser > > add_stmt (fnbody); > > finish_function (); > > } > > - /* Get rid of the empty stmt list for GIMPLE. */ > > - if (specs->gimple_p) > > + /* Get rid of the empty stmt list for GIMPLE/RTL. */ > > + if (specs->declspec_il != cdil_none) > > DECL_SAVED_TREE (fndecl) = NULL_TREE; > > > > break; > > @@ -2882,15 +2882,15 @@ c_parser_declspecs (c_parser *parser, st > > if (! flag_gimple) > > error_at (loc, "%<__GIMPLE%> only valid with %<-fgimple%>"); > > c_parser_consume_token (parser); > > - specs->gimple_p = true; > > + specs->declspec_il = cdil_gimple; > > specs->locations[cdw_gimple] = loc; > > - specs->gimple_or_rtl_pass = c_parser_gimple_or_rtl_pass_list > > (parser); > > + c_parser_gimple_or_rtl_pass_list (parser, specs); > > break; > > case RID_RTL: > > c_parser_consume_token (parser); > > - specs->rtl_p = true; > > + specs->declspec_il = cdil_rtl; > > specs->locations[cdw_rtl] = loc; > > - specs->gimple_or_rtl_pass = c_parser_gimple_or_rtl_pass_list > > (parser); > > + c_parser_gimple_or_rtl_pass_list (parser, specs); > > break; > > default: > > goto out; > > Index: gcc/c/c-tree.h > > =================================================================== > > --- gcc/c/c-tree.h (revision 269604) > > +++ gcc/c/c-tree.h (working copy) > > @@ -288,6 +288,14 @@ enum c_declspec_word { > > enumerator. */ > > }; > > > > +enum c_declspec_il { > > + cdil_none, > > + cdil_gimple, /* __GIMPLE */ > > + cdil_gimple_cfg, /* __GIMPLE(cfg) */ > > + cdil_gimple_ssa, /* __GIMPLE(ssa) */ > > + cdil_rtl /* __RTL */ > > +}; > > + > > /* A sequence of declaration specifiers in C. When a new declaration > > specifier is added, please update the enum c_declspec_word above > > accordingly. */ > > @@ -326,6 +334,7 @@ struct c_declspecs { > > /* The kind of type specifier if one has been seen, ctsk_none > > otherwise. */ > > ENUM_BITFIELD (c_typespec_kind) typespec_kind : 3; > > + ENUM_BITFIELD (c_declspec_il) declspec_il : 3; > > /* Whether any expressions in typeof specifiers may appear in > > constant expressions. */ > > BOOL_BITFIELD expr_const_operands : 1; > > @@ -381,10 +390,6 @@ struct c_declspecs { > > /* Whether any alignment specifier (even with zero alignment) was > > specified. */ > > BOOL_BITFIELD alignas_p : 1; > > - /* Whether any __GIMPLE specifier was specified. */ > > - BOOL_BITFIELD gimple_p : 1; > > - /* Whether any __RTL specifier was specified. */ > > - BOOL_BITFIELD rtl_p : 1; > > /* The address space that the declaration belongs to. */ > > addr_space_t address_space; > > }; > > Index: gcc/c/gimple-parser.c > > =================================================================== > > --- gcc/c/gimple-parser.c (revision 269604) > > +++ gcc/c/gimple-parser.c (working copy) > > @@ -54,6 +54,15 @@ along with GCC; see the file COPYING3. > > #include "gimple-ssa.h" > > #include "tree-dfa.h" > > #include "internal-fn.h" > > +#include "cfg.h" > > +#include "cfghooks.h" > > +#include "cfganal.h" > > +#include "tree-cfg.h" > > +#include "gimple-iterator.h" > > +#include "cfgloop.h" > > +#include "tree-phinodes.h" > > +#include "tree-into-ssa.h" > > +#include "bitmap.h" > > > > > > /* Gimple parsing functions. */ > > @@ -75,11 +84,34 @@ static void c_finish_gimple_return (loca > > static tree c_parser_gimple_paren_condition (c_parser *); > > static void c_parser_gimple_expr_list (c_parser *, vec<tree> *); > > > > +struct gimple_parser_edge > > +{ > > + gimple_parser_edge (int s, int d, int f) : src(s), dest(d), flags(f) {} > > + int src; > > + int dest; > > + int flags; > > +}; > > + > > +static vec<gimple_parser_edge> edges = vNULL; > > +static basic_block current_bb; > > + > > +static bool > > +c_parser_gimple_parse_bb_spec (tree val, int *index) > > +{ > > + if (strncmp (IDENTIFIER_POINTER (val), "__BB", 4) != 0) > > + return false; > > + for (const char *p = IDENTIFIER_POINTER (val) + 4; *p; ++p) > > + if (!ISDIGIT (*p)) > > + return false; > > + *index = atoi (IDENTIFIER_POINTER (val) + 4); > > + return *index > 0; > > +} > > > > /* Parse the body of a function declaration marked with "__GIMPLE". */ > > > > void > > -c_parser_parse_gimple_body (c_parser *parser) > > +c_parser_parse_gimple_body (c_parser *parser, char *gimple_pass, > > + enum c_declspec_il cdil) > > { > > gimple_seq seq = NULL; > > gimple_seq body = NULL; > > @@ -87,9 +119,34 @@ c_parser_parse_gimple_body (c_parser *pa > > push_scope (); > > location_t loc1 = c_parser_peek_token (parser)->location; > > > > + cfun->pass_startwith = gimple_pass; > > init_tree_ssa (cfun); > > > > - if (! c_parser_gimple_compound_statement (parser, &seq)) > > + if (cdil == cdil_gimple) > > + /* While we have SSA names in the IL we do not have a CFG built yet > > + and PHIs are represented using a PHI internal function. We do > > + have lowered control flow and exception handling (well, we do not > > + have parser support for EH yet). But as we still have BINDs > > + we have to go through lowering again. */ > > + cfun->curr_properties = PROP_gimple_any; > > + else > > + { > > + /* We have at least cdil_gimple_cfg. */ > > + gimple_register_cfg_hooks (); > > + init_empty_tree_cfg (); > > + /* Initialize the bare loop structure - we are going to only > > + mark headers and leave the rest to fixup. */ > > + set_loops_for_fn (cfun, ggc_cleared_alloc<struct loops> ()); > > + init_loops_structure (cfun, loops_for_fn (cfun), 1); > > + loops_state_set (cfun, > > LOOPS_NEED_FIXUP|LOOPS_MAY_HAVE_MULTIPLE_LATCHES); > > + cfun->curr_properties > > + |= PROP_gimple_lcf | PROP_gimple_leh | PROP_cfg | PROP_loops; > > + if (cdil == cdil_gimple_ssa) > > + cfun->curr_properties |= PROP_ssa; > > + } > > + > > + if (! c_parser_gimple_compound_statement (parser, &seq) > > + && cdil == cdil_gimple) > > { > > gimple *ret = gimple_build_return (NULL); > > gimple_seq_add_stmt (&seq, ret); > > @@ -104,18 +161,90 @@ c_parser_parse_gimple_body (c_parser *pa > > BLOCK_CHAIN (block) = NULL_TREE; > > TREE_ASM_WRITTEN (block) = 1; > > > > - gbind *bind_stmt = gimple_build_bind (BIND_EXPR_VARS (stmt), NULL, > > - BIND_EXPR_BLOCK (stmt)); > > - gimple_bind_set_body (bind_stmt, seq); > > - gimple_seq_add_stmt (&body, bind_stmt); > > - gimple_set_body (current_function_decl, body); > > - > > - /* While we have SSA names in the IL we do not have a CFG built yet > > - and PHIs are represented using a PHI internal function. We do > > - have lowered control flow and exception handling (well, we do not > > - have parser support for EH yet). But as we still have BINDs > > - we have to go through lowering again. */ > > - cfun->curr_properties = PROP_gimple_any; > > + if (cdil == cdil_gimple) > > + { > > + gbind *bind_stmt = gimple_build_bind (BIND_EXPR_VARS (stmt), NULL, > > + BIND_EXPR_BLOCK (stmt)); > > + gimple_bind_set_body (bind_stmt, seq); > > + gimple_seq_add_stmt (&body, bind_stmt); > > + gimple_set_body (current_function_decl, body); > > + } > > + else > > + { > > + /* Control-flow and binds are lowered, record local decls. */ > > + for (tree var = BIND_EXPR_VARS (stmt); var; var = DECL_CHAIN (var)) > > + if (VAR_P (var) > > + && !DECL_EXTERNAL (var)) > > + add_local_decl (cfun, var); > > + /* We have a CFG. Build the edges. */ > > + for (unsigned i = 0; i < edges.length (); ++i) > > + make_edge (BASIC_BLOCK_FOR_FN (cfun, edges[i].src), > > + BASIC_BLOCK_FOR_FN (cfun, edges[i].dest), > > edges[i].flags); > > + /* Add fallthru edges and edges for case labels. > > + Entry and exit block are already treated specially. */ > > + basic_block bb; > > + FOR_EACH_BB_FN (bb, cfun) > > + if (EDGE_COUNT (bb->succs) == 0) > > + { > > + gimple *last = last_stmt (bb); > > + if (gswitch *sw = safe_dyn_cast <gswitch *> (last)) > > + for (unsigned i = 0; i < gimple_switch_num_labels (sw); ++i) > > + { > > + basic_block label_bb = gimple_switch_label_bb (cfun, sw, > > i); > > + make_edge (bb, label_bb, 0); > > + } > > + else if (!last > > + || !is_gimple_call (last) > > + || !gimple_call_noreturn_p (last)) > > + make_edge (bb, bb->next_bb, EDGE_FALLTHRU); > > + } > > + /* With SSA lower PHIs parsed as internal function calls and > > + update stmts. */ > > + if (cdil == cdil_gimple_ssa) > > + { > > + init_ssa_operands (cfun); > > + FOR_EACH_BB_FN (bb, cfun) > > + { > > + bool phis = true; > > + for (gimple_stmt_iterator gsi = gsi_start_bb (bb); > > + !gsi_end_p (gsi);) > > + { > > + gimple *stmt = gsi_stmt (gsi); > > + if (phis && gimple_call_internal_p (stmt, IFN_PHI)) > > + { > > + gphi *phi = create_phi_node (gimple_call_lhs (stmt), > > bb); > > + for (unsigned i = 0; i < gimple_call_num_args (stmt); > > i += 2) > > + { > > + int src_index; > > + if (c_parser_gimple_parse_bb_spec > > (gimple_call_arg (stmt, i), > > + &src_index)) > > + { > > + edge e = find_edge (BASIC_BLOCK_FOR_FN (cfun, > > src_index), > > + bb); > > + if (e) > > + add_phi_arg (phi, gimple_call_arg (stmt, i > > + 1), e, > > + UNKNOWN_LOCATION); > > + } > > + } > > + gsi_remove (&gsi, false); > > + } > > + else > > + { > > + phis = false; > > + update_stmt (stmt); > > + gsi_next (&gsi); > > + } > > + } > > + } > > + /* No explicit virtual operands (yet). */ > > + bitmap_obstack_initialize (NULL); > > + update_ssa (TODO_update_ssa_only_virtuals); > > + bitmap_obstack_release (NULL); > > + } > > + fix_loop_structure (NULL); > > + } > > + edges.release (); > > + current_bb = NULL; > > > > dump_function (TDI_gimple, current_function_decl); > > } > > @@ -197,6 +326,8 @@ c_parser_gimple_compound_statement (c_pa > > if (! c_parser_require (parser, CPP_SEMICOLON, > > "expected %<;%>")) > > return return_p; > > + if (cfun->curr_properties & PROP_cfg) > > + make_edge (current_bb, EXIT_BLOCK_PTR_FOR_FN (cfun), 0); > > break; > > default: > > goto expr_stmt; > > @@ -208,6 +339,134 @@ c_parser_gimple_compound_statement (c_pa > > c_parser_gimple_label (parser, seq); > > break; > > } > > + /* Basic block specification. > > + __BB (index, ...) */ > > + if ((cfun->curr_properties & PROP_cfg) > > + && !strcmp (IDENTIFIER_POINTER > > + (c_parser_peek_token (parser)->value), "__BB")) > > + { > > + c_parser_consume_token (parser); > > + if (! c_parser_require (parser, CPP_OPEN_PAREN, > > + "expected %<(%>")) > > + return return_p; > > + if (c_parser_next_token_is_not (parser, CPP_NUMBER)) > > + { > > + c_parser_error (parser, "expected block index"); > > + return return_p; > > + } > > + tree tnum = c_parser_peek_token (parser)->value; > > + if (TREE_CODE (tnum) != INTEGER_CST) > > + { > > + c_parser_error (parser, "expected block index"); > > + return return_p; > > + } > > + int index = TREE_INT_CST_LOW (tnum); > > + int is_loop_header_of = -1; > > + c_parser_consume_token (parser); > > + while (c_parser_next_token_is (parser, CPP_COMMA)) > > + { > > + c_parser_consume_token (parser); > > + if (! c_parser_next_token_is (parser, CPP_NAME)) > > + { > > + c_parser_error (parser, "expected block specifier"); > > + return return_p; > > + } > > + /* loop_header (NUM) */ > > + if (!strcmp (IDENTIFIER_POINTER > > + (c_parser_peek_token (parser)->value), > > + "loop_header")) > > + { > > + c_parser_consume_token (parser); > > + if (! c_parser_require (parser, CPP_OPEN_PAREN, > > "expected %<(%>")) > > + return return_p; > > + tree loop_num; > > + if (! c_parser_next_token_is (parser, CPP_NUMBER) > > + || TREE_CODE (loop_num > > + = c_parser_peek_token > > (parser)->value) > > + != INTEGER_CST) > > + { > > + c_parser_error (parser, "expected loop number"); > > + return return_p; > > + } > > + c_parser_consume_token (parser); > > + is_loop_header_of = TREE_INT_CST_LOW (loop_num); > > + if (! c_parser_require (parser, CPP_CLOSE_PAREN, > > "expected %<)%>")) > > + return return_p; > > + } > > + else > > + { > > + c_parser_error (parser, "unknown block specifier"); > > + return return_p; > > + } > > + } > > + if (! c_parser_require (parser, CPP_CLOSE_PAREN, > > + "expected %<)%>")) > > + return return_p; > > + if (! c_parser_require (parser, CPP_COLON, > > + "expected %<:%>")) > > + return return_p; > > + > > + /* Put stmts parsed in the current block. */ > > + if (!gimple_seq_empty_p (*seq)) > > + { > > + if (!current_bb) > > + c_parser_error (parser, "stmts without block"); > > + else > > + { > > + gimple_stmt_iterator gsi = gsi_start_bb (current_bb); > > + gsi_insert_seq_after_without_update (&gsi, *seq, > > + > > GSI_CONTINUE_LINKING); > > + } > > + *seq = NULL; > > + } > > + > > + /* Build an empty block with specified index, linking them > > + in source order. */ > > + basic_block bb = alloc_block (); > > + bb->index = index; > > + link_block (bb, (current_bb ? current_bb > > + : ENTRY_BLOCK_PTR_FOR_FN (cfun))); > > + if (basic_block_info_for_fn (cfun)->length () <= > > (size_t)index) > > + vec_safe_grow_cleared (basic_block_info_for_fn (cfun), > > + index + 1); > > + SET_BASIC_BLOCK_FOR_FN (cfun, index, bb); > > + if (last_basic_block_for_fn (cfun) <= index) > > + last_basic_block_for_fn (cfun) = index + 1; > > + n_basic_blocks_for_fn (cfun)++; > > + if (!current_bb) > > + make_edge (ENTRY_BLOCK_PTR_FOR_FN (cfun), bb, > > EDGE_FALLTHRU); > > + > > + /* We leave the proper setting to fixup. */ > > + struct loop *loop_father = loops_for_fn (cfun)->tree_root; > > + /* If the new block is a loop header, allocate a loop > > + struct. Fixup will take care of proper placement within > > + the loop tree. */ > > + if (is_loop_header_of != -1) > > + { > > + if (number_of_loops (cfun) > (unsigned)is_loop_header_of > > + && get_loop (cfun, is_loop_header_of) != NULL) > > + { > > + c_parser_error (parser, "duplicate loop header"); > > + } > > + else > > + { > > + struct loop *loop = alloc_loop (); > > + loop->num = is_loop_header_of; > > + loop->header = bb; > > + vec_safe_grow_cleared (loops_for_fn (cfun)->larray, > > + is_loop_header_of + 1); > > + (*loops_for_fn (cfun)->larray)[is_loop_header_of] = > > loop; > > + flow_loop_tree_node_add (loops_for_fn > > (cfun)->tree_root, > > + loop); > > + } > > + loop_father = get_loop (cfun, is_loop_header_of); > > + } > > + bb->loop_father = loop_father; > > + > > + /* Stmts now go to the new block. */ > > + current_bb = bb; > > + break; > > + } > > goto expr_stmt; > > > > case CPP_SEMICOLON: > > @@ -229,6 +488,22 @@ expr_stmt: > > } > > } > > c_parser_consume_token (parser); > > + > > + /* Put stmts parsed in the current block. */ > > + if ((cfun->curr_properties & PROP_cfg) > > + && !gimple_seq_empty_p (*seq)) > > + { > > + if (!current_bb) > > + c_parser_error (parser, "stmts without block"); > > + else > > + { > > + gimple_stmt_iterator gsi = gsi_start_bb (current_bb); > > + gsi_insert_seq_after_without_update (&gsi, *seq, > > + GSI_CONTINUE_LINKING); > > + } > > + *seq = NULL; > > + } > > + > > return return_p; > > } > > > > @@ -373,8 +648,7 @@ c_parser_gimple_statement (c_parser *par > > if (c_parser_next_token_is (parser, CPP_NAME) > > && c_parser_peek_2nd_token (parser)->type == CPP_COLON) > > { > > - arg = lookup_label_for_goto (loc, > > - c_parser_peek_token > > (parser)->value); > > + arg = c_parser_peek_token (parser)->value; > > c_parser_consume_token (parser); > > > > if (c_parser_next_token_is (parser, CPP_COLON)) > > @@ -1288,48 +1562,57 @@ c_parser_gimple_label (c_parser *parser, > > startwith("pass-name") > > */ > > > > -char * > > -c_parser_gimple_or_rtl_pass_list (c_parser *parser) > > +void > > +c_parser_gimple_or_rtl_pass_list (c_parser *parser, c_declspecs *specs) > > { > > char *pass = NULL; > > > > /* Accept __GIMPLE/__RTL. */ > > if (c_parser_next_token_is_not (parser, CPP_OPEN_PAREN)) > > - return NULL; > > + return; > > c_parser_consume_token (parser); > > > > - if (c_parser_next_token_is (parser, CPP_NAME)) > > + while (c_parser_next_token_is (parser, CPP_NAME)) > > { > > const char *op = IDENTIFIER_POINTER (c_parser_peek_token > > (parser)->value); > > c_parser_consume_token (parser); > > if (! strcmp (op, "startwith")) > > { > > if (! c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) > > - return NULL; > > + return; > > if (c_parser_next_token_is_not (parser, CPP_STRING)) > > { > > error_at (c_parser_peek_token (parser)->location, > > "expected pass name"); > > - return NULL; > > + return; > > } > > pass = xstrdup (TREE_STRING_POINTER > > (c_parser_peek_token (parser)->value)); > > c_parser_consume_token (parser); > > - if (! c_parser_require (parser, CPP_CLOSE_PAREN, "expected > > %<)%>")) > > - return NULL; > > + if (! c_parser_require (parser, CPP_CLOSE_PAREN, "expected > > %<(%>")) > > + return; > > } > > + else if (specs->declspec_il != cdil_gimple) > > + /* Allow only one IL specifier and none on RTL. */ > > + ; > > + else if (! strcmp (op, "cfg")) > > + specs->declspec_il = cdil_gimple_cfg; > > + else if (! strcmp (op, "ssa")) > > + specs->declspec_il = cdil_gimple_ssa; > > else > > { > > error_at (c_parser_peek_token (parser)->location, > > "invalid operation"); > > - return NULL; > > + return; > > } > > + if (c_parser_next_token_is (parser, CPP_COMMA)) > > + c_parser_consume_token (parser); > > } > > > > if (! c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>")) > > - return NULL; > > + return; > > > > - return pass; > > + specs->gimple_or_rtl_pass = pass; > > } > > > > /* Parse gimple local declaration. > > @@ -1433,9 +1716,18 @@ c_parser_gimple_declaration (c_parser *p > > static void > > c_parser_gimple_goto_stmt (location_t loc, tree label, gimple_seq *seq) > > { > > + if (cfun->curr_properties & PROP_cfg) > > + { > > + int dest_index; > > + if (c_parser_gimple_parse_bb_spec (label, &dest_index)) > > + { > > + edges.safe_push (gimple_parser_edge (current_bb->index, > > dest_index, > > + EDGE_FALLTHRU)); > > + return; > > + } > > + } > > tree decl = lookup_label_for_goto (loc, label); > > gimple_seq_add_stmt (seq, gimple_build_goto (decl)); > > - return; > > } > > > > /* Parse a parenthesized condition. > > @@ -1464,7 +1756,7 @@ c_parser_gimple_paren_condition (c_parse > > static void > > c_parser_gimple_if_stmt (c_parser *parser, gimple_seq *seq) > > { > > - tree t_label, f_label, label; > > + tree t_label = NULL_TREE, f_label = NULL_TREE, label; > > location_t loc; > > c_parser_consume_token (parser); > > tree cond = c_parser_gimple_paren_condition (parser); > > @@ -1480,7 +1772,13 @@ c_parser_gimple_if_stmt (c_parser *parse > > } > > label = c_parser_peek_token (parser)->value; > > c_parser_consume_token (parser); > > - t_label = lookup_label_for_goto (loc, label); > > + int dest_index; > > + if ((cfun->curr_properties & PROP_cfg) > > + && c_parser_gimple_parse_bb_spec (label, &dest_index)) > > + edges.safe_push (gimple_parser_edge (current_bb->index, dest_index, > > + EDGE_TRUE_VALUE)); > > + else > > + t_label = lookup_label_for_goto (loc, label); > > if (! c_parser_require (parser, CPP_SEMICOLON, "expected %<;%>")) > > return; > > } > > @@ -1508,7 +1806,13 @@ c_parser_gimple_if_stmt (c_parser *parse > > return; > > } > > label = c_parser_peek_token (parser)->value; > > - f_label = lookup_label_for_goto (loc, label); > > + int dest_index; > > + if ((cfun->curr_properties & PROP_cfg) > > + && c_parser_gimple_parse_bb_spec (label, &dest_index)) > > + edges.safe_push (gimple_parser_edge (current_bb->index, dest_index, > > + EDGE_FALSE_VALUE)); > > + else > > + f_label = lookup_label_for_goto (loc, label); > > c_parser_consume_token (parser); > > if (! c_parser_require (parser, CPP_SEMICOLON, "expected %<;%>")) > > return; > > Index: gcc/c/gimple-parser.h > > =================================================================== > > --- gcc/c/gimple-parser.h (revision 269604) > > +++ gcc/c/gimple-parser.h (working copy) > > @@ -21,7 +21,8 @@ along with GCC; see the file COPYING3. > > #define GCC_GIMPLE_PARSER_H > > > > /* Gimple parsing functions. */ > > -extern void c_parser_parse_gimple_body (c_parser *); > > -extern char *c_parser_gimple_or_rtl_pass_list (c_parser *); > > +extern void c_parser_parse_gimple_body (c_parser *, char *, > > + enum c_declspec_il); > > +extern void c_parser_gimple_or_rtl_pass_list (c_parser *, c_declspecs *); > > > > #endif > > Index: gcc/testsuite/gcc.dg/gimplefe-13.c > > =================================================================== > > --- gcc/testsuite/gcc.dg/gimplefe-13.c (revision 269604) > > +++ gcc/testsuite/gcc.dg/gimplefe-13.c (working copy) > > @@ -1,25 +1,25 @@ > > /* { dg-do compile } */ > > /* { dg-options "-O -fgimple" } */ > > > > -void __GIMPLE (startwith ("dse2")) foo () > > +void __GIMPLE (ssa,startwith ("dse2")) foo () > > { > > int a; > > > > -bb_2: > > - if (a > 4) > > - goto bb_3; > > +__BB(2): > > + if (a_5(D) > 4) > > + goto __BB3; > > else > > - goto bb_4; > > + goto __BB4; > > > > -bb_3: > > +__BB(3): > > a_2 = 10; > > - goto bb_5; > > + goto __BB5; > > > > -bb_4: > > +__BB(4): > > a_3 = 20; > > > > -bb_5: > > - a_1 = __PHI (bb_3: a_2, bb_4: a_3); > > +__BB(5): > > + a_1 = __PHI (__BB3: a_2, __BB4: a_3); > > a_4 = a_1 + 4; > > > > return; > > Index: gcc/testsuite/gcc.dg/gimplefe-14.c > > =================================================================== > > --- gcc/testsuite/gcc.dg/gimplefe-14.c (revision 269604) > > +++ gcc/testsuite/gcc.dg/gimplefe-14.c (working copy) > > @@ -1,29 +1,32 @@ > > /* { dg-do run } */ > > /* { dg-options "-O -fgimple" } */ > > > > -int __GIMPLE () > > +int __GIMPLE (ssa) > > main (int argc, char * * argv) > > { > > int a; > > > > - bb_2: > > + __BB(2): > > /* Because of PR82114 we need to handle also 0 as base metal can have > > argc == 0. */ > > switch (argc_2(D)) {default: L2; case 0: L0; case 1: L0; case 2: L1; } > > > > + __BB(3): > > L0: > > a_4 = 0; > > - goto bb_6; > > + goto __BB6; > > > > + __BB(4): > > L1: > > a_3 = 3; > > - goto bb_6; > > + goto __BB6; > > > > + __BB(5): > > L2: > > a_5 = -1; > > > > - bb_6: > > - a_1 = __PHI (L0: a_4, L1: a_3, L2: a_5); > > + __BB(6): > > + a_1 = __PHI (__BB3: a_4, __BB4: a_3, __BB5: a_5); > > return a_1; > > > > } > > Index: gcc/testsuite/gcc.dg/gimplefe-17.c > > =================================================================== > > --- gcc/testsuite/gcc.dg/gimplefe-17.c (revision 269604) > > +++ gcc/testsuite/gcc.dg/gimplefe-17.c (working copy) > > @@ -1,26 +1,29 @@ > > /* { dg-do compile } */ > > -/* { dg-options "-fgimple -fdump-tree-ssa" } */ > > +/* { dg-options "-fgimple -fdump-tree-fixup_cfg2" } */ > > > > int > > -__GIMPLE () * > > +__GIMPLE (ssa) * > > foo () > > { > > int _1; > > int j; > > int *b; > > + > > +__BB(5): > > _1 = 1; > > -bb1: > > + > > +__BB(2): > > if (_1) > > - goto bb3; > > + goto __BB4; > > else > > - goto bb2; > > + goto __BB3; > > > > -bb2: > > +__BB(3): > > b_2 = (int *)0; > > > > -bb3: > > - b_4 = __PHI (bb1: b_3(D), bb2: b_2); > > +__BB(4): > > + b_4 = __PHI (__BB2: b_3(D), __BB3: b_2); > > return b_4; > > } > > > > -/* { dg-final { scan-tree-dump-not "_1_" "ssa" } } */ > > +/* { dg-final { scan-tree-dump-not "_1_" "fixup_cfg2" } } */ > > Index: gcc/testsuite/gcc.dg/gimplefe-18.c > > =================================================================== > > --- gcc/testsuite/gcc.dg/gimplefe-18.c (revision 269604) > > +++ gcc/testsuite/gcc.dg/gimplefe-18.c (working copy) > > @@ -2,23 +2,26 @@ > > /* { dg-options "-fgimple" } */ > > > > int > > -__GIMPLE () * > > +__GIMPLE (ssa) * > > foo () > > { > > int _1; > > int j; > > int *b; > > + > > +__BB(2): > > _1 = 1; > > -bb1: > > + > > +__BB(3): > > if (_1) > > - goto bb3; > > + goto __BB5; > > else > > - goto bb2; > > + goto __BB4; > > > > -bb2: > > +__BB(4): > > b_2 = (int *)0; > > > > -bb3: > > - b_4 = __PHI (bb1: &j, bb2: b_2); > > +__BB(5): > > + b_4 = __PHI (__BB3: &j, __BB4: b_2); > > return b_4; > > } > > Index: gcc/testsuite/gcc.dg/gimplefe-7.c > > =================================================================== > > --- gcc/testsuite/gcc.dg/gimplefe-7.c (revision 269604) > > +++ gcc/testsuite/gcc.dg/gimplefe-7.c (working copy) > > @@ -1,25 +1,25 @@ > > /* { dg-do compile } */ > > /* { dg-options "-fgimple" } */ > > > > -void __GIMPLE () foo () > > +void __GIMPLE (ssa) foo () > > { > > int a; > > > > -bb_2: > > - if (a > 4) > > - goto bb_3; > > +__BB(2): > > + if (a_5(D) > 4) > > + goto __BB3; > > else > > - goto bb_4; > > + goto __BB4; > > > > -bb_3: > > +__BB(3): > > a_2 = 10; > > - goto bb_5; > > + goto __BB5; > > > > -bb_4: > > +__BB(4): > > a_3 = 20; > > > > -bb_5: > > - a_1 = __PHI (bb_3: a_2, bb_4: a_3); > > +__BB(5): > > + a_1 = __PHI (__BB3: a_2, __BB4: a_3); > > a_4 = a_1 + 4; > > > > return; > > Index: gcc/testsuite/gcc.dg/torture/pr89595.c > > =================================================================== > > --- gcc/testsuite/gcc.dg/torture/pr89595.c (revision 269604) > > +++ gcc/testsuite/gcc.dg/torture/pr89595.c (working copy) > > @@ -1,34 +1,38 @@ > > /* { dg-do run } */ > > /* { dg-additional-options "-fgimple" } */ > > > > +/* Go back to fix the testcase -- need SSA name on freelist... > > + (allocate all gaps & put them there?) */ > > + > > int __attribute__((noipa)) > > __GIMPLE(startwith("dom")) bar(int cond, int val) > > { > > int i; > > > > +__BB(3): > > if (0 != 0) > > - goto bb_6; > > + goto __BB6; > > else > > - goto bb_2; > > + goto __BB2; > > > > -bb_2: > > +__BB(2): > > if (cond_5(D) != 0) > > - goto bb_4; > > + goto __BB4; > > else > > - goto bb_5; > > + goto __BB5; > > > > -bb_4: > > +__BB(4): > > i_6 = val_2(D); > > i_1 = val_2(D) > 0 ? i_6 : 0; > > > > -bb_5: > > - i_3 = __PHI (bb_4: i_1, bb_2: 0); > > +__BB(5): > > + i_3 = __PHI (__BB4: i_1, __BB2: 0); > > return i_3; > > > > -bb_6: > > +__BB(6): > > i_4 = 1; > > i_9 = 2; > > - goto bb_2; > > + goto __BB2; > > } > > > > int main() > > Index: gcc/testsuite/gcc.dg/tree-ssa/cunroll-13.c > > =================================================================== > > --- gcc/testsuite/gcc.dg/tree-ssa/cunroll-13.c (revision 269604) > > +++ gcc/testsuite/gcc.dg/tree-ssa/cunroll-13.c (working copy) > > @@ -9,7 +9,7 @@ typedef int i32; > > > > struct a {i32 a[8];i32 b;}; > > > > -void __GIMPLE (startwith("fix_loops")) > > +void __GIMPLE (ssa,startwith("fix_loops")) > > t (struct a * a) > > { > > i32 i; > > @@ -18,37 +18,37 @@ t (struct a * a) > > i32 _9; > > i32 _11; > > > > -bb_2: > > +__BB(2): > > _11 = a_6(D)->a[0]; > > if (_11 != _Literal (i32) 0) > > - goto bb_6; > > + goto __BB6; > > else > > - goto bb_3; > > + goto __BB3; > > > > -bb_3: > > +__BB(3): > > return; > > > > -bb_4: > > +__BB(4): > > _1 = _2 + _Literal (i32) 1; > > a_6(D)->a[i_19] = _1; > > i_8 = i_19 + _Literal (i32) 1; > > if (i_8 <= _Literal (i32) 123455) > > - goto bb_5; > > + goto __BB5; > > else > > - goto bb_3; > > + goto __BB3; > > > > -bb_5: > > - i_19 = __PHI (bb_6: _Literal (i32) 1, bb_4: i_8); > > +__BB(5): > > + i_19 = __PHI (__BB6: _Literal (i32) 1, __BB4: i_8); > > _2 = a_6(D)->a[i_19]; > > if (_2 != _Literal (i32) 0) > > - goto bb_4; > > + goto __BB4; > > else > > - goto bb_3; > > + goto __BB3; > > > > -bb_6: > > +__BB(6): > > _9 = _11 + _Literal (i32) 1; > > a_6(D)->a[0] = _9; > > - goto bb_5; > > + goto __BB5; > > } > > > > /* This testcase relies on the fact that we do not eliminate the redundant > > test > > Index: gcc/testsuite/gcc.dg/tree-ssa/ivopt_mult_1g.c > > =================================================================== > > --- gcc/testsuite/gcc.dg/tree-ssa/ivopt_mult_1g.c (revision 269604) > > +++ gcc/testsuite/gcc.dg/tree-ssa/ivopt_mult_1g.c (working copy) > > @@ -15,7 +15,7 @@ foo (long int * p, long int * p2, int N1 > > long unsigned int _4; > > long int _5; > > > > - bb_2: > > + __BB(2): > > _1 = (long unsigned int) N1_10(D); > > _2 = _1 * 8ul; > > p_limit_12 = p_11(D) + _2; > > @@ -23,59 +23,59 @@ foo (long int * p, long int * p2, int N1 > > _4 = _3 * 8ul; > > p_limit2_15 = p2_14(D) + _4; > > if (p_11(D) <= p_limit_12) > > - goto bb_3; > > + goto __BB3; > > else > > - goto bb_13; > > + goto __BB13; > > > > - bb_13: > > + __BB(13): > > > > - bb_9: > > - goto bb_6; > > + __BB(9): > > + goto __BB6; > > > > - bb_3: > > + __BB(3): > > p_20 = p_11(D) + 8ul; > > p2_23 = p2_14(D) + 8ul; > > if (p_limit2_15 < p2_23) > > - goto bb_14; > > + goto __BB14; > > else > > - goto bb_7; > > + goto __BB7; > > > > - bb_14: > > - goto bb_9; > > + __BB(14): > > + goto __BB9; > > > > - bb_7: > > - goto bb_5; > > + __BB(7): > > + goto __BB5; > > > > - bb_4: > > + __BB(4): > > p_16 = p_26 + 8ul; > > p2_17 = p2_27 + 8ul; > > if (p_limit2_15 < p2_17) > > - goto bb_11; > > + goto __BB11; > > else > > - goto bb_8; > > + goto __BB8; > > > > - bb_11: > > - goto bb_6; > > + __BB(11): > > + goto __BB6; > > > > - bb_8: > > + __BB(8): > > ; > > > > - bb_5: > > - s_24 = __PHI (bb_7: 0l, bb_8: s_19); > > - p_26 = __PHI (bb_7: p_20, bb_8: p_16); > > - p2_27 = __PHI (bb_7: p2_23, bb_8: p2_17); > > + __BB(5): > > + s_24 = __PHI (__BB7: 0l, __BB8: s_19); > > + p_26 = __PHI (__BB7: p_20, __BB8: p_16); > > + p2_27 = __PHI (__BB7: p2_23, __BB8: p2_17); > > _5 = __MEM <long int> (p_26); > > s_19 = _5 + s_24; > > if (p_limit_12 >= p_26) > > - goto bb_4; > > + goto __BB4; > > else > > - goto bb_12; > > + goto __BB12; > > > > - bb_12: > > + __BB(12): > > ; > > > > - bb_6: > > - s_25 = __PHI (bb_12: s_19, bb_11: s_19, bb_9: 0l); > > + __BB(6): > > + s_25 = __PHI (__BB12: s_19, __BB11: s_19, __BB9: 0l); > > return s_25; > > } > > > > Index: gcc/testsuite/gcc.dg/tree-ssa/ivopt_mult_2g.c > > =================================================================== > > --- gcc/testsuite/gcc.dg/tree-ssa/ivopt_mult_2g.c (revision 269604) > > +++ gcc/testsuite/gcc.dg/tree-ssa/ivopt_mult_2g.c (working copy) > > @@ -3,7 +3,7 @@ > > > > /* Exit tests 'i < N1' and 'p2 > p_limit2' can be replaced, so > > * two ivs i and p2 can be eliminate. */ > > -long int __GIMPLE (startwith("fix_loops")) > > +long int __GIMPLE (ssa,startwith("fix_loops")) > > foo (long int * p, long int * p2, int N1, int N2) > > { > > long int s; > > @@ -13,66 +13,66 @@ foo (long int * p, long int * p2, int N1 > > long unsigned int _2; > > long int _3; > > > > - bb_2: > > + __BB(2): > > _1 = (long unsigned int) N2_9(D); > > _2 = _1 * 8ul; > > p_limit2_11 = p2_10(D) + _2; > > if (N1_13(D) > 0) > > - goto bb_3; > > + goto __BB3; > > else > > - goto bb_13; > > + goto __BB13; > > > > - bb_13: > > + __BB(13): > > > > - bb_9: > > - goto bb_6; > > + __BB(9): > > + goto __BB6; > > > > - bb_3: > > + __BB(3): > > p_22 = p_12(D) + 8ul; > > p2_23 = p2_10(D) + 8ul; > > if (p_limit2_11 < p2_23) > > - goto bb_14; > > + goto __BB14; > > else > > - goto bb_7; > > + goto __BB7; > > > > - bb_14: > > - goto bb_9; > > + __BB(14): > > + goto __BB9; > > > > - bb_7: > > - goto bb_5; > > + __BB(7): > > + goto __BB5; > > > > - bb_4: > > + __BB(4): > > p_14 = p_27 + 8ul; > > p2_15 = p2_28 + 8ul; > > i_16 = i_29 + 1; > > if (p_limit2_11 < p2_15) > > - goto bb_11; > > + goto __BB11; > > else > > - goto bb_8; > > + goto __BB8; > > > > - bb_11: > > - goto bb_6; > > + __BB(11): > > + goto __BB6; > > > > - bb_8: > > + __BB(8): > > ; > > > > - bb_5: > > - s_25 = __PHI (bb_7: 0l, bb_8: s_18); > > - p_27 = __PHI (bb_7: p_22, bb_8: p_14); > > - p2_28 = __PHI (bb_7: p2_23, bb_8: p2_15); > > - i_29 = __PHI (bb_7: 1, bb_8: i_16); > > + __BB(5): > > + s_25 = __PHI (__BB7: 0l, __BB8: s_18); > > + p_27 = __PHI (__BB7: p_22, __BB8: p_14); > > + p2_28 = __PHI (__BB7: p2_23, __BB8: p2_15); > > + i_29 = __PHI (__BB7: 1, __BB8: i_16); > > _3 = __MEM <long int> (p_27); > > s_18 = _3 + s_25; > > if (N1_13(D) > i_29) > > - goto bb_4; > > + goto __BB4; > > else > > - goto bb_12; > > + goto __BB12; > > > > - bb_12: > > + __BB(12): > > ; > > > > - bb_6: > > - s_26 = __PHI (bb_12: s_18, bb_11: s_18, bb_9: 0l); > > + __BB(6): > > + s_26 = __PHI (__BB12: s_18, __BB11: s_18, __BB9: 0l); > > return s_26; > > } > > > > Index: gcc/testsuite/gcc.dg/tree-ssa/scev-3.c > > =================================================================== > > --- gcc/testsuite/gcc.dg/tree-ssa/scev-3.c (revision 269604) > > +++ gcc/testsuite/gcc.dg/tree-ssa/scev-3.c (working copy) > > @@ -4,39 +4,39 @@ > > int *a_p; > > int a[1000]; > > > > -void __GIMPLE (startwith ("loop")) > > +void __GIMPLE (ssa,startwith ("loop")) > > f (int k) > > { > > int i; > > int * _1; > > > > -bb_2: > > +__BB(2): > > i_5 = k_4(D); > > if (i_5 <= 999) > > - goto bb_4; > > + goto __BB4; > > else > > - goto bb_3; > > + goto __BB3; > > > > -bb_3: > > +__BB(3): > > return; > > > > -bb_4: > > +__BB(4): > > ; > > > > -bb_5: > > - i_12 = __PHI (bb_6: i_9, bb_4: i_5); > > +__BB(5): > > + i_12 = __PHI (__BB6: i_9, __BB4: i_5); > > _1 = &a[i_12]; > > a_p = _1; > > __MEM <int[1000]> ((int *)&a)[i_12] = 100; > > i_9 = i_5 + i_12; > > if (i_9 <= 999) > > - goto bb_6; > > + goto __BB6; > > else > > - goto bb_3; > > + goto __BB3; > > > > -bb_6: > > +__BB(6): > > ; > > - goto bb_5; > > + goto __BB5; > > > > } > > > > Index: gcc/testsuite/gcc.dg/tree-ssa/scev-4.c > > =================================================================== > > --- gcc/testsuite/gcc.dg/tree-ssa/scev-4.c (revision 269604) > > +++ gcc/testsuite/gcc.dg/tree-ssa/scev-4.c (working copy) > > @@ -9,39 +9,39 @@ typedef struct { > > int *a_p; > > S a[1000]; > > > > -void __GIMPLE (startwith ("loop")) > > +void __GIMPLE (ssa, startwith ("loop")) > > f (int k) > > { > > int i; > > int * _1; > > > > -bb_2: > > +__BB(2): > > i_5 = k_4(D); > > if (i_5 <= 999) > > - goto bb_4; > > + goto __BB4; > > else > > - goto bb_3; > > + goto __BB3; > > > > -bb_3: > > +__BB(3): > > return; > > > > -bb_4: > > +__BB(4): > > ; > > > > -bb_5: > > - i_12 = __PHI (bb_6: i_9, bb_4: i_5); > > +__BB(5): > > + i_12 = __PHI (__BB6: i_9, __BB4: i_5); > > _1 = &a[i_12].y; > > a_p = _1; > > __MEM <S[1000]> ((int *)&a)[i_12].y = 100; > > i_9 = i_5 + i_12; > > if (i_9 <= 999) > > - goto bb_6; > > + goto __BB6; > > else > > - goto bb_3; > > + goto __BB3; > > > > -bb_6: > > +__BB(6): > > ; > > - goto bb_5; > > + goto __BB5; > > > > } > > > > Index: gcc/testsuite/gcc.dg/tree-ssa/scev-5.c > > =================================================================== > > --- gcc/testsuite/gcc.dg/tree-ssa/scev-5.c (revision 269604) > > +++ gcc/testsuite/gcc.dg/tree-ssa/scev-5.c (working copy) > > @@ -4,39 +4,39 @@ > > int *a_p; > > int a[1000]; > > > > -void __GIMPLE (startwith ("loop")) > > +void __GIMPLE (ssa,startwith ("loop")) > > f (int k) > > { > > long long int i; > > int * _1; > > > > -bb_2: > > +__BB(2): > > i_5 = (long long int) k_4(D); > > if (i_5 <= 999ll) > > - goto bb_4; > > + goto __BB4; > > else > > - goto bb_3; > > + goto __BB3; > > > > -bb_3: > > +__BB(3): > > return; > > > > -bb_4: > > +__BB(4): > > ; > > > > -bb_5: > > - i_12 = __PHI (bb_6: i_9, bb_4: i_5); > > +__BB(5): > > + i_12 = __PHI (__BB6: i_9, __BB4: i_5); > > _1 = &a[i_12]; > > a_p = _1; > > __MEM <int[1000]> ((int *)&a)[i_12] = 100; > > i_9 = i_5 + i_12; > > if (i_9 <= 999ll) > > - goto bb_6; > > + goto __BB6; > > else > > - goto bb_3; > > + goto __BB3; > > > > -bb_6: > > +__BB(6): > > ; > > - goto bb_5; > > + goto __BB5; > > > > } > > > > Index: gcc/testsuite/gcc.dg/vect/vect-cond-arith-2.c > > =================================================================== > > --- gcc/testsuite/gcc.dg/vect/vect-cond-arith-2.c (revision 269604) > > +++ gcc/testsuite/gcc.dg/vect/vect-cond-arith-2.c (working copy) > > @@ -1,7 +1,7 @@ > > /* { dg-do compile } */ > > /* { dg-additional-options "-fgimple -fdump-tree-optimized -ffast-math" } > > */ > > > > -double __GIMPLE (startwith("loop")) > > +double __GIMPLE (ssa, startwith("loop")) > > neg_xi (double *x) > > { > > int i; > > @@ -13,13 +13,13 @@ neg_xi (double *x) > > double res; > > unsigned int ivtmp; > > > > - bb_1: > > - goto bb_2; > > + __BB(5): > > + goto __BB2; > > > > - bb_2: > > - res_1 = __PHI (bb_1: 0.0, bb_3: res_2); > > - i_4 = __PHI (bb_1: 0, bb_3: i_5); > > - ivtmp_6 = __PHI (bb_1: 100U, bb_3: ivtmp_7); > > + __BB(2): > > + res_1 = __PHI (__BB5: 0.0, __BB3: res_2); > > + i_4 = __PHI (__BB5: 0, __BB3: i_5); > > + ivtmp_6 = __PHI (__BB5: 100U, __BB3: ivtmp_7); > > index = (long unsigned int) i_4; > > offset = index * 8UL; > > xi_ptr = x_8(D) + offset; > > @@ -29,15 +29,15 @@ neg_xi (double *x) > > i_5 = i_4 + 1; > > ivtmp_7 = ivtmp_6 - 1U; > > if (ivtmp_7 != 0U) > > - goto bb_3; > > + goto __BB3; > > else > > - goto bb_4; > > + goto __BB4; > > > > - bb_3: > > - goto bb_2; > > + __BB(3): > > + goto __BB2; > > > > - bb_4: > > - res_3 = __PHI (bb_2: res_2); > > + __BB(4): > > + res_3 = __PHI (__BB2: res_2); > > return res_3; > > } > > > > Index: gcc/testsuite/gcc.target/aarch64/sve/loop_add_6.c > > =================================================================== > > --- gcc/testsuite/gcc.target/aarch64/sve/loop_add_6.c (revision 269604) > > +++ gcc/testsuite/gcc.target/aarch64/sve/loop_add_6.c (working copy) > > @@ -1,7 +1,7 @@ > > /* { dg-do compile } */ > > /* { dg-options "-O2 -ftree-vectorize -fgimple -ffast-math" } */ > > > > -double __GIMPLE (startwith("loop")) > > +double __GIMPLE (ssa, startwith("loop")) > > neg_xi (double *x) > > { > > int i; > > @@ -13,13 +13,13 @@ neg_xi (double *x) > > double res; > > unsigned int ivtmp; > > > > - bb_1: > > - goto bb_2; > > + __BB(5): > > + goto __BB2; > > > > - bb_2: > > - res_1 = __PHI (bb_1: 0.0, bb_3: res_2); > > - i_4 = __PHI (bb_1: 0, bb_3: i_5); > > - ivtmp_6 = __PHI (bb_1: 100U, bb_3: ivtmp_7); > > + __BB(2): > > + res_1 = __PHI (__BB5: 0.0, __BB3: res_2); > > + i_4 = __PHI (__BB5: 0, __BB3: i_5); > > + ivtmp_6 = __PHI (__BB5: 100U, __BB3: ivtmp_7); > > index = (long unsigned int) i_4; > > offset = index * 8UL; > > xi_ptr = x_8(D) + offset; > > @@ -29,15 +29,15 @@ neg_xi (double *x) > > i_5 = i_4 + 1; > > ivtmp_7 = ivtmp_6 - 1U; > > if (ivtmp_7 != 0U) > > - goto bb_3; > > + goto __BB3; > > else > > - goto bb_4; > > + goto __BB4; > > > > - bb_3: > > - goto bb_2; > > + __BB(3): > > + goto __BB2; > > > > - bb_4: > > - res_3 = __PHI (bb_2: res_2); > > + __BB(4): > > + res_3 = __PHI (__BB2: res_2); > > return res_3; > > } > > > > -- Richard Biener <rguent...@suse.de> SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 21284 (AG Nuernberg)