Many Thumb2 instructions can reference the full ARM register set (i.e.,
authorJim Grosbach <grosbach@apple.com>
Fri, 30 Jul 2010 02:41:01 +0000 (02:41 +0000)
committerJim Grosbach <grosbach@apple.com>
Fri, 30 Jul 2010 02:41:01 +0000 (02:41 +0000)
commit6ccfc507dc1f7ad8c8964193a2407264ca644f0d
treeb4787ea45b22034f291c85e70fd1650dc01d7955
parent436ed471cc70f632dbcd1e82cb8e90d2c0f91ccd
Many Thumb2 instructions can reference the full ARM register set (i.e.,
have 4 bits per register in the operand encoding), but have undefined
behavior when the operand value is 13 or 15 (SP and PC, respectively).
The trivial coalescer in linear scan sometimes will merge a copy from
SP into a subsequent instruction which uses the copy, and if that
instruction cannot legally reference SP, we get bad code such as:
  mls r0,r9,r0,sp
instead of:
  mov r2, sp
  mls r0, r9, r0, r2

This patch adds a new register class for use by Thumb2 that excludes
the problematic registers (SP and PC) and is used instead of GPR
for those operands which cannot legally reference PC or SP. The
trivial coalescer explicitly requires that the register class
of the destination for the COPY instruction contain the source
register for the COPY to be considered for coalescing. This prevents
errant instructions like that above.

PR7499

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@109842 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Target/ARM/ARMBaseInstrInfo.cpp
lib/Target/ARM/ARMInstrThumb2.td
lib/Target/ARM/ARMRegisterInfo.td
lib/Target/ARM/Disassembler/ARMDisassemblerCore.cpp
lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h
lib/Target/ARM/Thumb2InstrInfo.cpp
test/CodeGen/Thumb2/2010-04-15-DynAllocBug.ll
test/CodeGen/Thumb2/thumb2-badreg-operands.ll [new file with mode: 0644]
utils/TableGen/EDEmitter.cpp