[AVR] Fix expansion of NEGW
authorAyke van Laethem <aykevanlaethem@gmail.com>
Sun, 21 Feb 2021 00:23:02 +0000 (01:23 +0100)
committerAyke van Laethem <aykevanlaethem@gmail.com>
Wed, 3 Mar 2021 14:36:05 +0000 (15:36 +0100)
commitbbfef8ac952bffb01a7a471a2953cbda77231054
tree70ee3d37c6c4a0aa5fb96eae7970b37c23cd044f
parent4f6d7985d47abd35b657dbc7195c93892726d5f4
[AVR] Fix expansion of NEGW

The previous expansion used SBCI, which is incorrect because the NEGW
pseudo instruction accepts a DREGS operand (2xGPR8) and SBCI only allows
LD8 registers. One solution could be to correct the NEGW pseudo
instruction, but another solution is to use a different instruction
(sbc) that does accept a GPR8 register and therefore allows more freedom
to the register allocator.

The output now matches avr-gcc for the following code:

    int foo(int n) {
        return -n;
    }

I've found this issue using the machine instruction verifier: it was
complaining about the wrong register class in NEGWRd.mir.

Differential Revision: https://reviews.llvm.org/D97131
llvm/lib/Target/AVR/AVRExpandPseudoInsts.cpp
llvm/lib/Target/AVR/AVRInstrInfo.td
llvm/test/CodeGen/AVR/neg.ll
llvm/test/CodeGen/AVR/pseudo/NEGWRd.mir