This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[new-regalloc-branch] bugfix. Keep basic block info up to date
- From: Denis Chertykov <denisc at overta dot ru>
- To: gcc-patches at gcc dot gnu dot org
- Cc: Michael Matz <matz at kde dot org>, Andreas Jaeger <aj at suse dot de>, Daniel Berlin <dan at dberlin dot org>
- Date: 06 Apr 2002 12:47:53 +0400
- Subject: [new-regalloc-branch] bugfix. Keep basic block info up to date
I have successfully bootstrapped (i386) C and C++ with the following changes.
Sat Apr 6 12:40:44 2002 Denis Chertykov <denisc@overta.ru>
* pre-reload.c (emit_pre_reload_insns): Don't try to keep basic
block info.
(pre_reload_collect): Keep basic block info up to date.
Index: pre-reload.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/Attic/pre-reload.c,v
retrieving revision 1.1.2.2
diff -c -3 -p -r1.1.2.2 pre-reload.c
*** pre-reload.c 2002/03/16 11:53:44 1.1.2.2
--- pre-reload.c 2002/04/06 08:41:45
*************** emit_pre_reload_insns (insn)
*** 762,768 ****
{
int j;
rtx following_insn = NEXT_INSN (insn);
- rtx before_insn = PREV_INSN (insn);
for (j = 0; j < n_reloads; ++j)
{
--- 762,767 ----
*************** emit_pre_reload_insns (insn)
*** 884,899 ****
emit_insns_before (output_reload_insns[j], following_insn);
emit_insns_before (other_output_reload_insns[j], following_insn);
}
-
- /* Keep basic block info up to date. */
- if (n_basic_blocks)
- {
- basic_block bb = BLOCK_FOR_INSN (insn);
- if (bb->head == insn)
- bb->head = NEXT_INSN (before_insn);
- if (bb->end == insn)
- bb->end = PREV_INSN (following_insn);
- }
}
--- 883,888 ----
*************** pre_reload_collect (ra_info)
*** 3822,3827 ****
--- 3811,3818 ----
{
rtx insn;
int cnt;
+ int block;
+
ra_ref *def_refs[(sizeof (ra_ref *)
* MAX_RECOG_OPERANDS * MAX_REGS_PER_ADDRESS + 1)];
ra_ref *use_refs[(sizeof (ra_ref *)
*************** pre_reload_collect (ra_info)
*** 3830,3892 ****
cnt = get_max_uid ();
cnt += cnt / 5;
! for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
! {
! enum rtx_code pat_code;
! enum rtx_code code = GET_CODE (insn);
! rtx prev;
! rtx next;
! ra_info_add_insn_refs (ra_info, insn, NULL);
! if (GET_RTX_CLASS (code) != 'i')
! continue;
! pat_code = GET_CODE (PATTERN (insn));
! if (pat_code == USE
! || pat_code == CLOBBER
! || pat_code == ASM_INPUT
! || pat_code == ADDR_VEC
! || pat_code == ADDR_DIFF_VEC)
! continue;
! cnt = 0;
! next = NEXT_INSN (insn);
! prev = PREV_INSN (insn);
! while (1)
! {
! int n_defs;
! int n_uses;
!
! ra_info_add_insn_refs (ra_info, insn, NULL);
! collect_insn_info (insn, def_refs, use_refs, &n_defs, &n_uses);
! if (++cnt > 30)
! abort ();
! if (n_reloads)
! {
! emit_pre_reload_insns (insn);
! subst_pre_reloads (insn);
! insn = NEXT_INSN (prev);
! continue;
! }
- if (n_defs || n_uses)
- {
- struct ra_refs *insn_refs;
- insn_refs = build_ra_refs_for_insn (ra_info, def_refs, use_refs,
- n_defs, n_uses);
- ra_info_add_insn_refs (ra_info, insn, insn_refs);
- ra_info_add_reg_refs (ra_info, insn, insn_refs);
- }
- else
ra_info_add_insn_refs (ra_info, insn, NULL);
! if (NEXT_INSN (insn) == next)
! break;
! insn = NEXT_INSN (insn);
! }
! }
for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
{
--- 3821,3895 ----
cnt = get_max_uid ();
cnt += cnt / 5;
! for (block = 0; block < n_basic_blocks; ++block)
! for (insn = BLOCK_HEAD (block);
! insn && PREV_INSN (insn) != BLOCK_END (block);
! insn = NEXT_INSN (insn))
! {
! enum rtx_code pat_code;
! enum rtx_code code = GET_CODE (insn);
! rtx prev;
! rtx next;
! rtx orig_insn;
! ra_info_add_insn_refs (ra_info, insn, NULL);
! if (GET_RTX_CLASS (code) != 'i')
! continue;
! pat_code = GET_CODE (PATTERN (insn));
! if (pat_code == USE
! || pat_code == CLOBBER
! || pat_code == ASM_INPUT
! || pat_code == ADDR_VEC
! || pat_code == ADDR_DIFF_VEC)
! continue;
! cnt = 0;
! next = NEXT_INSN (insn);
! prev = PREV_INSN (insn);
! orig_insn = insn;
! while (1)
! {
! int n_defs;
! int n_uses;
ra_info_add_insn_refs (ra_info, insn, NULL);
+ collect_insn_info (insn, def_refs, use_refs, &n_defs, &n_uses);
+ if (++cnt > 30)
+ abort ();
+ if (n_reloads)
+ {
+ emit_pre_reload_insns (insn);
+ subst_pre_reloads (insn);
+ insn = NEXT_INSN (prev);
+ continue;
+ }
! if (n_defs || n_uses)
! {
! struct ra_refs *insn_refs;
! insn_refs = build_ra_refs_for_insn (ra_info,
! def_refs, use_refs,
! n_defs, n_uses);
! ra_info_add_insn_refs (ra_info, insn, insn_refs);
! ra_info_add_reg_refs (ra_info, insn, insn_refs);
! }
! else
! ra_info_add_insn_refs (ra_info, insn, NULL);
!
! if (NEXT_INSN (insn) == next)
! break;
! insn = NEXT_INSN (insn);
! }
!
! /* Keep basic block info up to date. */
! if (BLOCK_HEAD (block) == orig_insn)
! BLOCK_HEAD (block) = NEXT_INSN (prev);
! if (BLOCK_END (block) == orig_insn)
! BLOCK_END (block) = PREV_INSN (next);
! }
for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
{