[PATCH] D107929: [GlobalISel] Narrow binops feeding into G_AND with a mask

Jessica Paquette via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Aug 11 13:33:45 PDT 2021


paquette created this revision.
paquette added reviewers: aemerson, arsenm.
Herald added subscribers: hiraditya, kristof.beyls, rovka.
paquette requested review of this revision.
Herald added a subscriber: wdng.
Herald added a project: LLVM.

This is a fairly common pattern:

  %mask = G_CONSTANT iN <mask val>
  %add = G_ADD %lhs, %rhs
  %and = G_AND %add, %mask

We have combines to eliminate G_AND with a mask that does nothing.

If we combined the above to this:

  %mask = G_CONSTANT iN <mask val>
  %narrow_lhs = G_TRUNC %lhs
  %narrow_rhs = G_TRUNC %rhs
  %narrow_add = G_ADD %narrow_lhs, %narrow_rhs
  %ext = G_ZEXT %narrow_add
  %and = G_AND %ext, %mask

We'd be able to take advantage of those combines using the trunc + zext.

For this to work (or be beneficial in the best case)

- The operation we want to narrow then widen must only be used by the G_AND
- The G_TRUNC + G_ZEXT must be free
- Performing the operation at a narrower width must not produce a different value than performing it at the original width *after masking.*

Example comparison between SDAG + GISel: https://godbolt.org/z/63jzb1Yvj

At -Os for AArch64, this is a 0.2% code size improvement on CTMark/pairlocalign.


https://reviews.llvm.org/D107929

Files:
  llvm/include/llvm/CodeGen/GlobalISel/CombinerHelper.h
  llvm/include/llvm/Target/GlobalISel/Combine.td
  llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp
  llvm/test/CodeGen/AArch64/GlobalISel/prelegalizer-combiner-narrow-binop-feeding-add.mir

-------------- next part --------------
A non-text attachment was scrubbed...
Name: D107929.365840.patch
Type: text/x-patch
Size: 15779 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210811/55c4bade/attachment.bin>


More information about the llvm-commits mailing list