Message ID | 4ECF70A6.4040200@mentor.com |
---|---|
State | New |
Headers | show |
Hi, On Fri, 25 Nov 2011, Tom de Vries wrote: > > Note that you actually can remove labels also if they are > > !can_delete_label_p, if you use delete_insn (which you do). It will > > replace such undeletable labels by a DELETED_LABEL note. > > I tried that as well but ran into these errors in rtl_verify_flow_info_1: > ... > libquadmath/printf/cmp.c:56:1: error: NOTE_INSN_BASIC_BLOCK is missing for block 6 > libquadmath/printf/cmp.c:56:1: error: NOTE_INSN_BASIC_BLOCK 79 in middle of > basic block 6 Hmpf, probably bitrotted over time. Oh well, so be it. Ciao, Michael.
On Fri, Nov 25, 2011 at 2:03 PM, Michael Matz <matz@suse.de> wrote: > Hi, > > On Fri, 25 Nov 2011, Tom de Vries wrote: > >> > Note that you actually can remove labels also if they are >> > !can_delete_label_p, if you use delete_insn (which you do). It will >> > replace such undeletable labels by a DELETED_LABEL note. >> >> I tried that as well but ran into these errors in rtl_verify_flow_info_1: >> ... >> libquadmath/printf/cmp.c:56:1: error: NOTE_INSN_BASIC_BLOCK is missing for block 6 >> libquadmath/printf/cmp.c:56:1: error: NOTE_INSN_BASIC_BLOCK 79 in middle of >> basic block 6 > > Hmpf, probably bitrotted over time. Oh well, so be it. No, DELETED_LABEL notes still work just fine. It depends on how you remove the label and replace it with a note, and Tom isn't showing what he did, so... Ciao! Steven
> No, DELETED_LABEL notes still work just fine. It depends on how you > remove the label and replace it with a note, and Tom isn't showing > what he did, so... I agree that there is no obvious reason why just calling delete_insn would not work, so this should be investigated first.
Index: gcc/cfglayout.c =================================================================== --- gcc/cfglayout.c (revision 181652) +++ gcc/cfglayout.c (working copy) @@ -857,6 +857,10 @@ fixup_reorder_chain (void) (e_taken->src, e_taken->dest)); e_taken->flags |= EDGE_FALLTHRU; update_br_prob_note (bb); + if (LABEL_NUSES (ret_label) == 0 + && can_delete_label_p (ret_label) + && single_pred_p (e_taken->dest)) + delete_insn (ret_label); continue; } } Index: gcc/rtl.h =================================================================== --- gcc/rtl.h (revision 181652) +++ gcc/rtl.h (working copy) @@ -2482,6 +2482,9 @@ extern void dump_combine_total_stats (FI /* In cfgcleanup.c */ extern void delete_dead_jumptables (void); +/* In rtlcfg.c */ +int can_delete_label_p (const_rtx); + /* In sched-vis.c. */ extern void debug_bb_n_slim (int); extern void debug_bb_slim (struct basic_block_def *); Index: gcc/cfgrtl.c =================================================================== --- gcc/cfgrtl.c (revision 181652) +++ gcc/cfgrtl.c (working copy) @@ -66,7 +66,6 @@ along with GCC; see the file COPYING3. #include "df.h" static int can_delete_note_p (const_rtx); -static int can_delete_label_p (const_rtx); static basic_block rtl_split_edge (edge); static bool rtl_move_block_after (basic_block, basic_block); static int rtl_verify_flow_info (void); @@ -102,7 +101,7 @@ can_delete_note_p (const_rtx note) /* True if a given label can be deleted. */ -static int +int can_delete_label_p (const_rtx label) { return (!LABEL_PRESERVE_P (label) Index: gcc/testsuite/gcc.dg/superblock.c =================================================================== --- /dev/null (new file) +++ gcc/testsuite/gcc.dg/superblock.c (revision 0) @@ -0,0 +1,23 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fno-asynchronous-unwind-tables -fsched2-use-superblocks -fdump-rtl-sched2 -fdump-rtl-bbro" } */ + +typedef int aligned __attribute__ ((aligned (64))); +extern void abort (void); + +int bar (void *p); + +void +foo (void) +{ + char *p = __builtin_alloca (13); + aligned i; + + if (bar (p) || bar (&i)) + abort (); +} + +/* { dg-final { scan-rtl-dump-times "0 uses" 0 "bbro"} } */ +/* { dg-final { scan-rtl-dump-times "ADVANCING TO" 2 "sched2"} } */ +/* { dg-final { cleanup-rtl-dump "bbro" } } */ +/* { dg-final { cleanup-rtl-dump "sched2" } } */ +