This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: RTL infrastructure leaks VALUE expressions into aliasing-detecting functions
- From: Uros Bizjak <ubizjak at gmail dot com>
- To: Jeff Law <law at redhat dot com>
- Cc: GCC Development <gcc at gcc dot gnu dot org>
- Date: Fri, 10 Oct 2014 20:12:42 +0200
- Subject: Re: RTL infrastructure leaks VALUE expressions into aliasing-detecting functions
- Authentication-results: sourceware.org; auth=none
- References: <CAFULd4ZJwrxFjcHBDgg=zzztQXxSmA3_OjjmkGhYKfEppZ2cxQ at mail dot gmail dot com> <54381DCA dot 10805 at redhat dot com>
On Fri, Oct 10, 2014 at 7:56 PM, Jeff Law <law@redhat.com> wrote:
> On 10/09/14 06:14, Uros Bizjak wrote:
>>
>> Hello!
>>
>> I'd like to bring PR 63475 to the attention of RTL maintainers. The
>> problem in the referred PR exposed the RTL infrastructure problem,
>> where VALUE expressions are leaked instead of MEM expresions into
>> various parts of aliasing-detecting support functions.
>>
>> As an example, please consider following patch for base_alias_check:
>>
>> --cut here--
>> Index: alias.c
>> ===================================================================
>> --- alias.c (revision 216025)
>> +++ alias.c (working copy)
>> @@ -1824,6 +1824,13 @@ base_alias_check (rtx x, rtx x_base, rtx y, rtx y_
>> if (rtx_equal_p (x_base, y_base))
>> return 1;
>>
>> + if (GET_CODE (x) == VALUE || GET_CODE (y) == VALUE)
>> + {
>> + debug_rtx (x);
>> + debug_rtx (y);
>> + gcc_unreachable ();
>> + }
>> +
>> /* The base addresses are different expressions. If they are not
>> accessed
>> via AND, there is no conflict. We can bring knowledge of object
>> alignment into play here. For example, on alpha, "char a, b;" can
>
> But when base_alias_check returns, we call memrefs_conflict_p which does
> know how to dig down into a VALUE expression.
IIRC, the problem was that base_alias_check returned 0 due to:
/* Differing symbols not accessed via AND never alias. */
if (GET_CODE (x_base) != ADDRESS && GET_CODE (y_base) != ADDRESS)
return 0;
so, the calling code never reached memrefs_conflict_p down the stream.
It might be that targets without AND addresses are immune to this
issue, but the code that deals with ANDs is certailny not prepared to
handle VALUEs.
(The testcase from the PR can be compiled with a crosscompiler to
alpha-linux-gnu, as outlined in the PR. Two AND addresses should be
detected as aliasing, but they are not - resulting in CSE propagating
aliased read after store in (insn 29).)
Uros.