diff options
author | Jessica Paquette <jpaquette@apple.com> | 2020-08-06 10:40:46 -0700 |
---|---|---|
committer | Jessica Paquette <jpaquette@apple.com> | 2020-08-19 10:20:57 -0700 |
commit | d25b12bdc307264e353f1a3c4ccd65c0b45b2f86 (patch) | |
tree | 509a78ee63b05af6706688e406b4a15ad0e693c4 /llvm/unittests/IR/ConstantsTest.cpp | |
parent | bcaa806a4747595116b538e8b75b12966e6607f6 (diff) | |
download | llvm-d25b12bdc307264e353f1a3c4ccd65c0b45b2f86.zip llvm-d25b12bdc307264e353f1a3c4ccd65c0b45b2f86.tar.gz llvm-d25b12bdc307264e353f1a3c4ccd65c0b45b2f86.tar.bz2 |
[GlobalISel] Add combine for (x & mask) -> x when (x & mask) == x
If we have a mask, and a value x, where (x & mask) == x, we can drop the AND
and just use x.
This is about a 0.4% geomean code size improvement on CTMark at -O3 for AArch64.
In AArch64, this is most useful post-legalization. Patterns like this often
show up when legalizing s1s, which must be extended to larger types.
e.g.
```
%cmp:_(s32) = G_ICMP ...
%and:_(s32) = G_AND %cmp, 1
```
Since G_ICMP only produces a single bit, there's no reason to mask it with the
G_AND.
Differential Revision: https://reviews.llvm.org/D85463
Diffstat (limited to 'llvm/unittests/IR/ConstantsTest.cpp')
0 files changed, 0 insertions, 0 deletions