This is the mail archive of the gcc@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: Really, really const


Hi,

On Fri, 26 Sep 2003, Andrew Haley wrote:

> So, I wonder why gcc reads the memory twice.

At least 3.3.x somewhen looses the notion, that the global object named
'a' is read-only, so the RTL optimizers don't know.  I somewhen created an
ugly hack which adds a 'readonly' flag to the SYMREF representing this
array, so it survives until RTL, and made use of it in the aliasing
machinery.  Let me dig it out ... ah yes, it's below.  (we use it in our
compiler since some time, so it should be reasonable safe, although
especially Ada has some ugly semantics regarding read-only memory).


Ciao,
Michael.

Index: rtl.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/rtl.h,v
retrieving revision 1.374.2.10
diff -u -p -r1.374.2.10 rtl.h
--- gcc/rtl.h	21 Jun 2003 22:47:01 -0000	1.374.2.10
+++ gcc/rtl.h	10 Aug 2003 21:20:12 -0000
@@ -141,7 +141,8 @@ struct rtx_def GTY((chain_next ("RTX_NEX
      In a CODE_LABEL, part of the two-bit alternate entry field.  */
   unsigned int jump : 1;
   /* In a CODE_LABEL, part of the two-bit alternate entry field.
-     1 in a MEM if it cannot trap.  */
+     1 in a MEM if it cannot trap.
+     1 in a SYMBOL_REF which refers to a read-only object.  */
   unsigned int call : 1;
   /* 1 in a REG, MEM, or CONCAT if the value is set at most once, anywhere.
      1 in a SUBREG if it references an unsigned object whose mode has been
@@ -1241,6 +1242,10 @@ do {						\
 /* 1 if RTX is a symbol_ref for a weak symbol.  */
 #define SYMBOL_REF_WEAK(RTX)						\
   (RTL_FLAG_CHECK1("SYMBOL_REF_WEAK", (RTX), SYMBOL_REF)->integrated)
+
+/* 1 if RTX is a symbol_ref for a readonly object.  */
+#define SYMBOL_REF_READONLY(RTX)					\
+  (RTL_FLAG_CHECK1("SYMBOL_REF_READONLY", (RTX), SYMBOL_REF)->call)

 /* Define a macro to look for REG_INC notes,
    but save time on machines where they never exist.  */
Index: alias.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/alias.c,v
retrieving revision 1.180.2.4
diff -u -p -r1.180.2.4 alias.c
--- gcc/alias.c	21 Jun 2003 22:47:00 -0000	1.180.2.4
+++ gcc/alias.c	10 Aug 2003 21:20:12 -0000
@@ -2071,7 +2071,7 @@ true_dependence (mem, mem_mode, x, varie
      int (*varies) PARAMS ((rtx, int));
 {
   rtx x_addr, mem_addr;
-  rtx base;
+  rtx base, mem_base;

   if (MEM_VOLATILE_P (x) && MEM_VOLATILE_P (mem))
     return 1;
@@ -2109,9 +2109,12 @@ true_dependence (mem, mem_mode, x, varie
   mem_addr = get_addr (XEXP (mem, 0));

   base = find_base_term (x_addr);
+  mem_base = find_base_term (mem_addr);
   if (base && (GET_CODE (base) == LABEL_REF
 	       || (GET_CODE (base) == SYMBOL_REF
-		   && CONSTANT_POOL_ADDRESS_P (base))))
+		   && ((SYMBOL_REF_READONLY (base)
+			&& !rtx_equal_p (base, mem_base))
+		       || CONSTANT_POOL_ADDRESS_P (base)))))
     return 0;

   if (! base_alias_check (x_addr, mem_addr, GET_MODE (x), mem_mode))
Index: varasm.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/varasm.c,v
retrieving revision 1.318.2.11
diff -u -p -r1.318.2.11 varasm.c
--- gcc/varasm.c	19 Jul 2003 14:57:43 -0000	1.318.2.11
+++ gcc/varasm.c	10 Aug 2003 21:20:12 -0000
@@ -941,6 +941,8 @@ make_decl_rtl (decl, asmspec)
   SYMBOL_REF_WEAK (XEXP (x, 0)) = DECL_WEAK (decl);
   if (TREE_CODE (decl) != FUNCTION_DECL)
     set_mem_attributes (x, decl, 1);
+  if (RTX_UNCHANGING_P (x))
+    SYMBOL_REF_READONLY (XEXP (x, 0)) = 1;
   SET_DECL_RTL (decl, x);

   /* Optionally set flags or add text to the name to record information
@@ -2731,6 +2733,8 @@ output_constant_def (exp, defer)
 		       gen_rtx_SYMBOL_REF (Pmode, desc->label));

       set_mem_attributes (rtl, exp, 1);
+      if (RTX_UNCHANGING_P (rtl))
+        SYMBOL_REF_READONLY (XEXP (rtl, 0)) = 1;
       set_mem_alias_set (rtl, 0);
       set_mem_alias_set (rtl, const_alias_set);

@@ -3299,6 +3303,7 @@ force_const_mem (mode, x)
   set_mem_alias_set (def, const_alias_set);
   set_mem_attributes (def, (*lang_hooks.types.type_for_mode) (mode, 0), 1);
   RTX_UNCHANGING_P (def) = 1;
+  SYMBOL_REF_READONLY (XEXP (def, 0)) = 1;

   /* Add label to symbol hash table.  */
   hash = SYMHASH (XSTR (XEXP (def, 0), 0));


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