Remove spurious mask operations from AArch64 add->compares on 16 and 8 bit values
authorLouis Gerbarg <lgg@apple.com>
Fri, 29 Aug 2014 21:00:22 +0000 (21:00 +0000)
committerLouis Gerbarg <lgg@apple.com>
Fri, 29 Aug 2014 21:00:22 +0000 (21:00 +0000)
commit6393b3a6777f9f64ce3041ed3302da4e22d1091b
tree63907e3144896f338d9d9228eda501e2a8371833
parent1469e29334cf6ac8a1d253c7c93303c179009843
Remove spurious mask operations from AArch64 add->compares on 16 and 8 bit values

This patch checks for DAG patterns that are an add or a sub followed by a
compare on 16 and 8 bit inputs. Since AArch64 does not support those types
natively they are legalized into 32 bit values, which means that mask operations
are inserted into the DAG to emulate overflow behaviour. In many cases those
masks do not change the result of the processing and just introduce a dependent
operation, often in the middle of a hot loop.

This patch detects the relevent DAG patterns and then tests to see if the
transforms are equivalent with and without the mask, removing the mask if
possible. The exact mechanism of this patch was discusses in
http://lists.cs.uiuc.edu/pipermail/llvmdev/2014-July/074444.html

There is a reasonably good chance there are missed oppurtunities due to similiar
(but not identical) DAG patterns that could be funneled into this test, adding
them should be simple if we see test cases.

Tests included.

rdar://13754426

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@216776 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Target/AArch64/AArch64ISelLowering.cpp
test/CodeGen/AArch64/and-mask-removal.ll [new file with mode: 0644]