https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81907
Michail <m.kashkarov at partner dot samsung.com> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |m.kashkarov at partner dot
samsung
| |.com
--- Comment #16 from Michail <m.kashkarov at partner dot samsung.com> ---
> Agreed, but, I'm just wondering why it has diffrent behavior according by
> GCC version with -Os. (It should be same result if the choice is made by
> their instructions and costs)
I think that for this example GCC 7 generates memset() call after changes in
tree-ssa-dse
https://gcc.gnu.org/viewcvs/gcc?limit_changes=0&view=revision&revision=244442
(tuning is the same)
for reduced test:
$ cat memset_test_reduced.c
long long func1( long long *pl)
{
long long r = 0;
for(int i=0; i<2; i++)
r += ( long long ) pl[i];
return r;
}
long long test_func(void)
{
long long x[2] = {0};
x[0] = 3;
x[1] = 4;
return func1(x);
}
compiled with:
gcc -S memset_test_reduced.c -g -mabi=aapcs -fno-function-sections -Wall
-mfloat-abi=soft -Os -mtune=cortex-a9 -fdump-tree-all
Difference between GIMPLE produced by gcc-6.4.1 and gcc-7.2.1 is that gcc-7
optimized out "x = {};" in first DSE pass:
diff -u 6.4.1/memset_test_reduced.c.210t.optimized
7.2.1/memset_test_reduced.c.227t.optimized
...
test_func ()
{
long long int x[2];
- long long int _5;
+ long long int _4;
- <bb 2>:
==============
- x = {};
==============
+ <bb 2> [100.00%]:
x[0] = 3;
x[1] = 4;
- _5 = func1 (&x);
+ _4 = func1 (&x);
x ={v} {CLOBBER};
- return _5;
+ return _4;
}
Gcc-6 keeps it and transforms in memset() (according to tune options?) after
all.