PIC16: Out of Data Space - Make use all available banks
Consecutive direct accesses to variables in the same bank will be faster than direct accesses to variables in different banks.  Consequently, the compiler is probably trying to consolidate variables which are accessed near each other so they'll be placed in the same bank.  Unfortunately, it may be attempting to consolidate more variables than will actually fit into a bank.

I'm not familiar with the particular compiler you're using; on some compilers, variables will only be consolidated if their primary (non-extern) definition is in the same source file.  Moving some arrays to separately-compiled source files may prevent the compiler from trying to consolidate them.  Alternatively, it may be helpful to have some arrays which are only accessed by routines that are used especially for that purpose.  For example, have a source file that's something like:

static unsigned short foo[32];

unsigned short get_foo(unsigned char addr)
{
  return foo[addr];
}
void put_foo(unsigned char addr, unsigned short value)
{
  foo[addr] = value;
}


Note that if you use this approach, you may be able to work with arrays that are too large to fit in a single page, using something like:

static unsigned short foo0[32],foo1[32];

unsigned short get_foo(unsigned char addr)
{
  if (addr &amp; 32)
    return foo0[addr];
  else
    return foo1[addr-32];
}
void put_foo(unsigned char addr, unsigned short value)
{
  if (addr &amp; 32)
    foo0[addr] = value;
  else
    foo1[addr-32] = value;
}


Such things aren't beautiful, but they may save code compared to some of the other techniques that would otherwise be necessary.