diff options
author | Seongbae Park <seongbae.park@gmail.com> | 2007-07-30 20:30:38 +0000 |
---|---|---|
committer | Seongbae Park <spark@gcc.gnu.org> | 2007-07-30 20:30:38 +0000 |
commit | 5d545bf17faf826e84d0ac9c9e62b49b19037904 (patch) | |
tree | 3bcc94976b0a80a290a65e6c023be4528677d5e5 | |
parent | 2786eb8dbf8909fc0af3991043eaae77741cbeb0 (diff) | |
download | gcc-5d545bf17faf826e84d0ac9c9e62b49b19037904.zip gcc-5d545bf17faf826e84d0ac9c9e62b49b19037904.tar.gz gcc-5d545bf17faf826e84d0ac9c9e62b49b19037904.tar.bz2 |
df-scan.c (df_scan_verify): Remove artificial limit on the number of blocks for verification.
2007-07-30 Seongbae Park <seongbae.park@gmail.com>
* df-scan.c (df_scan_verify): Remove artificial limit on
the number of blocks for verification.
* df-problems.c (df_lr_bb_local_compute, df_simulate_find_defs,
df_simulate_defs): Avoid unnecessary insn checking for defs.
From-SVN: r127070
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/df-problems.c | 141 | ||||
-rw-r--r-- | gcc/df-scan.c | 6 |
3 files changed, 28 insertions, 126 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a67cc1f..5cd25a9 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2007-07-30 Seongbae Park <seongbae.park@gmail.com> + + * df-scan.c (df_scan_verify): Remove artificial limit on + the number of blocks for verification. + * df-problems.c (df_lr_bb_local_compute, df_simulate_find_defs, + df_simulate_defs): Avoid unnecessary insn checking for defs. + 2007-07-29 Mark Mitchell <mark@codesourcery.com> gcc/ diff --git a/gcc/df-problems.c b/gcc/df-problems.c index a9c42a6..b28fb16 100644 --- a/gcc/df-problems.c +++ b/gcc/df-problems.c @@ -1389,53 +1389,16 @@ df_lr_bb_local_compute (unsigned int bb_index) if (!INSN_P (insn)) continue; - if (CALL_P (insn)) + for (def_rec = DF_INSN_UID_DEFS (uid); *def_rec; def_rec++) { - for (def_rec = DF_INSN_UID_DEFS (uid); *def_rec; def_rec++) + struct df_ref *def = *def_rec; + /* If the def is to only part of the reg, it does + not kill the other defs that reach here. */ + if (!(DF_REF_FLAGS (def) & (DF_REF_PARTIAL | DF_REF_CONDITIONAL))) { - struct df_ref *def = *def_rec; unsigned int dregno = DF_REF_REGNO (def); - - if (DF_REF_FLAGS (def) & DF_REF_MUST_CLOBBER) - { - if (dregno >= FIRST_PSEUDO_REGISTER - || !(SIBLING_CALL_P (insn) - && bitmap_bit_p (df->exit_block_uses, dregno) - && !refers_to_regno_p (dregno, dregno+1, - current_function_return_rtx, - (rtx *)0))) - { - /* If the def is to only part of the reg, it does - not kill the other defs that reach here. */ - if (!(DF_REF_FLAGS (def) & (DF_REF_PARTIAL | DF_REF_CONDITIONAL))) - { - bitmap_set_bit (bb_info->def, dregno); - bitmap_clear_bit (bb_info->use, dregno); - } - } - } - else - /* This is the return value. */ - if (!(DF_REF_FLAGS (def) & (DF_REF_PARTIAL | DF_REF_CONDITIONAL))) - { - bitmap_set_bit (bb_info->def, dregno); - bitmap_clear_bit (bb_info->use, dregno); - } - } - } - else - { - for (def_rec = DF_INSN_UID_DEFS (uid); *def_rec; def_rec++) - { - struct df_ref *def = *def_rec; - /* If the def is to only part of the reg, it does - not kill the other defs that reach here. */ - if (!(DF_REF_FLAGS (def) & (DF_REF_PARTIAL | DF_REF_CONDITIONAL))) - { - unsigned int dregno = DF_REF_REGNO (def); - bitmap_set_bit (bb_info->def, dregno); - bitmap_clear_bit (bb_info->use, dregno); - } + bitmap_set_bit (bb_info->def, dregno); + bitmap_clear_bit (bb_info->use, dregno); } } @@ -4218,44 +4181,13 @@ df_simulate_find_defs (rtx insn, bitmap defs) struct df_ref **def_rec; unsigned int uid = INSN_UID (insn); - if (CALL_P (insn)) + for (def_rec = DF_INSN_UID_DEFS (uid); *def_rec; def_rec++) { - for (def_rec = DF_INSN_UID_DEFS (uid); *def_rec; def_rec++) - { - struct df_ref *def = *def_rec; - unsigned int dregno = DF_REF_REGNO (def); - - if (DF_REF_FLAGS (def) & DF_REF_MUST_CLOBBER) - { - if (dregno >= FIRST_PSEUDO_REGISTER - || !(SIBLING_CALL_P (insn) - && bitmap_bit_p (df->exit_block_uses, dregno) - && !refers_to_regno_p (dregno, dregno+1, - current_function_return_rtx, - (rtx *)0))) - { - /* If the def is to only part of the reg, it does - not kill the other defs that reach here. */ - if (!(DF_REF_FLAGS (def) & (DF_REF_PARTIAL | DF_REF_CONDITIONAL))) - bitmap_set_bit (defs, dregno); - } - } - else - /* This is the return value. */ - if (!(DF_REF_FLAGS (def) & (DF_REF_PARTIAL | DF_REF_CONDITIONAL))) - bitmap_set_bit (defs, dregno); - } - } - else - { - for (def_rec = DF_INSN_UID_DEFS (uid); *def_rec; def_rec++) - { - struct df_ref *def = *def_rec; - /* If the def is to only part of the reg, it does - not kill the other defs that reach here. */ - if (!(DF_REF_FLAGS (def) & (DF_REF_PARTIAL | DF_REF_CONDITIONAL))) - bitmap_set_bit (defs, DF_REF_REGNO (def)); - } + struct df_ref *def = *def_rec; + /* If the def is to only part of the reg, it does + not kill the other defs that reach here. */ + if (!(DF_REF_FLAGS (def) & (DF_REF_PARTIAL | DF_REF_CONDITIONAL))) + bitmap_set_bit (defs, DF_REF_REGNO (def)); } } @@ -4268,46 +4200,15 @@ df_simulate_defs (rtx insn, bitmap live) struct df_ref **def_rec; unsigned int uid = INSN_UID (insn); - if (CALL_P (insn)) + for (def_rec = DF_INSN_UID_DEFS (uid); *def_rec; def_rec++) { - for (def_rec = DF_INSN_UID_DEFS (uid); *def_rec; def_rec++) - { - struct df_ref *def = *def_rec; - unsigned int dregno = DF_REF_REGNO (def); - - if (DF_REF_FLAGS (def) & DF_REF_MUST_CLOBBER) - { - if (dregno >= FIRST_PSEUDO_REGISTER - || !(SIBLING_CALL_P (insn) - && bitmap_bit_p (df->exit_block_uses, dregno) - && !refers_to_regno_p (dregno, dregno+1, - current_function_return_rtx, - (rtx *)0))) - { - /* If the def is to only part of the reg, it does - not kill the other defs that reach here. */ - if (!(DF_REF_FLAGS (def) & (DF_REF_PARTIAL | DF_REF_CONDITIONAL))) - bitmap_clear_bit (live, dregno); - } - } - else - /* This is the return value. */ - if (!(DF_REF_FLAGS (def) & (DF_REF_PARTIAL | DF_REF_CONDITIONAL))) - bitmap_clear_bit (live, dregno); - } - } - else - { - for (def_rec = DF_INSN_UID_DEFS (uid); *def_rec; def_rec++) - { - struct df_ref *def = *def_rec; - unsigned int dregno = DF_REF_REGNO (def); - - /* If the def is to only part of the reg, it does - not kill the other defs that reach here. */ - if (!(DF_REF_FLAGS (def) & (DF_REF_PARTIAL | DF_REF_CONDITIONAL))) - bitmap_clear_bit (live, dregno); - } + struct df_ref *def = *def_rec; + unsigned int dregno = DF_REF_REGNO (def); + + /* If the def is to only part of the reg, it does + not kill the other defs that reach here. */ + if (!(DF_REF_FLAGS (def) & (DF_REF_PARTIAL | DF_REF_CONDITIONAL))) + bitmap_clear_bit (live, dregno); } } diff --git a/gcc/df-scan.c b/gcc/df-scan.c index 6e622f8..76f85c1 100644 --- a/gcc/df-scan.c +++ b/gcc/df-scan.c @@ -4265,12 +4265,6 @@ df_scan_verify (void) if (!df) return; - /* This is a hack, but a necessary one. If you do not do this, - insn_attrtab can never be compiled in a bootstrap. This - verification is just too expensive. */ - if (n_basic_blocks > 250) - return; - /* Verification is a 4 step process. */ /* (1) All of the refs are marked by going thru the reg chains. */ |