Mercurial > hg > CbC > CbC_gcc
comparison gcc/gimple-iterator.c @ 67:f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
author | nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 22 Mar 2011 17:18:12 +0900 |
parents | b7f97abdc517 |
children | 04ced10e8804 |
comparison
equal
deleted
inserted
replaced
65:65488c3d617d | 67:f6334be47118 |
---|---|
63 | 63 |
64 for (n = first; n; n = n->next) | 64 for (n = first; n; n = n->next) |
65 gimple_set_bb (n->stmt, bb); | 65 gimple_set_bb (n->stmt, bb); |
66 } | 66 } |
67 | 67 |
68 /* Set the frequencies for the cgraph_edges for each of the calls | |
69 starting at FIRST for their new position within BB. */ | |
70 | |
71 static void | |
72 update_call_edge_frequencies (gimple_seq_node first, basic_block bb) | |
73 { | |
74 struct cgraph_node *cfun_node = NULL; | |
75 int bb_freq = 0; | |
76 gimple_seq_node n; | |
77 | |
78 for (n = first; n ; n = n->next) | |
79 if (is_gimple_call (n->stmt)) | |
80 { | |
81 struct cgraph_edge *e; | |
82 | |
83 /* These function calls are expensive enough that we want | |
84 to avoid calling them if we never see any calls. */ | |
85 if (cfun_node == NULL) | |
86 { | |
87 cfun_node = cgraph_node (current_function_decl); | |
88 bb_freq = (compute_call_stmt_bb_frequency | |
89 (current_function_decl, bb)); | |
90 } | |
91 | |
92 e = cgraph_edge (cfun_node, n->stmt); | |
93 if (e != NULL) | |
94 e->frequency = bb_freq; | |
95 } | |
96 } | |
68 | 97 |
69 /* Insert the sequence delimited by nodes FIRST and LAST before | 98 /* Insert the sequence delimited by nodes FIRST and LAST before |
70 iterator I. M specifies how to update iterator I after insertion | 99 iterator I. M specifies how to update iterator I after insertion |
71 (see enum gsi_iterator_update). | 100 (see enum gsi_iterator_update). |
72 | 101 |
379 requested by the caller. */ | 408 requested by the caller. */ |
380 if (update_eh_info) | 409 if (update_eh_info) |
381 maybe_clean_or_replace_eh_stmt (orig_stmt, stmt); | 410 maybe_clean_or_replace_eh_stmt (orig_stmt, stmt); |
382 | 411 |
383 gimple_duplicate_stmt_histograms (cfun, stmt, cfun, orig_stmt); | 412 gimple_duplicate_stmt_histograms (cfun, stmt, cfun, orig_stmt); |
413 | |
414 /* Free all the data flow information for ORIG_STMT. */ | |
415 gimple_set_bb (orig_stmt, NULL); | |
384 gimple_remove_stmt_histograms (cfun, orig_stmt); | 416 gimple_remove_stmt_histograms (cfun, orig_stmt); |
385 delink_stmt_imm_use (orig_stmt); | 417 delink_stmt_imm_use (orig_stmt); |
418 | |
386 *gsi_stmt_ptr (gsi) = stmt; | 419 *gsi_stmt_ptr (gsi) = stmt; |
387 gimple_set_modified (stmt, true); | 420 gimple_set_modified (stmt, true); |
388 update_modified_stmt (stmt); | 421 update_modified_stmt (stmt); |
389 } | 422 } |
390 | 423 |
402 gsi_insert_before_without_update (gimple_stmt_iterator *i, gimple stmt, | 435 gsi_insert_before_without_update (gimple_stmt_iterator *i, gimple stmt, |
403 enum gsi_iterator_update m) | 436 enum gsi_iterator_update m) |
404 { | 437 { |
405 gimple_seq_node n; | 438 gimple_seq_node n; |
406 | 439 |
407 n = GGC_NEW (struct gimple_seq_node_d); | 440 n = ggc_alloc_gimple_seq_node_d (); |
408 n->prev = n->next = NULL; | 441 n->prev = n->next = NULL; |
409 n->stmt = stmt; | 442 n->stmt = stmt; |
410 gsi_insert_seq_nodes_before (i, n, n, m); | 443 gsi_insert_seq_nodes_before (i, n, n, m); |
411 } | 444 } |
412 | 445 |
437 gsi_insert_after_without_update (gimple_stmt_iterator *i, gimple stmt, | 470 gsi_insert_after_without_update (gimple_stmt_iterator *i, gimple stmt, |
438 enum gsi_iterator_update m) | 471 enum gsi_iterator_update m) |
439 { | 472 { |
440 gimple_seq_node n; | 473 gimple_seq_node n; |
441 | 474 |
442 n = GGC_NEW (struct gimple_seq_node_d); | 475 n = ggc_alloc_gimple_seq_node_d (); |
443 n->prev = n->next = NULL; | 476 n->prev = n->next = NULL; |
444 n->stmt = stmt; | 477 n->stmt = stmt; |
445 gsi_insert_seq_nodes_after (i, n, n, m); | 478 gsi_insert_seq_nodes_after (i, n, n, m); |
446 } | 479 } |
447 | 480 |
562 | 595 |
563 void | 596 void |
564 gsi_move_to_bb_end (gimple_stmt_iterator *from, basic_block bb) | 597 gsi_move_to_bb_end (gimple_stmt_iterator *from, basic_block bb) |
565 { | 598 { |
566 gimple_stmt_iterator last = gsi_last_bb (bb); | 599 gimple_stmt_iterator last = gsi_last_bb (bb); |
567 #ifdef ENABLE_CHECKING | 600 gcc_checking_assert (gsi_bb (last) == bb); |
568 gcc_assert (gsi_bb (last) == bb); | |
569 #endif | |
570 | 601 |
571 /* Have to check gsi_end_p because it could be an empty block. */ | 602 /* Have to check gsi_end_p because it could be an empty block. */ |
572 if (!gsi_end_p (last) && is_ctrl_stmt (gsi_stmt (last))) | 603 if (!gsi_end_p (last) && is_ctrl_stmt (gsi_stmt (last))) |
573 gsi_move_before (from, &last); | 604 gsi_move_before (from, &last); |
574 else | 605 else |
690 | 721 |
691 basic_block | 722 basic_block |
692 gsi_insert_on_edge_immediate (edge e, gimple stmt) | 723 gsi_insert_on_edge_immediate (edge e, gimple stmt) |
693 { | 724 { |
694 gimple_stmt_iterator gsi; | 725 gimple_stmt_iterator gsi; |
726 struct gimple_seq_node_d node; | |
695 basic_block new_bb = NULL; | 727 basic_block new_bb = NULL; |
728 bool ins_after; | |
696 | 729 |
697 gcc_assert (!PENDING_STMT (e)); | 730 gcc_assert (!PENDING_STMT (e)); |
698 | 731 |
699 if (gimple_find_edge_insert_loc (e, &gsi, &new_bb)) | 732 ins_after = gimple_find_edge_insert_loc (e, &gsi, &new_bb); |
733 | |
734 node.stmt = stmt; | |
735 node.prev = node.next = NULL; | |
736 update_call_edge_frequencies (&node, gsi.bb); | |
737 | |
738 if (ins_after) | |
700 gsi_insert_after (&gsi, stmt, GSI_NEW_STMT); | 739 gsi_insert_after (&gsi, stmt, GSI_NEW_STMT); |
701 else | 740 else |
702 gsi_insert_before (&gsi, stmt, GSI_NEW_STMT); | 741 gsi_insert_before (&gsi, stmt, GSI_NEW_STMT); |
703 | 742 |
704 return new_bb; | 743 return new_bb; |
710 basic_block | 749 basic_block |
711 gsi_insert_seq_on_edge_immediate (edge e, gimple_seq stmts) | 750 gsi_insert_seq_on_edge_immediate (edge e, gimple_seq stmts) |
712 { | 751 { |
713 gimple_stmt_iterator gsi; | 752 gimple_stmt_iterator gsi; |
714 basic_block new_bb = NULL; | 753 basic_block new_bb = NULL; |
754 bool ins_after; | |
715 | 755 |
716 gcc_assert (!PENDING_STMT (e)); | 756 gcc_assert (!PENDING_STMT (e)); |
717 | 757 |
718 if (gimple_find_edge_insert_loc (e, &gsi, &new_bb)) | 758 ins_after = gimple_find_edge_insert_loc (e, &gsi, &new_bb); |
759 update_call_edge_frequencies (gimple_seq_first (stmts), gsi.bb); | |
760 | |
761 if (ins_after) | |
719 gsi_insert_seq_after (&gsi, stmts, GSI_NEW_STMT); | 762 gsi_insert_seq_after (&gsi, stmts, GSI_NEW_STMT); |
720 else | 763 else |
721 gsi_insert_seq_before (&gsi, stmts, GSI_NEW_STMT); | 764 gsi_insert_seq_before (&gsi, stmts, GSI_NEW_STMT); |
722 | 765 |
723 return new_bb; | 766 return new_bb; |
752 | 795 |
753 if (PENDING_STMT (e)) | 796 if (PENDING_STMT (e)) |
754 { | 797 { |
755 gimple_stmt_iterator gsi; | 798 gimple_stmt_iterator gsi; |
756 gimple_seq seq = PENDING_STMT (e); | 799 gimple_seq seq = PENDING_STMT (e); |
800 bool ins_after; | |
757 | 801 |
758 PENDING_STMT (e) = NULL; | 802 PENDING_STMT (e) = NULL; |
759 | 803 |
760 if (gimple_find_edge_insert_loc (e, &gsi, new_bb)) | 804 ins_after = gimple_find_edge_insert_loc (e, &gsi, new_bb); |
805 update_call_edge_frequencies (gimple_seq_first (seq), gsi.bb); | |
806 | |
807 if (ins_after) | |
761 gsi_insert_seq_after (&gsi, seq, GSI_NEW_STMT); | 808 gsi_insert_seq_after (&gsi, seq, GSI_NEW_STMT); |
762 else | 809 else |
763 gsi_insert_seq_before (&gsi, seq, GSI_NEW_STMT); | 810 gsi_insert_seq_before (&gsi, seq, GSI_NEW_STMT); |
764 } | 811 } |
765 } | 812 } |