[PATCH] Don't reset cselib hash table during vt_initialize after every bb, only after every ebb (take 2)
Jakub Jelinek
jakub@redhat.com
Mon Mar 1 19:37:00 GMT 2010
On Sun, Feb 28, 2010 at 12:11:14AM +0100, Steven Bosscher wrote:
> > Makes sense, will change it. Â The code in the patch has been
> > copied from sched-ebb.c.
>
> Yes, well, sched-ebb.c is also not exactly an example of how to
> properly manage the CFG. It does funny things like calling
> compute_bb_for_insn (which should be valid anyway if someone runs this
> scheduler), and then basically completely ignores the CFG and all
> basic block boundaries in schedule_ebb. This is one of the few passes
> that really doesn't work at all in cfglayout mode before register
> allocation.
Okay, here is what I've bootstrapped/regtested on x86_64-linux and
i686-linux (the patch is mostly reindentation). Ok for trunk?
2010-03-01 Jakub Jelinek <jakub@redhat.com>
Steven Bosscher <steven@gcc.gnu.org>
* var-tracking.c (vt_initialize): Scan insns in ebb chunks instead
of bb.
--- gcc/var-tracking.c.jj 2010-02-26 11:17:23.000000000 +0100
+++ gcc/var-tracking.c 2010-03-01 17:17:58.000000000 +0100
@@ -7399,9 +7399,9 @@ vt_initialize (void)
{
rtx insn;
HOST_WIDE_INT pre, post = 0;
- int count;
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)
{
@@ -7411,55 +7411,70 @@ vt_initialize (void)
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. */
- 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)
{
- if (INSN_P (insn))
+ VTI (bb)->n_mos = 0;
+ for (insn = BB_HEAD (bb); insn != NEXT_INSN (BB_END (bb));
+ insn = NEXT_INSN (insn))
{
- if (!frame_pointer_needed)
+ if (INSN_P (insn))
{
- 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);
+ }
}
- if (post)
+ cselib_hook_called = false;
+ if (MAY_HAVE_DEBUG_INSNS)
{
- VTI (bb)->n_mos++;
+ cselib_process_insn (insn);
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);
@@ -7472,22 +7487,53 @@ vt_initialize (void)
}
/* 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)
{
- if (INSN_P (insn))
+ 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)
+ if (INSN_P (insn))
{
- insn_stack_adjust_offset_pre_post (insn, &pre, &post);
- if (pre)
+ if (!frame_pointer_needed)
+ {
+ 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;
+
+ 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))
+ {
+ print_rtl_single (dump_file, insn);
+ dump_cselib_table (dump_file);
+ }
+ }
+ 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++;
mo->type = MO_ADJUST;
- mo->u.adjust = pre;
+ mo->u.adjust = post;
mo->insn = insn;
if (dump_file && (dump_flags & TDF_DETAILS))
@@ -7495,35 +7541,12 @@ vt_initialize (void)
MO_ADJUST, dump_file);
}
}
-
- cselib_hook_called = false;
- if (MAY_HAVE_DEBUG_INSNS)
- {
- 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 (!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;
-
- 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);
+
+ bb = last_bb;
+
if (MAY_HAVE_DEBUG_INSNS)
{
cselib_preserve_only_values (true);
Jakub
More information about the Gcc-patches
mailing list