+ /* (end of) block 0 */
+ gsi = gsi_for_stmt (m_arr_ref_first);
+ gsi_next (&gsi);
+
+ bound = fold_convert_loc (loc, utype, m_range_size);
+ cond_stmt = gimple_build_cond (LE_EXPR, tidx, bound, NULL_TREE, NULL_TREE);
+ gsi_insert_before (&gsi, cond_stmt, GSI_SAME_STMT);
+ update_stmt (cond_stmt);
+
+ /* block 2 */
+ if (!m_default_case_nonstandard)
+ {
+ label2 = gimple_build_label (label_decl2);
+ gsi_insert_before (&gsi, label2, GSI_SAME_STMT);
+ last_assign = gen_def_assigns (&gsi);
+ }
+
+ /* block 1 */
+ label1 = gimple_build_label (label_decl1);
+ gsi_insert_before (&gsi, label1, GSI_SAME_STMT);
+
+ /* block F */
+ gsi = gsi_start_bb (m_final_bb);
+ label3 = gimple_build_label (label_decl3);
+ gsi_insert_before (&gsi, label3, GSI_SAME_STMT);
+
+ /* cfg fix */
+ e02 = split_block (bb0, cond_stmt);
+ bb2 = e02->dest;
+
+ if (m_default_case_nonstandard)
+ {
+ bb1 = bb2;
+ bb2 = m_default_bb;
+ e01 = e02;
+ e01->flags = EDGE_TRUE_VALUE;
+ e02 = make_edge (bb0, bb2, EDGE_FALSE_VALUE);
+ edge e_default = find_edge (bb1, bb2);
+ for (gphi_iterator gsi = gsi_start_phis (bb2);
+ !gsi_end_p (gsi); gsi_next (&gsi))
+ {
+ gphi *phi = gsi.phi ();
+ tree arg = PHI_ARG_DEF_FROM_EDGE (phi, e_default);
+ add_phi_arg (phi, arg, e02,
+ gimple_phi_arg_location_from_edge (phi, e_default));
+ }
+ /* Partially fix the dominator tree, if it is available. */
+ if (dom_info_available_p (CDI_DOMINATORS))
+ redirect_immediate_dominators (CDI_DOMINATORS, bb1, bb0);
+ }
+ else
+ {
+ e21 = split_block (bb2, last_assign);
+ bb1 = e21->dest;
+ remove_edge (e21);
+ }
+
+ e1d = split_block (bb1, m_arr_ref_last);
+ bbd = e1d->dest;
+ remove_edge (e1d);
+
+ /* Flags and profiles of the edge for in-range values. */
+ if (!m_default_case_nonstandard)
+ e01 = make_edge (bb0, bb1, EDGE_TRUE_VALUE);
+ e01->probability = m_default_prob.invert ();
+
+ /* Flags and profiles of the edge taking care of out-of-range values. */
+ e02->flags &= ~EDGE_FALLTHRU;
+ e02->flags |= EDGE_FALSE_VALUE;
+ e02->probability = m_default_prob;
+
+ bbf = m_final_bb;
+
+ e1f = make_edge (bb1, bbf, EDGE_FALLTHRU);
+ e1f->probability = profile_probability::always ();
+
+ if (m_default_case_nonstandard)
+ e2f = NULL;
+ else
+ {
+ e2f = make_edge (bb2, bbf, EDGE_FALLTHRU);
+ e2f->probability = profile_probability::always ();
+ }
+
+ /* frequencies of the new BBs */
+ bb1->count = e01->count ();
+ bb2->count = e02->count ();
+ if (!m_default_case_nonstandard)
+ bbf->count = e1f->count () + e2f->count ();
+
+ /* Tidy blocks that have become unreachable. */
+ prune_bbs (bbd, m_final_bb,
+ m_default_case_nonstandard ? m_default_bb : NULL);
+
+ /* Fixup the PHI nodes in bbF. */
+ fix_phi_nodes (e1f, e2f, bbf);
+
+ /* Fix the dominator tree, if it is available. */
+ if (dom_info_available_p (CDI_DOMINATORS))
+ {
+ vec<basic_block> bbs_to_fix_dom;
+
+ set_immediate_dominator (CDI_DOMINATORS, bb1, bb0);
+ if (!m_default_case_nonstandard)
+ set_immediate_dominator (CDI_DOMINATORS, bb2, bb0);
+ if (! get_immediate_dominator (CDI_DOMINATORS, bbf))
+ /* If bbD was the immediate dominator ... */
+ set_immediate_dominator (CDI_DOMINATORS, bbf, bb0);
+
+ bbs_to_fix_dom.create (3 + (bb2 != bbf));
+ bbs_to_fix_dom.quick_push (bb0);
+ bbs_to_fix_dom.quick_push (bb1);
+ if (bb2 != bbf)
+ bbs_to_fix_dom.quick_push (bb2);
+ bbs_to_fix_dom.quick_push (bbf);
+
+ iterate_fix_dominators (CDI_DOMINATORS, bbs_to_fix_dom, true);
+ bbs_to_fix_dom.release ();
+ }