Is this FE bug or am I missing something?
Marc Glisse
marc.glisse@inria.fr
Tue Sep 13 11:41:00 GMT 2016
On Mon, 12 Sep 2016, Igor Shevlyakov wrote:
> Well, my concern is not what happens with overflow (which in second
> case -fsanitize=undefined will address), but rather consistency of
> that 2 cases.
>
> p[x+1] generates RTL which leads to better generated code at the
> expense of leading to overflow, while p[1+x] never overflows but leads
> to worse code.
> It would be beneficial to make the behaviour consistent between those 2 cases.
True. Your example with undefined behavior confused me as to what your
point was.
For
int* f1(int* p, int x) { return &p[x + 1]; }
int* f2(int* p, int x) { return &p[1 + x]; }
we get in the gimple dump
_1 = (sizetype) x;
_2 = _1 + 1;
vs
_1 = x + 1;
_2 = (long unsigned int) _1;
The second one is a better starting point (it has more information about
potential overflow), but the first one has the advantage that all numbers
have the same size, which saves an instruction in the end
movslq %esi, %rsi
leaq 4(%rdi,%rsi,4), %rax
vs
addl $1, %esi
movslq %esi, %rsi
leaq (%rdi,%rsi,4), %rax
We regularly discuss the potential benefits of a pass that would try to
uniformize integer sizes...
In the mean time, I agree that gimplifying x+1 and 1+x differently makes
little sense, you could file a PR about that.
--
Marc Glisse
More information about the Gcc
mailing list