diff mbox

[4.9,RFA,RTL-optimization] : Backport recent AND-alignment alias fixes to 4.9 branch

Message ID CAFULd4YNhHZEEj0i_cawZCQ0pkkOVsT1U=yzhOHHFxQPjRAT6w@mail.gmail.com
State New
Headers show

Commit Message

Uros Bizjak Oct. 30, 2014, 10:38 a.m. UTC
Hello!

I would like to backport recent alias fixes to correctly handle memory
references with AND-alignment to 4.9 branch. These patches fix
hundreds of failures in gfortran testsuite on alpha-linux-gnu due to
invalid aliasing of AND-aligned memory references of two QImode flags.

These patches were baking for a couple of weeks in the mainline
without problems. Modulo removal of old and unnecessary functionality,
these changes affect only alpha target.

2014-10-30  Uros Bizjak  <ubizjak@gmail.com>

    Backport from mainline:
    2014-10-20  Uros Bizjak  <ubizjak@gmail.com>

    * varasm.c (const_alias_set): Remove.
    (init_varasm_once): Remove initialization of const_alias_set.
    (build_constant_desc): Do not set alias set to const_alias_set.

    Backport from mainline:
    2014-10-14  Uros Bizjak  <ubizjak@gmail.com>

    PR rtl-optimization/63475
    * alias.c (true_dependence_1): Always use get_addr to extract
    true address operands from x_addr and mem_addr.  Use extracted
    address operands to check for references with alignment ANDs.
    Use extracted address operands with find_base_term and
    base_alias_check. For noncanonicalized operands call canon_rtx with
    extracted address operand.
    (write_dependence_1): Ditto.
    (may_alias_p): Ditto.  Remove unused calls to canon_rtx.

    Backport from mainline:
    2014-10-10  Uros Bizjak  <ubizjak@gmail.com>

    PR rtl-optimization/63483
    * alias.c (true_dependence_1): Do not exit early for MEM_READONLY_P
    references when alignment ANDs are involved.
    (write_dependence_p): Ditto.
    (may_alias_p): Ditto.

The complete backport was tested on alpha-linux-gnu,
alphaev68-linux-gnu and x86_64-linux-gnu on 4.9 branch.

OK for branch?

Uros.

Comments

Uros Bizjak Nov. 5, 2014, 7:53 a.m. UTC | #1
Ping for [1], quoted below.

[1] https://gcc.gnu.org/ml/gcc-patches/2014-10/msg03189.html

Thanks,
Uros.

On Thu, Oct 30, 2014 at 11:38 AM, Uros Bizjak <ubizjak@gmail.com> wrote:
> Hello!
>
> I would like to backport recent alias fixes to correctly handle memory
> references with AND-alignment to 4.9 branch. These patches fix
> hundreds of failures in gfortran testsuite on alpha-linux-gnu due to
> invalid aliasing of AND-aligned memory references of two QImode flags.
>
> These patches were baking for a couple of weeks in the mainline
> without problems. Modulo removal of old and unnecessary functionality,
> these changes affect only alpha target.
>
> 2014-10-30  Uros Bizjak  <ubizjak@gmail.com>
>
>     Backport from mainline:
>     2014-10-20  Uros Bizjak  <ubizjak@gmail.com>
>
>     * varasm.c (const_alias_set): Remove.
>     (init_varasm_once): Remove initialization of const_alias_set.
>     (build_constant_desc): Do not set alias set to const_alias_set.
>
>     Backport from mainline:
>     2014-10-14  Uros Bizjak  <ubizjak@gmail.com>
>
>     PR rtl-optimization/63475
>     * alias.c (true_dependence_1): Always use get_addr to extract
>     true address operands from x_addr and mem_addr.  Use extracted
>     address operands to check for references with alignment ANDs.
>     Use extracted address operands with find_base_term and
>     base_alias_check. For noncanonicalized operands call canon_rtx with
>     extracted address operand.
>     (write_dependence_1): Ditto.
>     (may_alias_p): Ditto.  Remove unused calls to canon_rtx.
>
>     Backport from mainline:
>     2014-10-10  Uros Bizjak  <ubizjak@gmail.com>
>
>     PR rtl-optimization/63483
>     * alias.c (true_dependence_1): Do not exit early for MEM_READONLY_P
>     references when alignment ANDs are involved.
>     (write_dependence_p): Ditto.
>     (may_alias_p): Ditto.
>
> The complete backport was tested on alpha-linux-gnu,
> alphaev68-linux-gnu and x86_64-linux-gnu on 4.9 branch.
>
> OK for branch?
>
> Uros.
Richard Biener Nov. 5, 2014, 11:31 a.m. UTC | #2
On Wed, 5 Nov 2014, Uros Bizjak wrote:

