===================================================================
@@ -2481,6 +2481,7 @@ extern void dump_combine_total_stats (FI
/* In cfgcleanup.c */
extern void delete_dead_jumptables (void);
+extern void delete_dead_labels (void);
/* In sched-vis.c. */
extern void debug_bb_n_slim (int);
===================================================================
@@ -2900,6 +2900,37 @@ delete_dead_jumptables (void)
}
}
+/* Delete labels which are dead and can be removed. */
+
+void
+delete_dead_labels (void)
+{
+ basic_block bb;
+
+ FOR_EACH_BB (bb)
+ {
+ rtx insn;
+
+ FOR_BB_INSNS (bb, insn)
+ {
+ if (NOTE_INSN_BASIC_BLOCK_P (insn))
+ continue;
+
+ if (!LABEL_P (insn)
+ || LABEL_NUSES (insn) != 0
+ || LABEL_PRESERVE_P (insn)
+ || LABEL_NAME (insn) != 0)
+ break;
+
+ if (dump_file)
+ fprintf (dump_file, "Dead label %i removed\n",
+ INSN_UID (insn));
+
+ delete_insn (insn);
+ break;
+ }
+ }
+}
/* Tidy the CFG by deleting unreachable code and whatnot. */
===================================================================
@@ -1369,6 +1369,7 @@ cfg_layout_finalize (void)
rebuild_jump_labels (get_insns ());
delete_dead_jumptables ();
+ delete_dead_labels ();
#ifdef ENABLE_CHECKING
verify_insn_chain ();
===================================================================
@@ -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" } } */
+