From 21de87e9cc4e84cd9a0aedc8101d85cdca7d8a76 Mon Sep 17 00:00:00 2001 From: spark Date: Mon, 30 Jul 2007 20:30:38 +0000 Subject: [PATCH] 2007-07-30 Seongbae Park * 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@127070 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 7 +++ gcc/df-problems.c | 141 ++++++++---------------------------------------------- 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 + + * 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 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. */ -- 2.7.4