This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH/AARCH64] Fix register cost for moving to/from stack registers


While writing the Thunder tunings, I got an internal compiler error
while building glibc.  The reduced testcase is:
  typedef unsigned int size_t;
  typedef unsigned int wchar_t;
  extern __thread int __libc_errno;
  extern __thread int *  t;
  int _IO_vfprintf_internal (char *string, char *workend, char *f) {
    int save_errno = __libc_errno;
   do
   {
       int prec = (workend - string);
       string = (char *) __strerror_r (save_errno);
 if ( *t == 1)
 {
 size_t ignore_size = (unsigned) prec > 1024 ? 1024 : prec;
 wchar_t ignore[ignore_size];
 const char *str2 = string;
 const char *strend = string + prec;
 int ps;
 while (str2 != ((void *)0) && str2 < strend)
__mbsnrtowcs (ignore, &str2 ,&ps) ;
 }
     }
   while (*f != '\0');
}
----  CUT ---
I changed the cost of moving between two neon registers (FP_REGS
register class) to be the same as the cost of moving between a
GENERAL_REGS and a FP_REGS class. This caused the cost of moving
between the STACK_REG and FP_REGS being the same FP_REGS and
GENERAL_REGS which is incorrect as it has to go through a
GENERAL_REGS.

This patch fixes the problem by changing the cost of the move between
STACK_REG and FP_REGS to the cost of moving via a GENERAL_REGS.

OK? Built and tested on aarch64-elf with no regressions.

Thanks,
Andrew Pinski

ChangeLog:
* config/aarch64/aarch64.c (aarch64_register_move_cost): Correct cost
of moving from/to the STACK_REG register class.

Attachment: fixregistercost.diff.txt
Description: Text document


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]