> Ping for [1], quoted below.

Ok.

Thanks,
Richard.

> [1] https://gcc.gnu.org/ml/gcc-patches/2014-10/msg03189.html
> 
> Thanks,
> Uros.
> 
> On Thu, Oct 30, 2014 at 11:38 AM, Uros Bizjak <ubizjak@gmail.com> wrote:
> > Hello!
> >
> > I would like to backport recent alias fixes to correctly handle memory
> > references with AND-alignment to 4.9 branch. These patches fix
> > hundreds of failures in gfortran testsuite on alpha-linux-gnu due to
> > invalid aliasing of AND-aligned memory references of two QImode flags.
> >
> > These patches were baking for a couple of weeks in the mainline
> > without problems. Modulo removal of old and unnecessary functionality,
> > these changes affect only alpha target.
> >
> > 2014-10-30  Uros Bizjak  <ubizjak@gmail.com>
> >
> >     Backport from mainline:
> >     2014-10-20  Uros Bizjak  <ubizjak@gmail.com>
> >
> >     * varasm.c (const_alias_set): Remove.
> >     (init_varasm_once): Remove initialization of const_alias_set.
> >     (build_constant_desc): Do not set alias set to const_alias_set.
> >
> >     Backport from mainline:
> >     2014-10-14  Uros Bizjak  <ubizjak@gmail.com>
> >
> >     PR rtl-optimization/63475
> >     * alias.c (true_dependence_1): Always use get_addr to extract
> >     true address operands from x_addr and mem_addr.  Use extracted
> >     address operands to check for references with alignment ANDs.
> >     Use extracted address operands with find_base_term and
> >     base_alias_check. For noncanonicalized operands call canon_rtx with
> >     extracted address operand.
> >     (write_dependence_1): Ditto.
> >     (may_alias_p): Ditto.  Remove unused calls to canon_rtx.
> >
> >     Backport from mainline:
> >     2014-10-10  Uros Bizjak  <ubizjak@gmail.com>
> >
> >     PR rtl-optimization/63483
> >     * alias.c (true_dependence_1): Do not exit early for MEM_READONLY_P
> >     references when alignment ANDs are involved.
> >     (write_dependence_p): Ditto.
> >     (may_alias_p): Ditto.
> >
> > The complete backport was tested on alpha-linux-gnu,
> > alphaev68-linux-gnu and x86_64-linux-gnu on 4.9 branch.
> >
> > OK for branch?
> >
> > Uros.
> 
>
diff mbox

Patch

