This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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


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?

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);
-- 
Alexandre Oliva, freedom fighter    http://FSFLA.org/~lxoliva/
You must be the change you wish to see in the world. -- Gandhi
Be Free! -- http://FSFLA.org/   FSF Latin America board member
Free Software Evangelist      Red Hat Brazil Compiler Engineer

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]