RTL infrastructure leaks VALUE expressions into aliasing-detecting functions
Jeff Law
law@redhat.com
Fri Oct 10 18:18:00 GMT 2014
On 10/10/14 12:12, Uros Bizjak wrote:
> 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.
Right. And my question is what happens if we aren't as aggressive here.
What happens if before this check we return nonzero if X or Y is a
VALUE? Do we then get into memrefs_conflict_p and does it do the right
thing?
>
> 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).)
Yea, but I'm slammed right now and won't be able to look at it under a
debugger for a while.
jeff
More information about the Gcc
mailing list