On Thu, Oct 19, 2017 at 08:03:45PM -0600, Sandra Loosemore wrote:
> A harder problem is that doing the high/lo_sum splitting in expand
> inhibits subsequent optimizations. One such problem arises when you
> have accesses to multiple fields in a static structure object. Expand
> sees this as many (symbol + offset) expressions involving the same
> symbol with different constant offsets. What we should be doing in
> that case is CSE'ing the symbol address computation rather than
> splitting every such expression individually.
Do you have the needed relocations for that though?
If not, then you need to do:
tmp = high (symbol);
tmp |= lo_sum (symbol); // or +
a = [tmp + 0];
b = [tmp + 4];
c = [tmp + 8];
if you do (like e.g. sparc64 has the %olo relocation), then you can do
tmp = high (symbol);
a = [tmp + lo_sum (symbol) + 0];
b = [tmp + lo_sum (symbol) + 4];
c = [tmp + lo_sum (symbol) + 8];
If you tried to do:
tmp = high (symbol);
a = [tmp + lo_sum (symbol)];
b = [tmp + lo_sum (symbol + 4)];
c = [tmp + lo_sum (symbol + 8)];
then this would break if lo_sum (symbol + 4) or lo_sum (symbol + 8)
is < 4.
Jakub