riscv64 dep. computation
Jim Wilson
jimw@sifive.com
Thu Feb 14 18:56:00 GMT 2019
On 2/14/19 3:13 AM, Paulo Matos wrote:
> If I compile this with -O2, sched1 groups all loads and all stores
> together. That's perfect. However, if I change TYPE to unsigned char and
> recompile, the stores and loads are interleaved.
>
> Further investigation shows that for unsigned char there are extra
> dependencies that block the scheduler from grouping stores and loads.
The ISO C standard says that anything can be casted to char *, and char
* can be casted to anything. Hence, a char * pointer aliases everything.
If you look at the alias set info in the MEMs, you can see that the char
* references are in alias set 0, which means that they alias everything.
The short * references are in alias set 2 which means they only alias
other stuff in alias set 2. The difference here is that short * does
not alias the structure pointers, but char * does. I haven't tried
debugging your example, but this is presumably where the difference
comes from.
Because x and y are pointer parameters, the compiler must assume that
they might alias. And because char * aliases everything, the char
references alias them too. If you change x and y to global variables,
then they no longer alias each other, and the compiler will schedule all
of the loads first, even for char.
Jim
More information about the Gcc
mailing list