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]

Re: RFC: VTA alias set discrepancy


On Thu, Mar 18, 2010 at 04:08:13PM +0100, Jakub Jelinek wrote:
> Hi!
> 
> 1) as cfgexpand.c will need to call the same function, the new routine
> shouldn't live in dwarf2out.c, instead varasm.c or cfgexpand.c
> 2) I wouldn't do this conditionally on flag_compare_debug, make_decl_rtl
> doesn't need to be called at all in -g0 case and I think we should better
> avoid having any aliasing changes.

Fixed.

Like this?

	* output.h: Declare make_decl_rtl_for_debug.
	* varasm.c (make_decl_rtl_for_debug): New.
	* dwarf2out.c (rtl_for_decl_location): Call it.

Index: testsuite/gfortran.dg/assign-debug.f90
===================================================================
--- testsuite/gfortran.dg/assign-debug.f90	(revision 0)
+++ testsuite/gfortran.dg/assign-debug.f90	(revision 0)
@@ -0,0 +1,8 @@
+! { dg-do compile }
+! { dg-options "-fcompare-debug -O2" }
+      program test
+      integer i
+      common i
+      assign 2000 to i  ! { dg-warning "Deleted feature: ASSIGN statement" }
+2000  continue
+      end
Index: dwarf2out.c
===================================================================
--- dwarf2out.c	(revision 157481)
+++ dwarf2out.c	(working copy)
@@ -15770,10 +15770,7 @@ rtl_for_decl_location (tree decl)
       && !DECL_HARD_REGISTER (decl)
       && DECL_MODE (decl) != VOIDmode)
     {
-      rtl = DECL_RTL (decl);
-      /* Reset DECL_RTL back, as various parts of the compiler expects
-	 DECL_RTL set meaning it is actually going to be output.  */
-      SET_DECL_RTL (decl, NULL);
+      rtl = make_decl_rtl_for_debug (decl);
       if (!MEM_P (rtl)
 	  || GET_CODE (XEXP (rtl, 0)) != SYMBOL_REF
 	  || SYMBOL_REF_DECL (XEXP (rtl, 0)) != decl)
Index: varasm.c
===================================================================
--- varasm.c	(revision 157481)
+++ varasm.c	(working copy)
@@ -1476,6 +1476,35 @@ make_decl_rtl (tree decl)
   if (flag_mudflap && TREE_CODE (decl) == VAR_DECL)
     mudflap_enqueue_decl (decl);
 }
+
+/* Like make_decl_rtl, but inhibit creation of new alias sets when
+   calling make_decl_rtl.  Also, reset DECL_RTL before returning the
+   rtl.  */
+
+rtx
+make_decl_rtl_for_debug (tree decl)
+{
+  unsigned int save_aliasing_flag;
+  rtx rtl;
+
+  /* Kludge alert!  Somewhere down the call chain, make_decl_rtl will
+     call new_alias_set.  If running with -fcompare-debug, sometimes
+     we do not want to create alias sets that will throw the alias
+     numbers off in the comparison dumps.  So... clearing
+     flag_strict_aliasing will keep new_alias_set() from creating a
+     new set.  */
+  save_aliasing_flag = flag_strict_aliasing;
+  flag_strict_aliasing = 0;
+
+  rtl = DECL_RTL (decl);
+  /* Reset DECL_RTL back, as various parts of the compiler expects
+     DECL_RTL set meaning it is actually going to be output.  */
+  SET_DECL_RTL (decl, NULL);
+
+  flag_strict_aliasing = save_aliasing_flag;
+
+  return rtl;
+}
 
 /* Output a string of literal assembler code
    for an `asm' keyword used between functions.  */
Index: output.h
===================================================================
--- output.h	(revision 157481)
+++ output.h	(working copy)
@@ -318,6 +318,10 @@ extern bool initializer_constant_valid_f
    ALIGN is the alignment in bits that may be assumed for the data.  */
 extern void output_constant (tree, unsigned HOST_WIDE_INT, unsigned int);
 
+extern rtx make_decl_rtl_for_debug (tree);
+
+/* End of functions in varasm.c.  */
+
 /* When outputting delayed branch sequences, this rtx holds the
    sequence being output.  It is null when no delayed branch
    sequence is being output, so it can be used as a test in the


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