[AArch64] Improve v8.1-A code-gen for atomic load-subtract
authorOliver Stannard <oliver.stannard@arm.com>
Mon, 12 Feb 2018 14:22:03 +0000 (14:22 +0000)
committerOliver Stannard <oliver.stannard@arm.com>
Mon, 12 Feb 2018 14:22:03 +0000 (14:22 +0000)
commit426991730495a6666a7ff8d085d40e3b8626ca3b
tree570b39e3beabf8b51f74358e328f1ed6ffaf4eab
parent39059d26306ae7b926eac66d4f90bcc999952b9a
[AArch64] Improve v8.1-A code-gen for atomic load-subtract

Armv8.1-A added an atomic load-add instruction, but not a load-subtract
instruction. Our current code-generation for atomic load-subtract always
inserts a NEG instruction to negate it's argument, even if it could be
folded into a constant or another instruction.

This adds lowering early in selection DAG to convert a load-subtract
operation into a subtract and a load-add, allowing the normal DAG
optimisations to work on it.

I've left the old tablegen patterns in because they are still needed for
global isel.

Some of the tests in this patch are copied from D35375 by Chad Rosier (which
was abandoned).

Differential revision: https://reviews.llvm.org/D42477

llvm-svn: 324892
llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
llvm/lib/Target/AArch64/AArch64ISelLowering.h
llvm/test/CodeGen/AArch64/atomic-ops-lse.ll