This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: Missed optimization in PRE?
On Wed, Apr 11, 2012 at 5:09 PM, Richard Guenther
<richard.guenther@gmail.com> wrote:
> On Wed, Apr 11, 2012 at 10:05 AM, Bin.Cheng <amker.cheng@gmail.com> wrote:
>> On Wed, Apr 11, 2012 at 11:28 AM, Bin.Cheng <amker.cheng@gmail.com> wrote:
>>
>> Turns out if-conversion checks whether gimple statement traps or not.
>> For the statement "d0_6 = d[D.5150_5];", it assumes rhs might trap,
>> because it sees the index not INTEGER_CST.
>
> Yes. ?After sinking the load is no longer executed unconditionally but
> if-conversion would make it so. ?This is information loss caused by
> sinking.
>
>> Two questions:
>> 1, The check can be enhanced in gimple_could_trap_p_1 for ARRAY_REF.
>
> No, the index may be out-of-bounds.
Apart from this topic. Actually I mean we can do more bound check
rather than assume
out-of-bounds if the index is not CST.
For this example, the source code is like:
#define N 32
int a[N], b[N];
int d[N], e[N];
int k[N];
__attribute__((noinline, noclone)) void
f4 (void)
{
int i;
for (i = 0; i < N/2; ++i)
{
int d0 = d[2*i], e0 = e[2*i];
int d1 = d[2*i+1], e1 = e[2*i+1];
k[2*i] = a[2*i] >= b[2*i] ? d0 : e0;
k[2*i+1] = a[2*i+1] >= b[2*i+1] ? d1 : e1;
}
}
The load "d[2*i+1]" is never out-of-bound, right?
>
>> 2, Should I check this before sinking load from memory? If yes, then why sink of
>> store does not do such check?
>
> Sinking is never a problem - the code will only be executed less times. ?The
> issue with if-conversion is that it speculates the loads / stores, so they may
> not trap if they were originally not executed.
>
> So this is a pass ordering issue - sinking and if-conversion have different
> conflicting goals. ?Btw, you also make RTL if-conversion harder. ?I suppose
Yes, I have already found a case resulting in bad basic block ordering
at RTL level,
though not sure it RTL if-conversion related.
> you should try to avoid messing up if-conversion possibilities so early,
> thus, not sink in these cases. ?The same issue is present
> for non-loads that are possibly trapping. ?So I'm not even sure we can easily
> detect these cases - apart from never sinking possibly trapping stmts.
>
> At least you could say that the side-effect of trapping has to be preserved
> (note that we do not generally do that, which you might consider a bug).
Understood. I have already tested to not sink possibly trapping stmt, but not
sure whether this is still wanted in GCC.
Thanks.
--
Best Regards.