Index: alias.c
===================================================================
--- alias.c	(revision 216914)
+++ alias.c	(working copy)
@@ -2517,6 +2517,7 @@  static int
 true_dependence_1 (const_rtx mem, enum machine_mode mem_mode, rtx mem_addr,
 		   const_rtx x, rtx x_addr, bool mem_canonicalized)
 {
+  rtx true_mem_addr;
   rtx base;
   int ret;
 
@@ -2536,10 +2537,26 @@  true_dependence_1 (const_rtx mem, enum machine_mod
       || MEM_ALIAS_SET (mem) == ALIAS_SET_MEMORY_BARRIER)
     return 1;
 
+  if (! x_addr)
+    x_addr = XEXP (x, 0);
+  x_addr = get_addr (x_addr);
+
+  if (! mem_addr)
+    {
+      mem_addr = XEXP (mem, 0);
+      if (mem_mode == VOIDmode)
+	mem_mode = GET_MODE (mem);
+    }
+  true_mem_addr = get_addr (mem_addr);
+
   /* Read-only memory is by definition never modified, and therefore can't
-     conflict with anything.  We don't expect to find read-only set on MEM,
-     but stupid user tricks can produce them, so don't die.  */
-  if (MEM_READONLY_P (x))
+     conflict with anything.  However, don't assume anything when AND
+     addresses are involved and leave to the code below to determine
+     dependence.  We don't expect to find read-only set on MEM, but
+     stupid user tricks can produce them, so don't die.  */
+  if (MEM_READONLY_P (x)
+      && GET_CODE (x_addr) != AND
+      && GET_CODE (true_mem_addr) != AND)
     return 0;
 
   /* If we have MEMs referring to different address spaces (which can
@@ -2548,29 +2565,6 @@  true_dependence_1 (const_rtx mem, enum machine_mod
   if (MEM_ADDR_SPACE (mem) != MEM_ADDR_SPACE (x))
     return 1;
 
-  if (! mem_addr)
-    {
-      mem_addr = XEXP (mem, 0);
-      if (mem_mode == VOIDmode)
-	mem_mode = GET_MODE (mem);
-    }
-
-  if (! x_addr)
-    {
-      x_addr = XEXP (x, 0);
-      if (!((GET_CODE (x_addr) == VALUE
-	     && GET_CODE (mem_addr) != VALUE
-	     && reg_mentioned_p (x_addr, mem_addr))
-	    || (GET_CODE (x_addr) != VALUE
-		&& GET_CODE (mem_addr) == VALUE
-		&& reg_mentioned_p (mem_addr, x_addr))))
-	{
-	  x_addr = get_addr (x_addr);
-	  if (! mem_canonicalized)
-	    mem_addr = get_addr (mem_addr);
-	}
-    }
-
   base = find_base_term (x_addr);
   if (base && (GET_CODE (base) == LABEL_REF
 	       || (GET_CODE (base) == SYMBOL_REF
@@ -2577,14 +2571,14 @@  true_dependence_1 (const_rtx mem, enum machine_mod
 		   && CONSTANT_POOL_ADDRESS_P (base))))
     return 0;
 
-  rtx mem_base = find_base_term (mem_addr);
-  if (! base_alias_check (x_addr, base, mem_addr, mem_base,
+  rtx mem_base = find_base_term (true_mem_addr);
+  if (! base_alias_check (x_addr, base, true_mem_addr, mem_base,
 			  GET_MODE (x), mem_mode))
     return 0;
 
   x_addr = canon_rtx (x_addr);
   if (!mem_canonicalized)
-    mem_addr = canon_rtx (mem_addr);
+    mem_addr = canon_rtx (true_mem_addr);
 
   if ((ret = memrefs_conflict_p (GET_MODE_SIZE (mem_mode), mem_addr,
 				 SIZE_FOR_MODE (x), x_addr, 0)) != -1)
@@ -2637,6 +2631,7 @@  write_dependence_p (const_rtx mem,
 		    bool mem_canonicalized, bool x_canonicalized, bool writep)
 {
   rtx mem_addr;
+  rtx true_mem_addr, true_x_addr;
   rtx base;
   int ret;
 
@@ -2657,8 +2652,20 @@  write_dependence_p (const_rtx mem,
       || MEM_ALIAS_SET (mem) == ALIAS_SET_MEMORY_BARRIER)
     return 1;
 
-  /* A read from read-only memory can't conflict with read-write memory.  */
-  if (!writep && MEM_READONLY_P (mem))
+  if (!x_addr)
+    x_addr = XEXP (x, 0);
+  true_x_addr = get_addr (x_addr);
+
+  mem_addr = XEXP (mem, 0);
+  true_mem_addr = get_addr (mem_addr);
+
+  /* A read from read-only memory can't conflict with read-write memory.
+     Don't assume anything when AND addresses are involved and leave to
+     the code below to determine dependence.  */
+  if (!writep
+      && MEM_READONLY_P (mem)
+      && GET_CODE (true_x_addr) != AND
+      && GET_CODE (true_mem_addr) != AND)
     return 0;
 
   /* If we have MEMs referring to different address spaces (which can
@@ -2667,24 +2674,7 @@  write_dependence_p (const_rtx mem,
   if (MEM_ADDR_SPACE (mem) != MEM_ADDR_SPACE (x))
     return 1;
 
-  mem_addr = XEXP (mem, 0);
-  if (!x_addr)
-    {
-      x_addr = XEXP (x, 0);
-      if (!((GET_CODE (x_addr) == VALUE
-	     && GET_CODE (mem_addr) != VALUE
-	     && reg_mentioned_p (x_addr, mem_addr))
-	    || (GET_CODE (x_addr) != VALUE
-		&& GET_CODE (mem_addr) == VALUE
-		&& reg_mentioned_p (mem_addr, x_addr))))
-	{
-	  x_addr = get_addr (x_addr);
-	  if (!mem_canonicalized)
-	    mem_addr = get_addr (mem_addr);
-	}
-    }
-
-  base = find_base_term (mem_addr);
+  base = find_base_term (true_mem_addr);
   if (! writep
       && base
       && (GET_CODE (base) == LABEL_REF
@@ -2692,18 +2682,18 @@  write_dependence_p (const_rtx mem,
 	      && CONSTANT_POOL_ADDRESS_P (base))))
     return 0;
 
-  rtx x_base = find_base_term (x_addr);
-  if (! base_alias_check (x_addr, x_base, mem_addr, base, GET_MODE (x),
-			  GET_MODE (mem)))
+  rtx x_base = find_base_term (true_x_addr);
+  if (! base_alias_check (true_x_addr, x_base, true_mem_addr, base,
+			  GET_MODE (x), GET_MODE (mem)))
     return 0;
 
   if (!x_canonicalized)
     {
-      x_addr = canon_rtx (x_addr);
+      x_addr = canon_rtx (true_x_addr);
       x_mode = GET_MODE (x);
     }
   if (!mem_canonicalized)
-    mem_addr = canon_rtx (mem_addr);
+    mem_addr = canon_rtx (true_mem_addr);
 
   if ((ret = memrefs_conflict_p (SIZE_FOR_MODE (mem), mem_addr,
 				 GET_MODE_SIZE (x_mode), x_addr, 0)) != -1)
@@ -2771,10 +2761,20 @@  may_alias_p (const_rtx mem, const_rtx x)
       || MEM_ALIAS_SET (mem) == ALIAS_SET_MEMORY_BARRIER)
     return 1;
 
+  x_addr = XEXP (x, 0);
+  x_addr = get_addr (x_addr);
+
+  mem_addr = XEXP (mem, 0);
+  mem_addr = get_addr (mem_addr);
+
   /* Read-only memory is by definition never modified, and therefore can't
-     conflict with anything.  We don't expect to find read-only set on MEM,
-     but stupid user tricks can produce them, so don't die.  */
-  if (MEM_READONLY_P (x))
+     conflict with anything.  However, don't assume anything when AND
+     addresses are involved and leave to the code below to determine
+     dependence.  We don't expect to find read-only set on MEM, but
+     stupid user tricks can produce them, so don't die.  */
+  if (MEM_READONLY_P (x)
+      && GET_CODE (x_addr) != AND
+      && GET_CODE (mem_addr) != AND)
     return 0;
 
   /* If we have MEMs referring to different address spaces (which can
@@ -2783,19 +2783,6 @@  may_alias_p (const_rtx mem, const_rtx x)
   if (MEM_ADDR_SPACE (mem) != MEM_ADDR_SPACE (x))
     return 1;
 
-  x_addr = XEXP (x, 0);
-  mem_addr = XEXP (mem, 0);
-  if (!((GET_CODE (x_addr) == VALUE
-	 && GET_CODE (mem_addr) != VALUE
-	 && reg_mentioned_p (x_addr, mem_addr))
-	|| (GET_CODE (x_addr) != VALUE
-	    && GET_CODE (mem_addr) == VALUE
-	    && reg_mentioned_p (mem_addr, x_addr))))
-    {
-      x_addr = get_addr (x_addr);
-      mem_addr = get_addr (mem_addr);
-    }
-
   rtx x_base = find_base_term (x_addr);
   rtx mem_base = find_base_term (mem_addr);
   if (! base_alias_check (x_addr, x_base, mem_addr, mem_base,
@@ -2802,9 +2789,6 @@  may_alias_p (const_rtx mem, const_rtx x)
 			  GET_MODE (x), GET_MODE (mem_addr)))
     return 0;
 
-  x_addr = canon_rtx (x_addr);
-  mem_addr = canon_rtx (mem_addr);
-
   if (nonoverlapping_memrefs_p (mem, x, true))
     return 0;
 
Index: varasm.c
===================================================================
--- varasm.c	(revision 216914)
+++ varasm.c	(working copy)
@@ -95,11 +95,6 @@  tree last_assemble_variable_decl;
 
 bool first_function_block_is_cold;
 
-/* We give all constants their own alias set.  Perhaps redundant with
-   MEM_READONLY_P, but pre-dates it.  */
-
-static alias_set_type const_alias_set;
-
 /* Whether we saw any functions with no_split_stack.  */
 
 static bool saw_no_split_stack;
@@ -3250,7 +3245,6 @@  build_constant_desc (tree exp)
   rtl = gen_const_mem (TYPE_MODE (TREE_TYPE (exp)), symbol);
   set_mem_attributes (rtl, exp, 1);
   set_mem_alias_set (rtl, 0);
-  set_mem_alias_set (rtl, const_alias_set);
 
   /* We cannot share RTX'es in pool entries.
      Mark this piece of RTL as required for unsharing.  */
@@ -5957,7 +5951,6 @@  init_varasm_once (void)
   const_desc_htab = htab_create_ggc (1009, const_desc_hash,
 				     const_desc_eq, NULL);
 
-  const_alias_set = new_alias_set ();
   shared_constant_pool = create_constant_pool ();
 
 #ifdef TEXT_SECTION_ASM_OP