[AArch64] Adds SUBS and ADDS instructions to the MIPeepholeOpt.
authorMicah Weston <micahsweston@gmail.com>
Sat, 19 Feb 2022 15:35:53 +0000 (15:35 +0000)
committerDavid Green <david.green@arm.com>
Sat, 19 Feb 2022 15:35:53 +0000 (15:35 +0000)
commitc69af70f02f200c1c443cbd8f43b1bc9fb59cced
tree43ce9efdce9629e51012f3a6d64965112ce56718
parentb8801ba0503936bd42e6d16e291bf66209323723
[AArch64] Adds SUBS and ADDS instructions to the MIPeepholeOpt.

Implements ADDS/SUBS 24-bit immediate optimization using the
MIPeepholeOpt pass. This follows the pattern:

Optimize ([adds|subs] r, imm) -> ([ADDS|SUBS] ([ADD|SUB] r, #imm0, lsl #12), #imm1),
if imm == (imm0<<12)+imm1. and both imm0 and imm1 are non-zero 12-bit unsigned
integers.

Optimize ([adds|subs] r, imm) -> ([SUBS|ADDS] ([SUB|ADD] r, #imm0, lsl #12), #imm1),
if imm == -(imm0<<12)-imm1, and both imm0 and imm1 are non-zero 12-bit unsigned
integers.

The SplitAndOpcFunc type had to change the return type to an Opcode pair so that
the first add/sub is the regular instruction and the second is the flag setting
instruction. This required updating the code in the AND case.

Testing:

I ran a two stage bootstrap with this code.
Using the second stage compiler, I verified that the negation of an ADDS to SUBS
or vice versa is a valid optimization. Example V == -0x111111.

Reviewed By: dmgreen

Differential Revision: https://reviews.llvm.org/D118663
llvm/lib/Target/AArch64/AArch64InstrInfo.cpp
llvm/lib/Target/AArch64/AArch64InstrInfo.h
llvm/lib/Target/AArch64/AArch64MIPeepholeOpt.cpp
llvm/test/CodeGen/AArch64/addsub.ll
llvm/test/CodeGen/AArch64/arm64-instruction-mix-remarks.ll