* [4.9 RFA PATCH, RTL-optimization]: Backport recent AND-alignment alias fixes to 4.9 branch
@ 2014-10-30 10:52 Uros Bizjak
2014-11-05 7:53 ` Uros Bizjak
0 siblings, 1 reply; 3+ messages in thread
From: Uros Bizjak @ 2014-10-30 10:52 UTC (permalink / raw)
To: gcc-patches; +Cc: Jakub Jelinek, Richard Biener, Jeff Law
[-- Attachment #1: Type: text/plain, Size: 1745 bytes --]
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.
[-- Attachment #2: alias-49.diff.txt --]
[-- Type: text/plain, Size: 8429 bytes --]
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
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [4.9 RFA PATCH, RTL-optimization]: Backport recent AND-alignment alias fixes to 4.9 branch
2014-10-30 10:52 [4.9 RFA PATCH, RTL-optimization]: Backport recent AND-alignment alias fixes to 4.9 branch Uros Bizjak
@ 2014-11-05 7:53 ` Uros Bizjak
2014-11-05 11:36 ` Richard Biener
0 siblings, 1 reply; 3+ messages in thread
From: Uros Bizjak @ 2014-11-05 7:53 UTC (permalink / raw)
To: gcc-patches; +Cc: Jakub Jelinek, Richard Biener, Jeff Law
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.
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [4.9 RFA PATCH, RTL-optimization]: Backport recent AND-alignment alias fixes to 4.9 branch
2014-11-05 7:53 ` Uros Bizjak
@ 2014-11-05 11:36 ` Richard Biener
0 siblings, 0 replies; 3+ messages in thread
From: Richard Biener @ 2014-11-05 11:36 UTC (permalink / raw)
To: Uros Bizjak; +Cc: gcc-patches, Jakub Jelinek, Jeff Law
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.
>
>
--
Richard Biener <rguenther@suse.de>
SUSE LINUX GmbH, GF: Jeff Hawn, Jennifer Guild, Felix Imendoerffer, HRB 21284
(AG Nuernberg)
Maxfeldstrasse 5, 90409 Nuernberg, Germany
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2014-11-05 11:36 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-10-30 10:52 [4.9 RFA PATCH, RTL-optimization]: Backport recent AND-alignment alias fixes to 4.9 branch Uros Bizjak
2014-11-05 7:53 ` Uros Bizjak
2014-11-05 11:36 ` Richard Biener
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).