Commit 0777fc02 by Uros Bizjak Committed by Uros Bizjak

re PR rtl-optimization/63475 (Postreload CSE propagates aliased memory operand)

	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.

From-SVN: r216217
parent 2a523cfe
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.
2014-10-14 Evgeny Stupachenko <evstupac@gmail.com> 2014-10-14 Evgeny Stupachenko <evstupac@gmail.com>
PR target/63534 PR target/63534
...@@ -2439,6 +2439,7 @@ static int ...@@ -2439,6 +2439,7 @@ static int
true_dependence_1 (const_rtx mem, enum machine_mode mem_mode, rtx mem_addr, true_dependence_1 (const_rtx mem, enum machine_mode mem_mode, rtx mem_addr,
const_rtx x, rtx x_addr, bool mem_canonicalized) const_rtx x, rtx x_addr, bool mem_canonicalized)
{ {
rtx true_mem_addr;
rtx base; rtx base;
int ret; int ret;
...@@ -2458,28 +2459,17 @@ true_dependence_1 (const_rtx mem, enum machine_mode mem_mode, rtx mem_addr, ...@@ -2458,28 +2459,17 @@ true_dependence_1 (const_rtx mem, enum machine_mode mem_mode, rtx mem_addr,
|| MEM_ALIAS_SET (mem) == ALIAS_SET_MEMORY_BARRIER) || MEM_ALIAS_SET (mem) == ALIAS_SET_MEMORY_BARRIER)
return 1; return 1;
if (! x_addr)
x_addr = XEXP (x, 0);
x_addr = get_addr (x_addr);
if (! mem_addr) if (! mem_addr)
{ {
mem_addr = XEXP (mem, 0); mem_addr = XEXP (mem, 0);
if (mem_mode == VOIDmode) if (mem_mode == VOIDmode)
mem_mode = GET_MODE (mem); mem_mode = GET_MODE (mem);
} }
true_mem_addr = get_addr (mem_addr);
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);
}
}
/* Read-only memory is by definition never modified, and therefore can't /* Read-only memory is by definition never modified, and therefore can't
conflict with anything. However, don't assume anything when AND conflict with anything. However, don't assume anything when AND
...@@ -2488,7 +2478,7 @@ true_dependence_1 (const_rtx mem, enum machine_mode mem_mode, rtx mem_addr, ...@@ -2488,7 +2478,7 @@ true_dependence_1 (const_rtx mem, enum machine_mode mem_mode, rtx mem_addr,
stupid user tricks can produce them, so don't die. */ stupid user tricks can produce them, so don't die. */
if (MEM_READONLY_P (x) if (MEM_READONLY_P (x)
&& GET_CODE (x_addr) != AND && GET_CODE (x_addr) != AND
&& GET_CODE (mem_addr) != AND) && GET_CODE (true_mem_addr) != AND)
return 0; return 0;
/* If we have MEMs referring to different address spaces (which can /* If we have MEMs referring to different address spaces (which can
...@@ -2503,14 +2493,14 @@ true_dependence_1 (const_rtx mem, enum machine_mode mem_mode, rtx mem_addr, ...@@ -2503,14 +2493,14 @@ true_dependence_1 (const_rtx mem, enum machine_mode mem_mode, rtx mem_addr,
&& CONSTANT_POOL_ADDRESS_P (base)))) && CONSTANT_POOL_ADDRESS_P (base))))
return 0; return 0;
rtx mem_base = find_base_term (mem_addr); rtx mem_base = find_base_term (true_mem_addr);
if (! base_alias_check (x_addr, base, mem_addr, mem_base, if (! base_alias_check (x_addr, base, true_mem_addr, mem_base,
GET_MODE (x), mem_mode)) GET_MODE (x), mem_mode))
return 0; return 0;
x_addr = canon_rtx (x_addr); x_addr = canon_rtx (x_addr);
if (!mem_canonicalized) 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, if ((ret = memrefs_conflict_p (GET_MODE_SIZE (mem_mode), mem_addr,
SIZE_FOR_MODE (x), x_addr, 0)) != -1) SIZE_FOR_MODE (x), x_addr, 0)) != -1)
...@@ -2560,6 +2550,7 @@ write_dependence_p (const_rtx mem, ...@@ -2560,6 +2550,7 @@ write_dependence_p (const_rtx mem,
bool mem_canonicalized, bool x_canonicalized, bool writep) bool mem_canonicalized, bool x_canonicalized, bool writep)
{ {
rtx mem_addr; rtx mem_addr;
rtx true_mem_addr, true_x_addr;
rtx base; rtx base;
int ret; int ret;
...@@ -2580,30 +2571,20 @@ write_dependence_p (const_rtx mem, ...@@ -2580,30 +2571,20 @@ write_dependence_p (const_rtx mem,
|| MEM_ALIAS_SET (mem) == ALIAS_SET_MEMORY_BARRIER) || MEM_ALIAS_SET (mem) == ALIAS_SET_MEMORY_BARRIER)
return 1; return 1;
mem_addr = XEXP (mem, 0);
if (!x_addr) if (!x_addr)
{ x_addr = XEXP (x, 0);
x_addr = XEXP (x, 0); true_x_addr = get_addr (x_addr);
if (!((GET_CODE (x_addr) == VALUE
&& GET_CODE (mem_addr) != VALUE mem_addr = XEXP (mem, 0);
&& reg_mentioned_p (x_addr, mem_addr)) true_mem_addr = get_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);
}
}
/* A read from read-only memory can't conflict with read-write memory. /* 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 Don't assume anything when AND addresses are involved and leave to
the code below to determine dependence. */ the code below to determine dependence. */
if (!writep if (!writep
&& MEM_READONLY_P (mem) && MEM_READONLY_P (mem)
&& GET_CODE (x_addr) != AND && GET_CODE (true_x_addr) != AND
&& GET_CODE (mem_addr) != AND) && GET_CODE (true_mem_addr) != AND)
return 0; return 0;
/* If we have MEMs referring to different address spaces (which can /* If we have MEMs referring to different address spaces (which can
...@@ -2612,7 +2593,7 @@ write_dependence_p (const_rtx mem, ...@@ -2612,7 +2593,7 @@ write_dependence_p (const_rtx mem,
if (MEM_ADDR_SPACE (mem) != MEM_ADDR_SPACE (x)) if (MEM_ADDR_SPACE (mem) != MEM_ADDR_SPACE (x))
return 1; return 1;
base = find_base_term (mem_addr); base = find_base_term (true_mem_addr);
if (! writep if (! writep
&& base && base
&& (GET_CODE (base) == LABEL_REF && (GET_CODE (base) == LABEL_REF
...@@ -2620,18 +2601,18 @@ write_dependence_p (const_rtx mem, ...@@ -2620,18 +2601,18 @@ write_dependence_p (const_rtx mem,
&& CONSTANT_POOL_ADDRESS_P (base)))) && CONSTANT_POOL_ADDRESS_P (base))))
return 0; return 0;
rtx x_base = find_base_term (x_addr); rtx x_base = find_base_term (true_x_addr);
if (! base_alias_check (x_addr, x_base, mem_addr, base, GET_MODE (x), if (! base_alias_check (true_x_addr, x_base, true_mem_addr, base,
GET_MODE (mem))) GET_MODE (x), GET_MODE (mem)))
return 0; return 0;
if (!x_canonicalized) if (!x_canonicalized)
{ {
x_addr = canon_rtx (x_addr); x_addr = canon_rtx (true_x_addr);
x_mode = GET_MODE (x); x_mode = GET_MODE (x);
} }
if (!mem_canonicalized) 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, if ((ret = memrefs_conflict_p (SIZE_FOR_MODE (mem), mem_addr,
GET_MODE_SIZE (x_mode), x_addr, 0)) != -1) GET_MODE_SIZE (x_mode), x_addr, 0)) != -1)
...@@ -2700,17 +2681,10 @@ may_alias_p (const_rtx mem, const_rtx x) ...@@ -2700,17 +2681,10 @@ may_alias_p (const_rtx mem, const_rtx x)
return 1; return 1;
x_addr = XEXP (x, 0); x_addr = XEXP (x, 0);
x_addr = get_addr (x_addr);
mem_addr = XEXP (mem, 0); mem_addr = XEXP (mem, 0);
if (!((GET_CODE (x_addr) == VALUE mem_addr = get_addr (mem_addr);
&& 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);
}
/* Read-only memory is by definition never modified, and therefore can't /* Read-only memory is by definition never modified, and therefore can't
conflict with anything. However, don't assume anything when AND conflict with anything. However, don't assume anything when AND
...@@ -2734,9 +2708,6 @@ may_alias_p (const_rtx mem, const_rtx x) ...@@ -2734,9 +2708,6 @@ may_alias_p (const_rtx mem, const_rtx x)
GET_MODE (x), GET_MODE (mem_addr))) GET_MODE (x), GET_MODE (mem_addr)))
return 0; return 0;
x_addr = canon_rtx (x_addr);
mem_addr = canon_rtx (mem_addr);
if (nonoverlapping_memrefs_p (mem, x, true)) if (nonoverlapping_memrefs_p (mem, x, true))
return 0; return 0;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment