Patchwork fix -fcompare-debug failure in libjava/javax/swing/plaf/basic

login
register
mail settings
Submitter Alexandre Oliva
Date Oct. 1, 2010, 10:24 p.m.
Message ID <orvd5l361h.fsf@livre.localdomain>
Download mbox | patch
Permalink /patch/66527/
State New
Headers show

Comments

Alexandre Oliva - Oct. 1, 2010, 10:24 p.m.
The non-PIC compilation of libjava's javax/swing/plaf/basic.list fails
-fcompare-debug on i686.  The problem is that, at the end of one pass,
we found debug insns referencing dead registers, and introduced new
debug temps bound to the regs before they died.  This marked the
corresponding blocks as dirty except for LR, but this was not enough to
avoid a cfgcleanup that moved insns around before the subsequent pass.
Although this is a general problem, this specific problem occurred
between DSE2 and CSA.

The patch below pretty much reverts the patch for PR42889, and uses the
same solution that I had used in other functions in df-scan.c: don't
mark BBs as dirty at all when messing with debug insns only.

Regstrapped on x86_64-linux-gnu and i686-pc-linux-gnu, for the first
time in a long time with bootstrap-debug-libs in BOOT_CONFIG.  FWIW, the
earlier patch for pr42889 addded a testcase, and it still passed after
this patch.  Ok to install?
Eric Botcazou - Nov. 11, 2010, 3:53 p.m.
> The patch below pretty much reverts the patch for PR42889, and uses the
> same solution that I had used in other functions in df-scan.c: don't
> mark BBs as dirty at all when messing with debug insns only.
>
> Regstrapped on x86_64-linux-gnu and i686-pc-linux-gnu, for the first
> time in a long time with bootstrap-debug-libs in BOOT_CONFIG.  FWIW, the
> earlier patch for pr42889 addded a testcase, and it still passed after
> this patch.  Ok to install?

OK, thanks.

Patch

for  gcc/ChangeLog
from  Alexandre Oliva  <aoliva@redhat.com>

	PR debug/42889
	* df-scan.c (df_insn_rescan): Don't mark BBs upon debug insns.
	* df-core.c (df_set_bb_dirty_nonrl): Remove.
	* df.h (df_set_bb_dirty_nonlr): Likewise.

Index: gcc/df-core.c
===================================================================
--- gcc/df-core.c.orig	2010-09-29 00:31:22.793305711 -0300
+++ gcc/df-core.c	2010-09-29 00:31:59.102300960 -0300
@@ -1428,29 +1428,6 @@  df_set_bb_dirty (basic_block bb)
 }
 
 
-/* Mark BB as needing it's transfer functions as being out of
-   date, except for LR problem.  Used when analyzing DEBUG_INSNs,
-   as LR problem can trigger DCE, and DEBUG_INSNs shouldn't ever
-   shorten or enlarge lifetime of regs.  */
-
-void
-df_set_bb_dirty_nonlr (basic_block bb)
-{
-  if (df)
-    {
-      int p;
-      for (p = 1; p < df->num_problems_defined; p++)
-	{
-	  struct dataflow *dflow = df->problems_in_order[p];
-	  if (dflow == df_lr)
-	    continue;
-	  if (dflow->out_of_date_transfer_functions)
-	    bitmap_set_bit (dflow->out_of_date_transfer_functions, bb->index);
-	  dflow->solutions_dirty = true;
-	}
-    }
-}
-
 /* Grow the bb_info array.  */
 
 void
Index: gcc/df-scan.c
===================================================================
--- gcc/df-scan.c.orig	2010-09-29 00:31:22.416299239 -0300
+++ gcc/df-scan.c	2010-09-29 00:31:28.613295888 -0300
@@ -1261,9 +1261,7 @@  df_insn_rescan (rtx insn)
     }
 
   df_refs_add_to_chains (&collection_rec, bb, insn);
-  if (DEBUG_INSN_P (insn))
-    df_set_bb_dirty_nonlr (bb);
-  else
+  if (!DEBUG_INSN_P (insn))
     df_set_bb_dirty (bb);
 
   VEC_free (df_ref, stack, collection_rec.def_vec);
Index: gcc/df.h
===================================================================
--- gcc/df.h.orig	2010-09-29 00:31:23.239291180 -0300
+++ gcc/df.h	2010-09-29 00:33:02.552389137 -0300
@@ -897,7 +897,6 @@  extern void df_simple_dataflow (enum df_
 extern void df_mark_solutions_dirty (void);
 extern bool df_get_bb_dirty (basic_block);
 extern void df_set_bb_dirty (basic_block);
-extern void df_set_bb_dirty_nonlr (basic_block);
 extern void df_compact_blocks (void);
 extern void df_bb_replace (int, basic_block);
 extern void df_bb_delete (int);