[AVR] Disable register coalescing to the PTRDISPREGS class
authorDylan McKay <me@dylanmckay.io>
Sat, 1 Jun 2019 12:38:56 +0000 (12:38 +0000)
committerDylan McKay <me@dylanmckay.io>
Sat, 1 Jun 2019 12:38:56 +0000 (12:38 +0000)
commit45eb4c7e55341c0b83a21dedecc092e273795eda
treeb6e59c937d1726830092715a268f93b2783581f6
parente6d1a80370f2e465c5aa61f6ba5f16de513aa393
[AVR] Disable register coalescing to the PTRDISPREGS class

If we would allow register coalescing on PTRDISPREGS class then register
allocator can lock Z register to some virtual register. Larger instructions
requiring a memory acces then fail during the register allocation phase since
there is no available register to hold a pointer if Y register was already
taken for a stack frame. This patch prevents it by keeping Z register
spillable. It does it by not allowing coalescer to lock it.

Original discussion on https://github.com/avr-rust/rust/issues/128.

llvm-svn: 362298
llvm/lib/Target/AVR/AVRRegisterInfo.cpp
llvm/lib/Target/AVR/AVRRegisterInfo.h
llvm/test/CodeGen/AVR/PR37143.ll
llvm/test/CodeGen/AVR/store.ll