+2010-03-02 Jakub Jelinek <jakub@redhat.com>
+ Steven Bosscher <steven@gcc.gnu.org>
+
+ * var-tracking.c (vt_initialize): Scan insns in ebb chunks instead
+ of bb.
+
2010-03-02 Reza Yazdani <reza.yazdani@amd.com>
PR middle-end/42640
2010-03-02 Reza Yazdani <reza.yazdani@amd.com>
PR middle-end/42640
{
rtx insn;
HOST_WIDE_INT pre, post = 0;
{
rtx insn;
HOST_WIDE_INT pre, post = 0;
unsigned int next_uid_before = cselib_get_next_uid ();
unsigned int next_uid_after = next_uid_before;
unsigned int next_uid_before = cselib_get_next_uid ();
unsigned int next_uid_after = next_uid_before;
+ basic_block first_bb, last_bb;
if (MAY_HAVE_DEBUG_INSNS)
{
if (MAY_HAVE_DEBUG_INSNS)
{
cselib_get_next_uid ());
}
cselib_get_next_uid ());
}
+ first_bb = bb;
+ for (;;)
+ {
+ edge e;
+ if (bb->next_bb == EXIT_BLOCK_PTR
+ || ! single_pred_p (bb->next_bb))
+ break;
+ e = find_edge (bb, bb->next_bb);
+ if (! e || (e->flags & EDGE_FALLTHRU) == 0)
+ break;
+ bb = bb->next_bb;
+ }
+ last_bb = bb;
+
/* Count the number of micro operations. */
/* Count the number of micro operations. */
- VTI (bb)->n_mos = 0;
- for (insn = BB_HEAD (bb); insn != NEXT_INSN (BB_END (bb));
- insn = NEXT_INSN (insn))
+ FOR_BB_BETWEEN (bb, first_bb, last_bb->next_bb, next_bb)
+ VTI (bb)->n_mos = 0;
+ for (insn = BB_HEAD (bb); insn != NEXT_INSN (BB_END (bb));
+ insn = NEXT_INSN (insn))
- if (!frame_pointer_needed)
- insn_stack_adjust_offset_pre_post (insn, &pre, &post);
- if (pre)
+ if (!frame_pointer_needed)
- VTI (bb)->n_mos++;
- if (dump_file && (dump_flags & TDF_DETAILS))
- log_op_type (GEN_INT (pre), bb, insn,
- MO_ADJUST, dump_file);
+ insn_stack_adjust_offset_pre_post (insn, &pre, &post);
+ if (pre)
+ {
+ VTI (bb)->n_mos++;
+ if (dump_file && (dump_flags & TDF_DETAILS))
+ log_op_type (GEN_INT (pre), bb, insn,
+ MO_ADJUST, dump_file);
+ }
+ if (post)
+ {
+ VTI (bb)->n_mos++;
+ if (dump_file && (dump_flags & TDF_DETAILS))
+ log_op_type (GEN_INT (post), bb, insn,
+ MO_ADJUST, dump_file);
+ }
+ cselib_hook_called = false;
+ if (MAY_HAVE_DEBUG_INSNS)
+ cselib_process_insn (insn);
if (dump_file && (dump_flags & TDF_DETAILS))
if (dump_file && (dump_flags & TDF_DETAILS))
- log_op_type (GEN_INT (post), bb, insn,
- MO_ADJUST, dump_file);
+ {
+ print_rtl_single (dump_file, insn);
+ dump_cselib_table (dump_file);
+ }
- }
- cselib_hook_called = false;
- if (MAY_HAVE_DEBUG_INSNS)
- {
- cselib_process_insn (insn);
- if (dump_file && (dump_flags & TDF_DETAILS))
+ if (!cselib_hook_called)
+ count_with_sets (insn, 0, 0);
+ if (CALL_P (insn))
- print_rtl_single (dump_file, insn);
- dump_cselib_table (dump_file);
+ VTI (bb)->n_mos++;
+ if (dump_file && (dump_flags & TDF_DETAILS))
+ log_op_type (PATTERN (insn), bb, insn,
+ MO_CALL, dump_file);
- if (!cselib_hook_called)
- count_with_sets (insn, 0, 0);
- if (CALL_P (insn))
- {
- VTI (bb)->n_mos++;
- if (dump_file && (dump_flags & TDF_DETAILS))
- log_op_type (PATTERN (insn), bb, insn,
- MO_CALL, dump_file);
- }
- count = VTI (bb)->n_mos;
-
if (MAY_HAVE_DEBUG_INSNS)
{
cselib_preserve_only_values (false);
if (MAY_HAVE_DEBUG_INSNS)
{
cselib_preserve_only_values (false);
}
/* Add the micro-operations to the array. */
}
/* Add the micro-operations to the array. */
- VTI (bb)->mos = XNEWVEC (micro_operation, VTI (bb)->n_mos);
- VTI (bb)->n_mos = 0;
- for (insn = BB_HEAD (bb); insn != NEXT_INSN (BB_END (bb));
- insn = NEXT_INSN (insn))
+ FOR_BB_BETWEEN (bb, first_bb, last_bb->next_bb, next_bb)
+ int count = VTI (bb)->n_mos;
+ VTI (bb)->mos = XNEWVEC (micro_operation, count);
+ VTI (bb)->n_mos = 0;
+ for (insn = BB_HEAD (bb); insn != NEXT_INSN (BB_END (bb));
+ insn = NEXT_INSN (insn))
- if (!frame_pointer_needed)
- insn_stack_adjust_offset_pre_post (insn, &pre, &post);
- if (pre)
+ if (!frame_pointer_needed)
- micro_operation *mo = VTI (bb)->mos + VTI (bb)->n_mos++;
+ insn_stack_adjust_offset_pre_post (insn, &pre, &post);
+ if (pre)
+ {
+ micro_operation *mo
+ = VTI (bb)->mos + VTI (bb)->n_mos++;
- mo->type = MO_ADJUST;
- mo->u.adjust = pre;
- mo->insn = insn;
+ mo->type = MO_ADJUST;
+ mo->u.adjust = pre;
+ mo->insn = insn;
- if (dump_file && (dump_flags & TDF_DETAILS))
- log_op_type (PATTERN (insn), bb, insn,
- MO_ADJUST, dump_file);
+ if (dump_file && (dump_flags & TDF_DETAILS))
+ log_op_type (PATTERN (insn), bb, insn,
+ MO_ADJUST, dump_file);
+ }
- cselib_hook_called = false;
- if (MAY_HAVE_DEBUG_INSNS)
- {
- cselib_process_insn (insn);
- if (dump_file && (dump_flags & TDF_DETAILS))
+ cselib_hook_called = false;
+ if (MAY_HAVE_DEBUG_INSNS)
- print_rtl_single (dump_file, insn);
- dump_cselib_table (dump_file);
+ cselib_process_insn (insn);
+ if (dump_file && (dump_flags & TDF_DETAILS))
+ {
+ print_rtl_single (dump_file, insn);
+ dump_cselib_table (dump_file);
+ }
- }
- if (!cselib_hook_called)
- add_with_sets (insn, 0, 0);
+ if (!cselib_hook_called)
+ add_with_sets (insn, 0, 0);
- if (!frame_pointer_needed && post)
- {
- micro_operation *mo = VTI (bb)->mos + VTI (bb)->n_mos++;
+ if (!frame_pointer_needed && post)
+ {
+ micro_operation *mo = VTI (bb)->mos + VTI (bb)->n_mos++;
- mo->type = MO_ADJUST;
- mo->u.adjust = post;
- mo->insn = insn;
+ mo->type = MO_ADJUST;
+ mo->u.adjust = post;
+ mo->insn = insn;
- if (dump_file && (dump_flags & TDF_DETAILS))
- log_op_type (PATTERN (insn), bb, insn,
- MO_ADJUST, dump_file);
+ if (dump_file && (dump_flags & TDF_DETAILS))
+ log_op_type (PATTERN (insn), bb, insn,
+ MO_ADJUST, dump_file);
+ }
+ gcc_assert (count == VTI (bb)->n_mos);
- gcc_assert (count == VTI (bb)->n_mos);
if (MAY_HAVE_DEBUG_INSNS)
{
cselib_preserve_only_values (true);
if (MAY_HAVE_DEBUG_INSNS)
{
cselib_preserve_only_values (true);