[llvm-dev] [A bug?] Failed to use BuildMI to add R7 - R12 registers for tADDi8 and tPUSH of ARM

Jie Zhou via llvm-dev llvm-dev at lists.llvm.org
Sun Apr 14 11:17:47 PDT 2019

Hi all,

I’m trying to insert some add/sub and push/pop instructions in a MachineFunction pass for ARMv7-M. However, I encountered something weird.
For an add, when I use 

	BuildMI(….., TII->get(ARM::tADDi8), reg).addReg(reg).addReg(reg).addImm(imm).

if reg is R0 - R7, everything is fine: I would get something like

	adds r1, 4

But if I use R8 - R12 as the reg in the BuildMI, I wouldn’t get the correct register in the assembly code. For example, when I pass R8 to it, I would get 

	adds r0, 4

rather than

	adds r8, 4.

Similar problems happen to push and pop instructions. I can create a push/pop if the register list only contains registers R0 - R7, but
for registers whose number are greater than R7, the generated asm code doesn’t have it. For example, 

	BuildMI(……, TII->get(ARM::tPUSH), R8)…..

would give me 

	push {}

Is this a bug in the LLVM ARM code generator? Or is there a reason why we cannot use big-number registers for add/sub and push/pop? 

- Jie

More information about the llvm-dev mailing list